__('Matching run', 'wpbr-bulk-replace'), 'replace_file' => __('Replace file', 'wpbr-bulk-replace'), 'new_attachment' => __('New attachment', 'wpbr-bulk-replace'), 'add_missing' => __('Add missing file', 'wpbr-bulk-replace'), 'rollback' => __('Roll back', 'wpbr-bulk-replace'), 'verify' => __('Mark verified', 'wpbr-bulk-replace'), 'delete_backup' => __('Delete backup', 'wpbr-bulk-replace'), 'combine' => __('Combine files', 'wpbr-bulk-replace'), 'import' => __('Reviewer import', 'wpbr-bulk-replace'), 'undo_import' => __('Undo import', 'wpbr-bulk-replace'), 'upload' => __('Upload', 'wpbr-bulk-replace'), 'scan' => __('Pick up files', 'wpbr-bulk-replace'), ); if (isset($labels[$action])) return $labels[$action]; // Unknown action: readable rather than absent. return ucfirst(str_replace('_', ' ', (string) $action)); } /** * Display label for a logged result. */ function wpbr_log_result_label($result) { $labels = array( 'success' => __('Succeeded', 'wpbr-bulk-replace'), 'skipped' => __('Skipped', 'wpbr-bulk-replace'), 'failed' => __('Failed', 'wpbr-bulk-replace'), 'info' => __('Info', 'wpbr-bulk-replace'), ); return isset($labels[$result]) ? $labels[$result] : ucfirst(str_replace('_', ' ', (string) $result)); } function wpbr_render_log_page() { if (!current_user_can('manage_options')) return; global $wpdb; if (isset($_POST['wpbr_action']) && $_POST['wpbr_action'] === 'clear_log' && check_admin_referer('wpbr_clear_log')) { $scope = isset($_POST['scope']) ? sanitize_text_field(wp_unslash($_POST['scope'])) : 'all'; if ($scope === 'all') { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Plugin-owned table with no WordPress API; a write, and nothing here is cached, so there is nothing to invalidate. $wpdb->query("DELETE FROM {$wpdb->prefix}wpbr_log"); echo "
" . esc_html__('Log cleared.', 'wpbr-bulk-replace') . "
" . esc_html(sprintf( /* translators: %s is a number of days. */ _n('Entries older than %s day removed.', 'Entries older than %s days removed.', $days, 'wpbr-bulk-replace'), number_format_i18n($days) )) . "
" . esc_html__('Every file the tool has processed, rolled back, verified or cleaned up, plus matching runs and reviewer imports. Kept indefinitely until you clear it, so a run can be checked long after the on-screen log has gone.', 'wpbr-bulk-replace') . "
"; $n_fail = isset($counts['failed']) ? $counts['failed']->n : 0; $n_skip = isset($counts['skipped']) ? $counts['skipped']->n : 0; $n_ok = isset($counts['success']) ? $counts['success']->n : 0; // The counts are a summary of the table below, so they are announced as one. echo ""; // The same three counts, as the shared status badge: a glyph and the word, so colour is never the only signal. wpbr_status_badge_print('ok', sprintf( /* translators: %s is a count of log entries. */ _n('%s succeeded', '%s succeeded', $n_ok, 'wpbr-bulk-replace'), number_format_i18n($n_ok) )); echo " "; wpbr_status_badge_print('warn', sprintf( /* translators: %s is a count of log entries. */ _n('%s skipped', '%s skipped', $n_skip, 'wpbr-bulk-replace'), number_format_i18n($n_skip) )); echo " "; wpbr_status_badge_print('error', sprintf( /* translators: %s is a count of log entries. */ _n('%s failed', '%s failed', $n_fail, 'wpbr-bulk-replace'), number_format_i18n($n_fail) )); echo "
"; wpbr_inline_open('style'); echo ".wpbr-log-pill{display:inline-block;padding:3px 10px;border-radius:12px;font-size:12px;font-weight:500;margin-right:6px;}"; echo ".wpbr-log-row-failed td{background:#fdf4f4 !important;}"; wpbr_inline_close(); // Filters. Each select had no accessible name at all, so a screen reader // announced three unlabelled combo boxes in a row. echo ""; if (!$rows) { echo "" . esc_html__('Nothing logged yet.', 'wpbr-bulk-replace') . "
| " . esc_html__('When', 'wpbr-bulk-replace') . " | "; echo "" . esc_html__('Action', 'wpbr-bulk-replace') . " | "; echo "" . esc_html__('Result', 'wpbr-bulk-replace') . " | "; echo "" . esc_html__('File', 'wpbr-bulk-replace') . " | "; echo "" . esc_html__('Details', 'wpbr-bulk-replace') . " | "; echo "" . esc_html__('By', 'wpbr-bulk-replace') . " | "; echo "
|---|---|---|---|---|---|
| ".esc_html(mysql2date($datetime_format, $r->created_at))." | "; echo "".esc_html(wpbr_log_action_label($r->action))." | "; $kinds = array('success' => 'ok', 'skipped' => 'warn', 'failed' => 'error', 'info' => 'info'); echo ""; wpbr_status_badge_print(isset($kinds[$r->result]) ? $kinds[$r->result] : 'idle', wpbr_log_result_label($r->result)); echo " | "; echo "".esc_html($r->filename)." | "; echo "".esc_html($r->message)." | "; echo ""; if (!empty($r->actor) && wpbr_actor_label($r->actor) !== '') { echo "created_by))."\">".esc_html(wpbr_actor_label($r->actor)).""; } else { echo $r->created_by ? "created_by))."\">".esc_html(wpbr_user_label($r->created_by))."" : '—'; } echo " | "; echo "