Make WordPress Core


Ignore:
Timestamp:
10/08/2021 12:36:18 AM (5 years ago)
Author:
SergeyBiryukov
Message:

Taxonomy: Populate the WP_Terms_List_Table::$items property in ::prepare_items().

This allows the parent WP_List_Table::has_items() method to work as expected, and the override in the child class can now be removed. It also makes the class more consistent with other list table classes.

As a result of this change, the "Bulk actions" dropdown is no longer unnecessarily displayed if there are no terms.

Follow-up to [15491], [17025], [17026].

Props mattoakley, swissspidy, audrasjb, SergeyBiryukov.
Fixes #54181.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-wp-terms-list-table.php

    r51737 r51896  
    7878         */
    7979        public function prepare_items() {
    80                 $tags_per_page = $this->get_items_per_page( 'edit_' . $this->screen->taxonomy . '_per_page' );
    81 
    82                 if ( 'post_tag' === $this->screen->taxonomy ) {
     80                $taxonomy = $this->screen->taxonomy;
     81
     82                $tags_per_page = $this->get_items_per_page( "edit_{$taxonomy}_per_page" );
     83
     84                if ( 'post_tag' === $taxonomy ) {
    8385                        /**
    8486                         * Filters the number of terms displayed per page for the Tags list table.
     
    99101                         */
    100102                        $tags_per_page = apply_filters_deprecated( 'tagsperpage', array( $tags_per_page ), '2.8.0', 'edit_tags_per_page' );
    101                 } elseif ( 'category' === $this->screen->taxonomy ) {
     103                } elseif ( 'category' === $taxonomy ) {
    102104                        /**
    103105                         * Filters the number of terms displayed per page for the Categories list table.
     
    113115
    114116                $args = array(
    115                         'search' => $search,
    116                         'page'   => $this->get_pagenum(),
    117                         'number' => $tags_per_page,
     117                        'taxonomy'   => $taxonomy,
     118                        'search'     => $search,
     119                        'page'       => $this->get_pagenum(),
     120                        'number'     => $tags_per_page,
     121                        'hide_empty' => 0,
    118122                );
    119123
     
    126130                }
    127131
     132                $args['offset'] = ( $args['page'] - 1 ) * $args['number'];
     133
     134                // Save the values because 'number' and 'offset' can be subsequently overridden.
    128135                $this->callback_args = $args;
     136
     137                if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {
     138                        // We'll need the full set of terms then.
     139                        $args['number'] = 0;
     140                        $args['offset'] = $args['number'];
     141                }
     142
     143                $this->items = get_terms( $args );
    129144
    130145                $this->set_pagination_args(
     
    132147                                'total_items' => wp_count_terms(
    133148                                        array(
    134                                                 'taxonomy' => $this->screen->taxonomy,
     149                                                'taxonomy' => $taxonomy,
    135150                                                'search'   => $search,
    136151                                        )
     
    139154                        )
    140155                );
    141         }
    142 
    143         /**
    144          * @return bool
    145          */
    146         public function has_items() {
    147                 // @todo Populate $this->items in prepare_items().
    148                 return true;
    149156        }
    150157
     
    217224                $taxonomy = $this->screen->taxonomy;
    218225
    219                 $args = wp_parse_args(
    220                         $this->callback_args,
    221                         array(
    222                                 'taxonomy'   => $taxonomy,
    223                                 'page'       => 1,
    224                                 'number'     => 20,
    225                                 'search'     => '',
    226                                 'hide_empty' => 0,
    227                         )
    228                 );
    229 
    230                 $page = $args['page'];
    231 
    232                 // Set variable because $args['number'] can be subsequently overridden.
    233                 $number = $args['number'];
    234 
    235                 $offset         = ( $page - 1 ) * $number;
    236                 $args['offset'] = $offset;
     226                $number = $this->callback_args['number'];
     227                $offset = $this->callback_args['offset'];
    237228
    238229                // Convert it to table rows.
    239230                $count = 0;
    240231
    241                 if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {
    242                         // We'll need the full set of terms then.
    243                         $args['number'] = 0;
    244                         $args['offset'] = $args['number'];
    245                 }
    246 
    247                 $terms = get_terms( $args );
    248 
    249                 if ( empty( $terms ) || ! is_array( $terms ) ) {
     232                if ( empty( $this->items ) || ! is_array( $this->items ) ) {
    250233                        echo '<tr class="no-items"><td class="colspanchange" colspan="' . $this->get_column_count() . '">';
    251234                        $this->no_items();
     
    254237                }
    255238
    256                 if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {
    257                         if ( ! empty( $args['search'] ) ) {// Ignore children on searches.
     239                if ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $this->callback_args['orderby'] ) ) {
     240                        if ( ! empty( $this->callback_args['search'] ) ) {// Ignore children on searches.
    258241                                $children = array();
    259242                        } else {
     
    265248                         * Skip it for non-hierarchical taxonomies for performance sake.
    266249                         */
    267                         $this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );
     250                        $this->_rows( $taxonomy, $this->items, $children, $offset, $number, $count );
    268251                } else {
    269                         foreach ( $terms as $term ) {
     252                        foreach ( $this->items as $term ) {
    270253                                $this->single_row( $term );
    271254                        }
Note: See TracChangeset for help on using the changeset viewer.