WordPress.org

Make WordPress Core

Ticket #3614: manage pages diff.patch

File manage pages diff.patch, 5.9 KB (added by pirom, 8 years ago)

Solves the freezing, crashing or extreme sluggishness of Page Management view for WP 2.3 (Trunk) [Patch Version 5772]

  • edit-pages.php

     
    1111                        'publish' => array(__('Published'), __('Published pages')) 
    1212                ); 
    1313 
    14  
    1514$post_status_label = _c('Pages|manage pages header'); 
    1615$post_status_q = ''; 
    1716if ( isset($_GET['post_status']) && in_array( $_GET['post_status'], array_keys($post_stati) ) ) { 
     
    2120 
    2221?> 
    2322 
     23<?php 
     24//Added functions to speed up Page Management page load 
     25function &lp_get_pages($_pages) { 
     26 
     27    // permalink stuff 
     28    global $wp_rewrite; 
     29    $pagestruct = $wp_rewrite->get_page_permastruct(); 
     30    $home = get_settings('home'); 
     31 
     32    $pages = array(); 
     33    $deferred = array(); 
     34 
     35    foreach ($_pages as $k=>$page) { 
     36 
     37        $id = $page['id']; 
     38        $parent = $page['post_parent']; 
     39 
     40        $_pages[$k]['root_page'] = empty($parent); 
     41        $_pages[$k]['children'] = array(); 
     42 
     43        if (!empty($parent) && $parent != $id) { 
     44            if (isset($pages[$parent])) 
     45                $pages[$parent]['children'][$page['menu_order'] . $page['post_title']] =& $_pages[$k]; 
     46            else 
     47                $deferred[$id] = array($page['menu_order'] . $page['post_title'], $parent); 
     48        } 
     49        $pages[$id] =& $_pages[$k]; 
     50 
     51    } 
     52 
     53    foreach ($deferred as $id=>$details) { 
     54        list($title, $parent) = $details; 
     55        if (isset($pages[$parent])) 
     56            $pages[$parent]['children'][$title] =& $pages[$id]; 
     57        else 
     58            $pages[$id]['parent'] = ''; 
     59    } 
     60 
     61    /* 
     62    Add unpublished pages to the begining of the page list 
     63    */ 
     64    $temp_pages_list = $pages; 
     65    $unpublished_pages = array(); 
     66    $array_offset = 0; 
     67    foreach ($temp_pages_list as $id => $page) 
     68    { 
     69        if ($page['post_date'] == '0000-00-00 00:00:00') 
     70        { 
     71            $slice = array_splice($pages, $array_offset, 1); 
     72            $unpublished_pages[] = $slice[0]; 
     73        } 
     74 
     75        $array_offset++; 
     76    } 
     77    $unpublished_pages = array_reverse($unpublished_pages); 
     78    foreach ($unpublished_pages as $unpublished_page) 
     79          array_unshift($pages, $unpublished_page); 
     80     
     81 
     82    foreach ($pages as $id=>$page) { 
     83 
     84        $parent = $page['post_parent']; 
     85 
     86        if (empty($pagestruct)) { 
     87            $link = "$home/?page_id=$id"; 
     88        } else { 
     89            $uri = urldecode($page['post_name']); 
     90            if ($parent != $id) { 
     91                while (!empty($parent) && isset($pages[$parent])) { 
     92                    $uri = urldecode($pages[$parent]['post_name']) . "/$uri"; 
     93                    $parent = $pages[$parent]['post_parent']; 
     94                } 
     95            } 
     96            $link = $home . '/' . str_replace('%pagename%', $uri, $pagestruct) . '/'; 
     97        } 
     98        $pages[$id]['permalink'] = apply_filters('page_link', $link, $id); 
     99    } 
     100 
     101    return $pages; 
     102} 
     103 
     104function recurse(&$tree, $padding='', $index=0) { 
     105 
     106    foreach ($tree as $post) { 
     107        if (empty($padding) && !empty($post['post_parent'])) 
     108            continue; 
     109        $index++; 
     110        $title = wp_specialchars($post['post_title']); 
     111        $id = $post['id']; 
     112        $class = (($index%2)==1) ? '' : 'alternate'; 
     113 
     114        ?> 
     115        <tr id='page-<?php echo $id; ?>' class='<?php echo $class; ?>'> 
     116            <th scope="row" style="text-align: center"><?php echo $id; ?></th> 
     117            <td> 
     118              <?php echo $padding; ?><?php echo $title; ?> 
     119            </td> 
     120            <td><?php echo $post['display_name']; ?></td> 
     121            <td><?php if ( '0000-00-00 00:00:00' ==$post['post_date'] ) _e('Unpublished'); else echo mysql2date( __('Y-m-d g:i a'), $post['post_modified'] ); ?></td> 
     122            <td><a href="<?php if ('0000-00-00 00:00:00' ==$post['post_date']) echo "/?page_id=$id"; else echo $post['permalink']; ?>" rel="permalink" class="edit"><?php _e( 'View' ); ?></a></td> 
     123            <td><?php if ( current_user_can( 'edit_page', $id ) ) { echo "<a href='page.php?action=edit&amp;post=$id' class='edit'>" . __( 'Edit' ) . "</a>"; } ?></td> 
     124            <td><?php if ( current_user_can( 'delete_page', $id ) ) { echo "<a href='" . wp_nonce_url( "page.php?action=delete&amp;post=$id", 'delete-page_' . $id ) .  "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . js_escape(sprintf( __("You are about to delete the '%s' page.\n'OK' to delete, 'Cancel' to stop." ), $title ) ) . "' );\">" . __( 'Delete' ) . "</a>"; } ?></td> 
     125        </tr> 
     126        <?php 
     127 
     128        ksort($post['children']); 
     129        $index = recurse($post['children'], $padding . '&#8212; ', $index); 
     130    } 
     131    return $index; 
     132} 
     133 
     134?>             
     135 
    24136<div class="wrap"> 
    25137 
    26138<h2><?php 
     
    64176 
    65177<br style="clear:both;" /> 
    66178 
    67 <?php 
    68 wp("post_type=page&orderby=menu_order&what_to_show=posts$post_status_q&posts_per_page=-1&posts_per_archive_page=-1&order=asc"); 
     179<?php        
    69180 
    70 $all = !( $h2_search || $post_status_q ); 
     181$all = !( $h2_search || $post_status_q );        
     182   
     183if ($_GET['s']) { 
     184    wp("post_type=page&orderby=menu_order&what_to_show=posts$post_status_q&posts_per_page=-1&posts_per_archive_page=-1&order=asc"); 
     185} 
     186else { 
     187    $q = "SELECT p.id, p.post_name, p.post_title, p.post_parent, p.menu_order, p.post_modified, p.post_date, " . 
     188                "u.display_name " . 
     189                "FROM $wpdb->posts p " . 
     190                "INNER JOIN $wpdb->users u ON p.post_author = u.id " . 
     191                "WHERE p.post_type='page' " . 
     192                "ORDER BY p.menu_order ASC , p.post_date DESC"; 
    71193 
     194    $posts =& lp_get_pages($wpdb->get_results($q,  ARRAY_A)); 
     195 
     196 
    72197if ($posts) { 
    73198?> 
    74199<table class="widefat">  
     
    82207  </tr> 
    83208  </thead> 
    84209  <tbody id="the-list"> 
    85 <?php page_rows(0, 0, $posts, $all); ?> 
     210<?php  
     211    if ( $all == false ) 
     212    { 
     213        page_rows(0, 0, $posts, $all); 
     214    } 
     215    else 
     216    { 
     217        //page_rows(); 
     218 
     219        //Added to speed up Page Management page load 
     220        recurse($posts); 
     221    } 
     222?> 
    86223  </tbody> 
    87224</table> 
    88225