Make WordPress Core

Ticket #7286: 7286_pages.diff

File 7286_pages.diff, 3.6 KB (added by hailin, 18 years ago)

revised patch

  • C:/xampp/htdocs/wordpress_trunk/wp-admin/includes/template.php

     
    525525}
    526526
    527527/*
    528  * displays pages in hierarchical order
     528 * displays pages in hierarchical order with paging support
    529529 */
    530 
    531530function page_rows($pages, $pagenum = 1, $per_page = 20) {
    532531        $level = 0;
    533532
     
    538537                        return false;
    539538        }
    540539
    541         // splice pages into two parts: those without parent and those with parent
    542         $top_level_pages = array();
    543         $children_pages  = array();
    544 
    545         // If searching, ignore hierarchy and treat everything as top level, otherwise split
    546         // into top level and children
     540        /*
     541         * arrange pages into two parts: top level pages and children_pages
     542         * children_pages is two dimensional array, eg.
     543         * children_pages[10][] contains all sub-pages whose parent is 10.
     544         * It only takes O(N) to arrange this and it takes O(1) for subsequent lookup operations
     545         * If searching, ignore hierarchy and treat everything as top level
     546         */
    547547        if ( empty($_GET['s']) )  {
     548               
     549                $top_level_pages = array();
     550                $children_pages  = array();
     551               
    548552                foreach ( $pages as $page ) {
     553                       
    549554                        // catch and repair bad pages
    550555                        if ( $page->post_parent == $page->ID ) {
    551556                                $page->post_parent = 0;
     
    556561                        if ( 0 == $page->post_parent )
    557562                                $top_level_pages[] = $page;
    558563                        else
    559                                 $children_pages[] = $page;
     564                                $children_pages[ $page->post_parent ][] = $page;
    560565                }
    561566
    562567                $pages = &$top_level_pages;
     
    565570        $count = 0;
    566571        $start = ($pagenum - 1) * $per_page;
    567572        $end = $start + $per_page;
     573       
    568574        foreach ( $pages as $page ) {
    569575                if ( $count >= $end )
    570576                        break;
    571577
    572                 $i++;
    573 
    574578                if ( $count >= $start )
    575579                        echo "\t" . display_page_row( $page, $level );
    576580
     
    579583                if ( isset($children_pages) )
    580584                        _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
    581585        }
     586       
     587        // if it is the last pagenum and there are orphaned pages, display them with paging as well
     588        if ( isset($children_pages) && $count < $end ){
     589                foreach( $children_pages as $orphans ){
     590                        foreach ( $orphans as $op ) {
     591                                if ( $count >= $end )
     592                                        break;
     593                                if ( $count >= $start )
     594                                        echo "\t" . display_page_row( $op, 0 );
     595                                $count++;
     596                        }
     597                }
     598        }
    582599}
    583600
    584 function _page_rows( $pages, &$count, $parent, $level, $pagenum, $per_page ) {
     601/*
     602 * Given a top level page ID, display the nested hierarchy of sub-pages
     603 * together with paging support
     604 */
     605function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
     606       
     607        if ( ! isset( $children_pages[$parent] ) )
     608                return;
     609               
    585610        $start = ($pagenum - 1) * $per_page;
    586611        $end = $start + $per_page;
    587         $i = -1;
    588         foreach ( $pages as $page ) {
     612       
     613        foreach ( $children_pages[$parent] as $page ) {
     614               
    589615                if ( $count >= $end )
    590616                        break;
    591 
    592                 $i++;
    593 
    594                 if ( $page->post_parent != $parent )
    595                         continue;
    596 
     617                       
    597618                // If the page starts in a subtree, print the parents.
    598619                if ( $count == $start && $page->post_parent > 0 ) {
    599620                        $my_parents = array();
     
    614635
    615636                if ( $count >= $start )
    616637                        echo "\t" . display_page_row( $page, $level );
    617 
    618                 unset($pages[$i]); // Prune the working set             
     638                       
    619639                $count++;
    620640
    621                 _page_rows( $pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
     641                _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
    622642        }
     643       
     644        unset( $children_pages[$parent] ); //required in order to keep track of orphans
    623645}
    624646
    625647function user_row( $user_object, $style = '', $role = '' ) {