$fields post_id, account, ok, message, link. */ public static function log( string $event, array $fields = array() ): void { $post_id = isset( $fields['post_id'] ) ? (int) $fields['post_id'] : null; $entry = array( 'id' => wp_generate_uuid4(), 'time' => time(), 'post_id' => $post_id, 'event' => $event, 'account' => isset( $fields['account'] ) && is_string( $fields['account'] ) ? $fields['account'] : null, 'ok' => (bool) ( $fields['ok'] ?? true ), 'message' => isset( $fields['message'] ) && is_string( $fields['message'] ) ? $fields['message'] : '', 'link' => Refract_Response::safe_url( $fields['link'] ?? null ), ); $entries = self::stored(); array_unshift( $entries, $entry ); self::save( $entries ); } /** * The newest entries, with the post's current title and edit link. * * @param bool $problems_only Only entries that weren't OK. * @param int $limit How many. * @return list> */ public static function entries( bool $problems_only = false, int $limit = 100 ): array { $entries = array(); foreach ( self::stored() as $entry ) { if ( $problems_only && $entry['ok'] ) { continue; } $post = null === $entry['post_id'] ? null : get_post( (int) $entry['post_id'] ); $entries[] = array( 'id' => $entry['id'], 'time' => $entry['time'], 'post_id' => $entry['post_id'], 'post_title' => null === $post ? '' : html_entity_decode( get_the_title( $post ), ENT_QUOTES, 'UTF-8' ), 'post_url' => null === $post ? null : get_edit_post_link( $post, 'raw' ), 'event' => $entry['event'], 'account' => $entry['account'], 'ok' => $entry['ok'], 'message' => $entry['message'], 'link' => Refract_Response::safe_url( $entry['link'] ), ); if ( count( $entries ) >= $limit ) { break; } } return $entries; } /** * Drops entries older than 30 days. */ public static function prune(): void { self::save( self::stored() ); } /** * The stored entries. * * @return list */ private static function stored(): array { $stored = get_option( self::OPTION, array() ); return is_array( $stored ) ? array_values( $stored ) : array(); } /** * Saves entries, keeping the last 30 days and at most 500. * * @param list $entries Newest first. */ private static function save( array $entries ): void { $since = time() - self::KEEP_SECONDS; $entries = array_values( array_filter( $entries, static fn ( array $entry ): bool => $entry['time'] >= $since ) ); update_option( self::OPTION, array_slice( $entries, 0, self::MAX_ENTRIES ), false ); } }