--- a/wp/wp-admin/includes/class-wp-list-table.php Tue Oct 22 16:11:46 2019 +0200
+++ b/wp/wp-admin/includes/class-wp-list-table.php Tue Dec 15 13:49:49 2020 +0100
@@ -166,8 +166,8 @@
if ( empty( $this->modes ) ) {
$this->modes = array(
- 'list' => __( 'List View' ),
- 'excerpt' => __( 'Excerpt View' ),
+ 'list' => __( 'Compact view' ),
+ 'excerpt' => __( 'Extended view' ),
);
}
}
@@ -181,7 +181,7 @@
* @return mixed Property.
*/
public function __get( $name ) {
- if ( in_array( $name, $this->compat_fields ) ) {
+ if ( in_array( $name, $this->compat_fields, true ) ) {
return $this->$name;
}
}
@@ -196,7 +196,7 @@
* @return mixed Newly-set property.
*/
public function __set( $name, $value ) {
- if ( in_array( $name, $this->compat_fields ) ) {
+ if ( in_array( $name, $this->compat_fields, true ) ) {
return $this->$name = $value;
}
}
@@ -210,7 +210,7 @@
* @return bool Whether the property is set.
*/
public function __isset( $name ) {
- if ( in_array( $name, $this->compat_fields ) ) {
+ if ( in_array( $name, $this->compat_fields, true ) ) {
return isset( $this->$name );
}
}
@@ -223,7 +223,7 @@
* @param string $name Property to unset.
*/
public function __unset( $name ) {
- if ( in_array( $name, $this->compat_fields ) ) {
+ if ( in_array( $name, $this->compat_fields, true ) ) {
unset( $this->$name );
}
}
@@ -233,13 +233,13 @@
*
* @since 4.0.0
*
- * @param string $name Method to call.
- * @param array $arguments Arguments to pass when calling.
+ * @param string $name Method to call.
+ * @param array $arguments Arguments to pass when calling.
* @return mixed|bool Return value of the callback, false otherwise.
*/
public function __call( $name, $arguments ) {
- if ( in_array( $name, $this->compat_methods ) ) {
- return call_user_func_array( array( $this, $name ), $arguments );
+ if ( in_array( $name, $this->compat_methods, true ) ) {
+ return $this->$name( ...$arguments );
}
return false;
}
@@ -251,7 +251,7 @@
* @abstract
*/
public function ajax_user_can() {
- die( 'function WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' );
+ die( 'function WP_List_Table::ajax_user_can() must be overridden in a subclass.' );
}
/**
@@ -263,7 +263,7 @@
* @abstract
*/
public function prepare_items() {
- die( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' );
+ die( 'function WP_List_Table::prepare_items() must be overridden in a subclass.' );
}
/**
@@ -372,8 +372,10 @@
}
/**
- * Get an associative array ( id => link ) with the list
- * of views available on this table.
+ * Gets the list of views available on this table.
+ *
+ * The format is an associative array:
+ * - `'id' => 'link'`
*
* @since 3.1.0
*
@@ -384,7 +386,7 @@
}
/**
- * Display the list of views available on this table.
+ * Displays the list of views available on this table.
*
* @since 3.1.0
*/
@@ -396,7 +398,7 @@
* The dynamic portion of the hook name, `$this->screen->id`, refers
* to the ID of the current screen, usually a string.
*
- * @since 3.5.0
+ * @since 3.1.0
*
* @param string[] $views An array of available list table views.
*/
@@ -417,8 +419,10 @@
}
/**
- * Get an associative array ( option_name => option_title ) with the list
- * of bulk actions available on this table.
+ * Gets the list of bulk actions available on this table.
+ *
+ * The format is an associative array:
+ * - `'option_name' => 'option_title'`
*
* @since 3.1.0
*
@@ -429,7 +433,7 @@
}
/**
- * Display the bulk actions dropdown.
+ * Displays the bulk actions dropdown.
*
* @since 3.1.0
*
@@ -439,20 +443,20 @@
protected function bulk_actions( $which = '' ) {
if ( is_null( $this->_actions ) ) {
$this->_actions = $this->get_bulk_actions();
+
/**
- * Filters the list table Bulk Actions drop-down.
+ * Filters the list table bulk actions drop-down.
*
* The dynamic portion of the hook name, `$this->screen->id`, refers
* to the ID of the current screen, usually a string.
*
- * This filter can currently only be used to remove bulk actions.
- *
- * @since 3.5.0
+ * @since 3.1.0
*
* @param string[] $actions An array of the available bulk actions.
*/
- $this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions );
- $two = '';
+ $this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
+
+ $two = '';
} else {
$two = '2';
}
@@ -463,7 +467,7 @@
echo '<label for="bulk-action-selector-' . esc_attr( $which ) . '" class="screen-reader-text">' . __( 'Select bulk action' ) . '</label>';
echo '<select name="action' . $two . '" id="bulk-action-selector-' . esc_attr( $which ) . "\">\n";
- echo '<option value="-1">' . __( 'Bulk Actions' ) . "</option>\n";
+ echo '<option value="-1">' . __( 'Bulk actions' ) . "</option>\n";
foreach ( $this->_actions as $name => $title ) {
$class = 'edit' === $name ? ' class="hide-if-no-js"' : '';
@@ -478,11 +482,11 @@
}
/**
- * Get the current action selected from the bulk actions dropdown.
+ * Gets the current action selected from the bulk actions dropdown.
*
* @since 3.1.0
*
- * @return string|false The action name or False if no action was selected
+ * @return string|false The action name. False if no action was selected.
*/
public function current_action() {
if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) ) {
@@ -501,28 +505,39 @@
}
/**
- * Generate row actions div
+ * Generates the required HTML for a list of row action links.
*
* @since 3.1.0
*
* @param string[] $actions An array of action links.
* @param bool $always_visible Whether the actions should be always visible.
- * @return string
+ * @return string The HTML for the row actions.
*/
protected function row_actions( $actions, $always_visible = false ) {
$action_count = count( $actions );
- $i = 0;
if ( ! $action_count ) {
return '';
}
+ $mode = get_user_setting( 'posts_list_mode', 'list' );
+
+ if ( 'excerpt' === $mode ) {
+ $always_visible = true;
+ }
+
$out = '<div class="' . ( $always_visible ? 'row-actions visible' : 'row-actions' ) . '">';
+
+ $i = 0;
+
foreach ( $actions as $action => $link ) {
++$i;
- ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
- $out .= "<span class='$action'>$link$sep</span>";
+
+ $sep = ( $i < $action_count ) ? ' | ' : '';
+
+ $out .= "<span class='$action'>$link$sep</span>";
}
+
$out .= '</div>';
$out .= '<button type="button" class="toggle-row"><span class="screen-reader-text">' . __( 'Show more details' ) . '</span></button>';
@@ -531,14 +546,14 @@
}
/**
- * Display a monthly dropdown for filtering items
+ * Displays a dropdown for filtering items in the list table by month.
*
* @since 3.1.0
*
- * @global wpdb $wpdb
- * @global WP_Locale $wp_locale
+ * @global wpdb $wpdb WordPress database abstraction object.
+ * @global WP_Locale $wp_locale WordPress date and time locale object.
*
- * @param string $post_type
+ * @param string $post_type The post type.
*/
protected function months_dropdown( $post_type ) {
global $wpdb, $wp_locale;
@@ -580,8 +595,8 @@
*
* @since 3.7.0
*
- * @param object $months The months drop-down query results.
- * @param string $post_type The post type.
+ * @param object[] $months Array of the months drop-down query results.
+ * @param string $post_type The post type.
*/
$months = apply_filters( 'months_dropdown_results', $months, $post_type );
@@ -609,7 +624,7 @@
"<option %s value='%s'>%s</option>\n",
selected( $m, $year . $month, false ),
esc_attr( $arc_row->year . $month ),
- /* translators: 1: month name, 2: 4-digit year */
+ /* translators: 1: Month name, 2: 4-digit year. */
sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
);
}
@@ -619,7 +634,7 @@
}
/**
- * Display a view switcher
+ * Displays a view switcher.
*
* @since 3.1.0
*
@@ -631,13 +646,17 @@
<div class="view-switch">
<?php
foreach ( $this->modes as $mode => $title ) {
- $classes = array( 'view-' . $mode );
+ $classes = array( 'view-' . $mode );
+ $aria_current = '';
+
if ( $current_mode === $mode ) {
- $classes[] = 'current';
+ $classes[] = 'current';
+ $aria_current = ' aria-current="page"';
}
+
printf(
- "<a href='%s' class='%s' id='view-switch-$mode'><span class='screen-reader-text'>%s</span></a>\n",
- esc_url( add_query_arg( 'mode', $mode ) ),
+ "<a href='%s' class='%s' id='view-switch-$mode'$aria_current><span class='screen-reader-text'>%s</span></a>\n",
+ esc_url( remove_query_arg( 'attachment-filter', add_query_arg( 'mode', $mode ) ) ),
implode( ' ', $classes ),
$title
);
@@ -648,7 +667,7 @@
}
/**
- * Display a comment count bubble
+ * Displays a comment count bubble.
*
* @since 3.1.0
*
@@ -661,18 +680,39 @@
$approved_comments_number = number_format_i18n( $approved_comments );
$pending_comments_number = number_format_i18n( $pending_comments );
- $approved_only_phrase = sprintf( _n( '%s comment', '%s comments', $approved_comments ), $approved_comments_number );
- $approved_phrase = sprintf( _n( '%s approved comment', '%s approved comments', $approved_comments ), $approved_comments_number );
- $pending_phrase = sprintf( _n( '%s pending comment', '%s pending comments', $pending_comments ), $pending_comments_number );
+ $approved_only_phrase = sprintf(
+ /* translators: %s: Number of comments. */
+ _n( '%s comment', '%s comments', $approved_comments ),
+ $approved_comments_number
+ );
- // No comments at all.
+ $approved_phrase = sprintf(
+ /* translators: %s: Number of comments. */
+ _n( '%s approved comment', '%s approved comments', $approved_comments ),
+ $approved_comments_number
+ );
+
+ $pending_phrase = sprintf(
+ /* translators: %s: Number of comments. */
+ _n( '%s pending comment', '%s pending comments', $pending_comments ),
+ $pending_comments_number
+ );
+
if ( ! $approved_comments && ! $pending_comments ) {
+ // No comments at all.
printf(
'<span aria-hidden="true">—</span><span class="screen-reader-text">%s</span>',
__( 'No comments' )
);
- // Approved comments have different display depending on some conditions.
+ } elseif ( $approved_comments && 'trash' === get_post_status( $post_id ) ) {
+ // Don't link the comment bubble for a trashed post.
+ printf(
+ '<span class="post-com-count post-com-count-approved"><span class="comment-count-approved" aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></span>',
+ $approved_comments_number,
+ $pending_comments ? $approved_phrase : $approved_only_phrase
+ );
} elseif ( $approved_comments ) {
+ // Link the comment bubble to approved comments.
printf(
'<a href="%s" class="post-com-count post-com-count-approved"><span class="comment-count-approved" aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></a>',
esc_url(
@@ -688,6 +728,7 @@
$pending_comments ? $approved_phrase : $approved_only_phrase
);
} else {
+ // Don't link the comment bubble when there are no approved comments.
printf(
'<span class="post-com-count post-com-count-no-comments"><span class="comment-count comment-count-no-comments" aria-hidden="true">%s</span><span class="screen-reader-text">%s</span></span>',
$approved_comments_number,
@@ -720,7 +761,7 @@
}
/**
- * Get the current page number
+ * Gets the current page number.
*
* @since 3.1.0
*
@@ -737,7 +778,7 @@
}
/**
- * Get number of items to display on a single page
+ * Gets the number of items to display on a single page.
*
* @since 3.1.0
*
@@ -754,11 +795,22 @@
/**
* Filters the number of items to be displayed on each page of the list table.
*
- * The dynamic hook name, $option, refers to the `per_page` option depending
- * on the type of list table in use. Possible values include: 'edit_comments_per_page',
- * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page',
- * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page',
- * 'edit_{$post_type}_per_page', etc.
+ * The dynamic hook name, `$option`, refers to the `per_page` option depending
+ * on the type of list table in use. Possible filter names include:
+ *
+ * - `edit_comments_per_page`
+ * - `sites_network_per_page`
+ * - `site_themes_network_per_page`
+ * - `themes_network_per_page'`
+ * - `users_network_per_page`
+ * - `edit_post_per_page`
+ * - `edit_page_per_page'`
+ * - `edit_{$post_type}_per_page`
+ * - `edit_post_tag_per_page`
+ * - `edit_category_per_page`
+ * - `edit_{$taxonomy}_per_page`
+ * - `site_users_network_per_page`
+ * - `users_per_page`
*
* @since 2.9.0
*
@@ -768,7 +820,7 @@
}
/**
- * Display the pagination.
+ * Displays the pagination.
*
* @since 3.1.0
*
@@ -790,7 +842,11 @@
$this->screen->render_screen_reader_content( 'heading_pagination' );
}
- $output = '<span class="displaying-num">' . sprintf( _n( '%s item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . '</span>';
+ $output = '<span class="displaying-num">' . sprintf(
+ /* translators: %s: Number of items. */
+ _n( '%s item', '%s items', $total_items ),
+ number_format_i18n( $total_items )
+ ) . '</span>';
$current = $this->get_pagenum();
$removable_query_args = wp_removable_query_args();
@@ -804,20 +860,23 @@
$total_pages_before = '<span class="paging-input">';
$total_pages_after = '</span></span>';
- $disable_first = $disable_last = $disable_prev = $disable_next = false;
+ $disable_first = false;
+ $disable_last = false;
+ $disable_prev = false;
+ $disable_next = false;
- if ( $current == 1 ) {
+ if ( 1 == $current ) {
$disable_first = true;
$disable_prev = true;
}
- if ( $current == 2 ) {
+ if ( 2 == $current ) {
$disable_first = true;
}
- if ( $current == $total_pages ) {
+ if ( $total_pages == $current ) {
$disable_last = true;
$disable_next = true;
}
- if ( $current == $total_pages - 1 ) {
+ if ( $total_pages - 1 == $current ) {
$disable_last = true;
}
@@ -855,7 +914,12 @@
);
}
$html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );
- $page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after;
+ $page_links[] = $total_pages_before . sprintf(
+ /* translators: 1: Current page, 2: Total pages. */
+ _x( '%1$s of %2$s', 'paging' ),
+ $html_current_page,
+ $html_total_pages
+ ) . $total_pages_after;
if ( $disable_next ) {
$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">›</span>';
@@ -896,8 +960,10 @@
}
/**
- * Get a list of columns. The format is:
- * 'internal-name' => 'Title'
+ * Gets a list of columns.
+ *
+ * The format is:
+ * - `'internal-name' => 'Title'`
*
* @since 3.1.0
* @abstract
@@ -905,16 +971,16 @@
* @return array
*/
public function get_columns() {
- die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );
+ die( 'function WP_List_Table::get_columns() must be overridden in a subclass.' );
}
/**
- * Get a list of sortable columns. The format is:
- * 'internal-name' => 'orderby'
- * or
- * 'internal-name' => array( 'orderby', true )
+ * Gets a list of sortable columns.
*
- * The second format will make the initial sorting order be descending
+ * The format is:
+ * - `'internal-name' => 'orderby'`
+ * - `'internal-name' => array( 'orderby', 'asc' )` - The second element sets the initial sorting order.
+ * - `'internal-name' => array( 'orderby', true )` - The second element makes the initial order descending.
*
* @since 3.1.0
*
@@ -975,8 +1041,8 @@
$columns = get_column_headers( $this->screen );
$default = $this->get_default_primary_column_name();
- // If the primary column doesn't exist fall back to the
- // first non-checkbox column.
+ // If the primary column doesn't exist,
+ // fall back to the first non-checkbox column.
if ( ! isset( $columns[ $default ] ) ) {
$default = WP_List_Table::get_default_primary_column_name();
}
@@ -999,14 +1065,14 @@
}
/**
- * Get a list of all, hidden and sortable columns, with filter applied
+ * Gets a list of all, hidden and sortable columns, with filter applied.
*
* @since 3.1.0
*
* @return array
*/
protected function get_column_info() {
- // $_column_headers is already set / cached
+ // $_column_headers is already set / cached.
if ( isset( $this->_column_headers ) && is_array( $this->_column_headers ) ) {
// Back-compat for list tables that have been manually setting $_column_headers for horse reasons.
// In 4.3, we added a fourth argument for primary column.
@@ -1028,7 +1094,7 @@
* The dynamic portion of the hook name, `$this->screen->id`, refers
* to the ID of the current screen, usually a string.
*
- * @since 3.5.0
+ * @since 3.1.0
*
* @param array $sortable_columns An array of sortable columns.
*/
@@ -1055,7 +1121,7 @@
}
/**
- * Return number of visible columns
+ * Returns the number of visible columns.
*
* @since 3.1.0
*
@@ -1068,13 +1134,11 @@
}
/**
- * Print column headers, accounting for hidden and sortable columns.
+ * Prints column headers, accounting for hidden and sortable columns.
*
* @since 3.1.0
*
- * @staticvar int $cb_counter
- *
- * @param bool $with_id Whether to set the id attribute or not
+ * @param bool $with_id Whether to set the ID attribute or not
*/
public function print_column_headers( $with_id = true ) {
list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
@@ -1104,13 +1168,13 @@
foreach ( $columns as $column_key => $column_display_name ) {
$class = array( 'manage-column', "column-$column_key" );
- if ( in_array( $column_key, $hidden ) ) {
+ if ( in_array( $column_key, $hidden, true ) ) {
$class[] = 'hidden';
}
if ( 'cb' === $column_key ) {
$class[] = 'check-column';
- } elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) {
+ } elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ), true ) ) {
$class[] = 'num';
}
@@ -1122,16 +1186,26 @@
list( $orderby, $desc_first ) = $sortable[ $column_key ];
if ( $current_orderby === $orderby ) {
- $order = 'asc' === $current_order ? 'desc' : 'asc';
+ $order = 'asc' === $current_order ? 'desc' : 'asc';
+
$class[] = 'sorted';
$class[] = $current_order;
} else {
- $order = $desc_first ? 'desc' : 'asc';
+ $order = strtolower( $desc_first );
+
+ if ( ! in_array( $order, array( 'desc', 'asc' ), true ) ) {
+ $order = $desc_first ? 'desc' : 'asc';
+ }
+
$class[] = 'sortable';
- $class[] = $desc_first ? 'asc' : 'desc';
+ $class[] = 'desc' === $order ? 'asc' : 'desc';
}
- $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
+ $column_display_name = sprintf(
+ '<a href="%s"><span>%s</span><span class="sorting-indicator"></span></a>',
+ esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ),
+ $column_display_name
+ );
}
$tag = ( 'cb' === $column_key ) ? 'td' : 'th';
@@ -1147,7 +1221,7 @@
}
/**
- * Display the table
+ * Displays the table.
*
* @since 3.1.0
*/
@@ -1187,18 +1261,22 @@
}
/**
- * Get a list of CSS classes for the WP_List_Table table tag.
+ * Gets a list of CSS classes for the WP_List_Table table tag.
*
* @since 3.1.0
*
- * @return array List of CSS classes for the table tag.
+ * @return string[] Array of CSS classes for the table tag.
*/
protected function get_table_classes() {
- return array( 'widefat', 'fixed', 'striped', $this->_args['plural'] );
+ $mode = get_user_setting( 'posts_list_mode', 'list' );
+
+ $mode_class = esc_attr( 'table-view-' . $mode );
+
+ return array( 'widefat', 'fixed', 'striped', $mode_class, $this->_args['plural'] );
}
/**
- * Generate the table navigation above or below the table
+ * Generates the table navigation above or below the table
*
* @since 3.1.0
* @param string $which
@@ -1226,7 +1304,7 @@
}
/**
- * Extra controls to be displayed between bulk actions and pagination
+ * Extra controls to be displayed between bulk actions and pagination.
*
* @since 3.1.0
*
@@ -1235,7 +1313,7 @@
protected function extra_tablenav( $which ) {}
/**
- * Generate the tbody element for the list table.
+ * Generates the tbody element for the list table.
*
* @since 3.1.0
*/
@@ -1250,7 +1328,7 @@
}
/**
- * Generate the table rows
+ * Generates the table rows.
*
* @since 3.1.0
*/
@@ -1261,7 +1339,7 @@
}
/**
- * Generates content for a single row of the table
+ * Generates content for a single row of the table.
*
* @since 3.1.0
*
@@ -1285,11 +1363,11 @@
protected function column_cb( $item ) {}
/**
- * Generates the columns for a single row of the table
+ * Generates the columns for a single row of the table.
*
* @since 3.1.0
*
- * @param object $item The current item
+ * @param object $item The current item.
*/
protected function single_row_columns( $item ) {
list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
@@ -1300,7 +1378,7 @@
$classes .= ' has-row-actions column-primary';
}
- if ( in_array( $column_name, $hidden ) ) {
+ if ( in_array( $column_name, $hidden, true ) ) {
$classes .= ' hidden';
}
@@ -1344,14 +1422,15 @@
* @param object $item The item being acted upon.
* @param string $column_name Current column name.
* @param string $primary Primary column name.
- * @return string The row actions HTML, or an empty string if the current column is the primary column.
+ * @return string The row actions HTML, or an empty string
+ * if the current column is not the primary column.
*/
protected function handle_row_actions( $item, $column_name, $primary ) {
return $column_name === $primary ? '<button type="button" class="toggle-row"><span class="screen-reader-text">' . __( 'Show more details' ) . '</span></button>' : '';
}
/**
- * Handle an incoming ajax request (called from admin-ajax.php)
+ * Handles an incoming ajax request (called from admin-ajax.php)
*
* @since 3.1.0
*/
@@ -1371,6 +1450,7 @@
if ( isset( $this->_pagination_args['total_items'] ) ) {
$response['total_items_i18n'] = sprintf(
+ /* translators: Number of items. */
_n( '%s item', '%s items', $this->_pagination_args['total_items'] ),
number_format_i18n( $this->_pagination_args['total_items'] )
);
@@ -1384,7 +1464,9 @@
}
/**
- * Send required variables to JavaScript land
+ * Sends required variables to JavaScript land.
+ *
+ * @since 3.1.0
*/
public function _js_vars() {
$args = array(