JezK
Edit File: schedule-list-table.php
<?php /** * List table for cron schedules. */ namespace Crontrol; use Crontrol\Schedule\Schedule; use Crontrol\Schedule\CoreSchedule; require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; /** * Cron schedule list table class. */ class Schedule_List_Table extends \WP_List_Table { /** * Array of Schedule instances for the current page. * * @var array<string,Schedule> */ public $items; /** * Constructor. */ public function __construct() { parent::__construct( array( 'singular' => 'crontrol-schedule', 'plural' => 'crontrol-schedules', 'ajax' => false, 'screen' => 'crontrol-schedules', ) ); } /** * Gets the name of the primary column. * * @return string The name of the primary column. */ #[\Override] protected function get_primary_column_name() { return 'crontrol_name'; } /** * Prepares the list table items and arguments. * * @return void */ #[\Override] public function prepare_items() { $schedules = \Crontrol\Schedule\get(); $count = count( $schedules ); $this->items = $schedules; $this->set_pagination_args( array( 'total_items' => $count, 'per_page' => -1, 'total_pages' => 1, ) ); } /** * Returns an array of column names for the table. * * @return array<string,string> Array of column names keyed by their ID. */ #[\Override] public function get_columns() { return array( 'crontrol_icon' => '', 'crontrol_name' => esc_html__( 'Internal Name', 'wp-crontrol' ), 'crontrol_interval' => esc_html__( 'Interval', 'wp-crontrol' ), 'crontrol_display' => esc_html__( 'Display Name', 'wp-crontrol' ), ); } /** * Returns an array of CSS class names for the table. * * @return array<int,string> Array of class names. */ #[\Override] protected function get_table_classes() { return array( 'widefat', 'fixed', 'striped', 'table-view-list', $this->_args['plural'] ); } /** * Generates and displays row action links for the table. * * @param Schedule $schedule The schedule for the current row. * @param string $column_name Current column name. * @param string $primary Primary column name. * @return string The row actions HTML. */ #[\Override] protected function handle_row_actions( $schedule, $column_name, $primary ) { if ( $primary !== $column_name ) { return ''; } $links = array(); if ( $schedule->persistent() ) { $links[] = "<span class='crontrol-in-use'>" . esc_html( $schedule->get_persistent_message() ) . '</span>'; return $this->row_actions( $links ); } if ( ! $schedule->deletable() ) { // Permission-based: no message shown return $this->row_actions( $links ); } $link = add_query_arg( array( 'page' => 'wp-crontrol-schedules', 'crontrol_action' => 'delete-schedule', 'crontrol_id' => rawurlencode( $schedule->name ), ), admin_url( 'options-general.php' ) ); $link = wp_nonce_url( $link, 'crontrol-delete-schedule_' . $schedule->name ); $links[] = "<span class='delete'><a href='" . esc_url( $link ) . "'>" . esc_html__( 'Delete', 'wp-crontrol' ) . '</a></span>'; return $this->row_actions( $links ); } /** * Returns the output for the icon cell of a table row. * * @param Schedule $schedule The schedule for the current row. */ protected function column_crontrol_icon( Schedule $schedule ): string { if ( $schedule instanceof CoreSchedule ) { return sprintf( '<span class="dashicons dashicons-wordpress" aria-hidden="true"></span> <span class="screen-reader-text">%s</span>', esc_html( $schedule->get_persistent_message() ) ); } return ''; } /** * Returns the output for the schedule name cell of a table row. * * @param Schedule $schedule The schedule for the current row. */ protected function column_crontrol_name( Schedule $schedule ): string { return esc_html( $schedule->name ); } /** * Returns the output for the interval cell of a table row. * * @param Schedule $schedule The schedule for the current row. */ protected function column_crontrol_interval( Schedule $schedule ): string { $interval = sprintf( '%s (%s)', esc_html( "{$schedule->interval}" ), esc_html( interval( $schedule->interval, true ) ) ); if ( $schedule->is_too_frequent() ) { $interval .= sprintf( '<span class="status-crontrol-warning"><br><span class="dashicons dashicons-warning" aria-hidden="true"></span> %s</span>', sprintf( /* translators: 1: The name of the configuration constant, 2: The value of the configuration constant */ esc_html__( 'This interval is less than the %1$s constant which is set to %2$s seconds. Events that use it may not run on time.', 'wp-crontrol' ), '<code>WP_CRON_LOCK_TIMEOUT</code>', intval( WP_CRON_LOCK_TIMEOUT ) ) ); } return $interval; } /** * Returns the output for the display name cell of a table row. * * @param Schedule $schedule The schedule for the current row. */ protected function column_crontrol_display( Schedule $schedule ): string { return esc_html( $schedule->display ); } /** * Outputs a message when there are no items to show in the table. * * @return void */ #[\Override] public function no_items() { esc_html_e( 'There are no schedules.', 'wp-crontrol' ); } }