--- a/wp/wp-admin/includes/class-wp-list-table.php Tue Dec 15 15:52:01 2020 +0100
+++ b/wp/wp-admin/includes/class-wp-list-table.php Wed Sep 21 18:19:35 2022 +0200
@@ -43,7 +43,7 @@
* The current screen.
*
* @since 3.1.0
- * @var object
+ * @var WP_Screen
*/
protected $screen;
@@ -396,7 +396,7 @@
* Filters the list of available list table views.
*
* The dynamic portion of the hook name, `$this->screen->id`, refers
- * to the ID of the current screen, usually a string.
+ * to the ID of the current screen.
*
* @since 3.1.0
*
@@ -419,12 +419,29 @@
}
/**
- * Gets the list of bulk actions available on this table.
+ * Retrieves the list of bulk actions available for this table.
+ *
+ * The format is an associative array where each element represents either a top level option value and label, or
+ * an array representing an optgroup and its options.
+ *
+ * For a standard option, the array element key is the field value and the array element value is the field label.
+ *
+ * For an optgroup, the array element key is the label and the array element value is an associative array of
+ * options as above.
*
- * The format is an associative array:
- * - `'option_name' => 'option_title'`
+ * Example:
+ *
+ * [
+ * 'edit' => 'Edit',
+ * 'delete' => 'Delete',
+ * 'Change State' => [
+ * 'feature' => 'Featured',
+ * 'sale' => 'On Sale',
+ * ]
+ * ]
*
* @since 3.1.0
+ * @since 5.6.0 A bulk action can now contain an array of options in order to create an optgroup.
*
* @return array
*/
@@ -445,14 +462,15 @@
$this->_actions = $this->get_bulk_actions();
/**
- * Filters the list table bulk actions drop-down.
+ * Filters the items in the bulk actions menu of the list table.
*
* The dynamic portion of the hook name, `$this->screen->id`, refers
- * to the ID of the current screen, usually a string.
+ * to the ID of the current screen.
*
* @since 3.1.0
+ * @since 5.6.0 A bulk action can now contain an array of options in order to create an optgroup.
*
- * @param string[] $actions An array of the available bulk actions.
+ * @param array $actions An array of the available bulk actions.
*/
$this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
@@ -469,10 +487,21 @@
echo '<select name="action' . $two . '" id="bulk-action-selector-' . esc_attr( $which ) . "\">\n";
echo '<option value="-1">' . __( 'Bulk actions' ) . "</option>\n";
- foreach ( $this->_actions as $name => $title ) {
- $class = 'edit' === $name ? ' class="hide-if-no-js"' : '';
+ foreach ( $this->_actions as $key => $value ) {
+ if ( is_array( $value ) ) {
+ echo "\t" . '<optgroup label="' . esc_attr( $key ) . '">' . "\n";
+
+ foreach ( $value as $name => $title ) {
+ $class = ( 'edit' === $name ) ? ' class="hide-if-no-js"' : '';
- echo "\t" . '<option value="' . $name . '"' . $class . '>' . $title . "</option>\n";
+ echo "\t\t" . '<option value="' . esc_attr( $name ) . '"' . $class . '>' . $title . "</option>\n";
+ }
+ echo "\t" . "</optgroup>\n";
+ } else {
+ $class = ( 'edit' === $key ) ? ' class="hide-if-no-js"' : '';
+
+ echo "\t" . '<option value="' . esc_attr( $key ) . '"' . $class . '>' . $value . "</option>\n";
+ }
}
echo "</select>\n";
@@ -497,10 +526,6 @@
return $_REQUEST['action'];
}
- if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) {
- return $_REQUEST['action2'];
- }
-
return false;
}
@@ -570,25 +595,37 @@
return;
}
- $extra_checks = "AND post_status != 'auto-draft'";
- if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) {
- $extra_checks .= " AND post_status != 'trash'";
- } elseif ( isset( $_GET['post_status'] ) ) {
- $extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] );
- }
+ /**
+ * Filters to short-circuit performing the months dropdown query.
+ *
+ * @since 5.7.0
+ *
+ * @param object[]|false $months 'Months' drop-down results. Default false.
+ * @param string $post_type The post type.
+ */
+ $months = apply_filters( 'pre_months_dropdown_query', false, $post_type );
- $months = $wpdb->get_results(
- $wpdb->prepare(
- "
- SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
- FROM $wpdb->posts
- WHERE post_type = %s
- $extra_checks
- ORDER BY post_date DESC
- ",
- $post_type
- )
- );
+ if ( ! is_array( $months ) ) {
+ $extra_checks = "AND post_status != 'auto-draft'";
+ if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) {
+ $extra_checks .= " AND post_status != 'trash'";
+ } elseif ( isset( $_GET['post_status'] ) ) {
+ $extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] );
+ }
+
+ $months = $wpdb->get_results(
+ $wpdb->prepare(
+ "
+ SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
+ FROM $wpdb->posts
+ WHERE post_type = %s
+ $extra_checks
+ ORDER BY post_date DESC
+ ",
+ $post_type
+ )
+ );
+ }
/**
* Filters the 'Months' drop-down results.
@@ -608,7 +645,7 @@
$m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
?>
- <label for="filter-by-date" class="screen-reader-text"><?php _e( 'Filter by date' ); ?></label>
+ <label for="filter-by-date" class="screen-reader-text"><?php echo get_post_type_object( $post_type )->labels->filter_by_date; ?></label>
<select name="m" id="filter-by-date">
<option<?php selected( $m, 0 ); ?> value="0"><?php _e( 'All dates' ); ?></option>
<?php
@@ -947,7 +984,7 @@
if ( ! empty( $infinite_scroll ) ) {
$pagination_links_class .= ' hide-if-js';
}
- $output .= "\n<span class='$pagination_links_class'>" . join( "\n", $page_links ) . '</span>';
+ $output .= "\n<span class='$pagination_links_class'>" . implode( "\n", $page_links ) . '</span>';
if ( $total_pages ) {
$page_class = $total_pages < 2 ? ' one-page' : '';
@@ -1044,7 +1081,7 @@
// 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();
+ $default = self::get_default_primary_column_name();
}
/**
@@ -1065,7 +1102,7 @@
}
/**
- * Gets 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
*
@@ -1074,8 +1111,13 @@
protected function get_column_info() {
// $_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.
+ /*
+ * Backward compatibility for `$_column_headers` format prior to WordPress 4.3.
+ *
+ * In WordPress 4.3 the primary column name was added as a fourth item in the
+ * column headers property. This ensures the primary column name is included
+ * in plugins setting the property directly in the three item format.
+ */
$column_headers = array( array(), array(), array(), $this->get_primary_column_name() );
foreach ( $this->_column_headers as $key => $value ) {
$column_headers[ $key ] = $value;
@@ -1092,7 +1134,7 @@
* Filters the list table sortable columns for a specific screen.
*
* The dynamic portion of the hook name, `$this->screen->id`, refers
- * to the ID of the current screen, usually a string.
+ * to the ID of the current screen.
*
* @since 3.1.0
*
@@ -1213,7 +1255,7 @@
$id = $with_id ? "id='$column_key'" : '';
if ( ! empty( $class ) ) {
- $class = "class='" . join( ' ', $class ) . "'";
+ $class = "class='" . implode( ' ', $class ) . "'";
}
echo "<$tag $scope $id $class>$column_display_name</$tag>";
@@ -1343,7 +1385,7 @@
*
* @since 3.1.0
*
- * @param object $item The current item
+ * @param object|array $item The current item
*/
public function single_row( $item ) {
echo '<tr>';
@@ -1352,13 +1394,13 @@
}
/**
- * @param object $item
+ * @param object|array $item
* @param string $column_name
*/
protected function column_default( $item, $column_name ) {}
/**
- * @param object $item
+ * @param object|array $item
*/
protected function column_cb( $item ) {}
@@ -1367,7 +1409,7 @@
*
* @since 3.1.0
*
- * @param object $item The current item.
+ * @param object|array $item The current item.
*/
protected function single_row_columns( $item ) {
list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
@@ -1383,8 +1425,8 @@
}
// Comments column uses HTML in the display name with screen reader text.
- // Instead of using esc_attr(), we strip tags to get closer to a user-friendly string.
- $data = 'data-colname="' . wp_strip_all_tags( $column_display_name ) . '"';
+ // Strip tags to get closer to a user-friendly string.
+ $data = 'data-colname="' . esc_attr( wp_strip_all_tags( $column_display_name ) ) . '"';
$attributes = "class='$classes' $data";
@@ -1419,9 +1461,9 @@
*
* @since 4.3.0
*
- * @param object $item The item being acted upon.
- * @param string $column_name Current column name.
- * @param string $primary Primary column name.
+ * @param object|array $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 not the primary column.
*/