Make WordPress Core


Ignore:
Timestamp:
03/11/2015 08:45:17 PM (11 years ago)
Author:
johnbillion
Message:

Introduce a new algorithm for displaying a hierarchical list of post objects in the WP_Posts_List_Table. This reduces processing time, reduces database queries, and substantially reduces memory use on sites with a high number of Pages.

Props nofearinc, rodrigosprimo, nacin, johnbillion.
Fixes #15459

File:
1 edited

Legend:

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

    r31513 r31730  
    8787        }
    8888
     89        /**
     90         * Sets whether the table layout should be hierarchical or not.
     91         *
     92         * @since 4.2.0
     93         *
     94         * @param bool $display Whether the table layout should be hierarchical.
     95         */
     96        public function set_hierarchical_display( $display ) {
     97                $this->hierarchical_display = $display;
     98        }
     99
    89100        public function ajax_user_can() {
    90101                return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts );
     
    96107                $avail_post_stati = wp_edit_posts_query();
    97108
    98                 $this->hierarchical_display = ( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' == $wp_query->query['orderby'] );
     109                $this->set_hierarchical_display( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' == $wp_query->query['orderby'] );
    99110
    100111                $total_items = $this->hierarchical_display ? $wp_query->post_count : $wp_query->found_posts;
     
    479490                $start = ( $pagenum - 1 ) * $per_page;
    480491                $end = $start + $per_page;
     492                $to_display = array();
    481493
    482494                foreach ( $pages as $page ) {
     
    485497
    486498                        if ( $count >= $start ) {
    487                                 echo "\t";
    488                                 $this->single_row( $page, $level );
     499                                $to_display[$page->ID] = $level;
    489500                        }
    490501
     
    492503
    493504                        if ( isset( $children_pages ) )
    494                                 $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
     505                                $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
    495506                }
    496507
     
    503514
    504515                                        if ( $count >= $start ) {
    505                                                 echo "\t";
    506                                                 $this->single_row( $op, 0 );
     516                                                $to_display[$op->ID] = 0;
    507517                                        }
    508518
     
    510520                                }
    511521                        }
     522                }
     523
     524                $ids = array_keys( $to_display );
     525                _prime_post_caches( $ids );
     526
     527                if ( ! isset( $GLOBALS['post'] ) ) {
     528                        $GLOBALS['post'] = array_shift( $ids );
     529                }
     530
     531                foreach ( $to_display as $page_id => $level ) {
     532                        echo "\t";
     533                        $this->single_row( $page_id, $level );
    512534                }
    513535        }
     
    518540         *
    519541         * @since 3.1.0 (Standalone function exists since 2.6.0)
     542         * @since 4.2.0 Added the `$to_display` parameter.
    520543         *
    521544         * @param array $children_pages
     
    525548         * @param int $pagenum
    526549         * @param int $per_page
     550         * @param array $to_display list of pages to be displayed
    527551         */
    528         private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
     552        private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page, &$to_display ) {
    529553
    530554                if ( ! isset( $children_pages[$parent] ) )
     
    544568                                $my_parent = $page->post_parent;
    545569                                while ( $my_parent ) {
    546                                         $my_parent = get_post( $my_parent );
     570                                        // Get the ID from the list or the attribute if my_parent is an object
     571                                        $parent_id = $my_parent;
     572                                        if ( is_object( $my_parent ) ) {
     573                                                $parent_id = $my_parent->ID;
     574                                        }
     575
     576                                        $my_parent = get_post( $parent_id );
    547577                                        $my_parents[] = $my_parent;
    548578                                        if ( !$my_parent->post_parent )
     
    552582                                $num_parents = count( $my_parents );
    553583                                while ( $my_parent = array_pop( $my_parents ) ) {
    554                                         echo "\t";
    555                                         $this->single_row( $my_parent, $level - $num_parents );
     584                                        $to_display[$my_parent->ID] = $level - $num_parents;
    556585                                        $num_parents--;
    557586                                }
     
    559588
    560589                        if ( $count >= $start ) {
    561                                 echo "\t";
    562                                 $this->single_row( $page, $level );
     590                                $to_display[$page->ID] = $level;
    563591                        }
    564592
    565593                        $count++;
    566594
    567                         $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
     595                        $this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
    568596                }
    569597
     
    580608
    581609                $global_post = get_post();
     610
     611                $post = get_post( $post );
     612
    582613                $GLOBALS['post'] = $post;
    583614                setup_postdata( $post );
Note: See TracChangeset for help on using the changeset viewer.