WordPress.org

Make WordPress Core

Ticket #14662: 14662.2.diff

File 14662.2.diff, 4.5 KB (added by ryan, 9 years ago)

Populate ->ancestors, basic loop detection

  • wp-includes/post.php

     
    366366        } elseif ( is_object($post) && empty($post->filter) ) {
    367367                _get_post_ancestors($post);
    368368                $_post = sanitize_post($post, 'raw');
     369                if ( $cached_post = wp_cache_get($_post->ID, 'posts') ) {
     370                        if ( ! isset($cached_post->ancestors) )
     371                                wp_cache_delete($_post->ID, 'posts');
     372                }
     373                unset($cached_post);
    369374                wp_cache_add($post->ID, $_post, 'posts');
    370375        } else {
    371376                if ( is_object($post) )
     
    381386                        _get_post_ancestors($_post);
    382387                        $_post = sanitize_post($_post, 'raw');
    383388                        wp_cache_add($_post->ID, $_post, 'posts');
     389                } elseif ( ! isset($_post->ancestors) ) {
     390                        _get_post_ancestors($_post);
     391                        wp_cache_set($_post->ID, $_post, 'posts');
    384392                }
    385393        }
    386394
    387         if ($filter != 'raw')
     395        if ( $filter != 'raw' )
    388396                $_post = sanitize_post($_post, $filter);
    389397
    390398        if ( $output == OBJECT ) {
     
    22652273        else
    22662274                $post_parent = 0;
    22672275
     2276        // Ancestor circular dependency detection
    22682277        if ( !empty($post_ID) ) {
    22692278                if ( $post_parent == $post_ID ) {
    22702279                        // Post can't be its own parent
    22712280                        $post_parent = 0;
    22722281                } elseif ( !empty($post_parent) ) {
    2273                         $parent_post = get_post($post_parent);
    2274                         // Check for circular dependency
    2275                         if ( isset( $parent_post->post_parent ) && $parent_post->post_parent == $post_ID )
    2276                                 $post_parent = 0;
     2282                        $parent_id = $post_parent;
     2283                        $ancestors = array( $post_ID, $parent_id );
     2284                        while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $parent_id) ) ) {
     2285                                // Loop detection: If the ancestor has been seen before, set parent to 0 and break.
     2286                                if ( in_array($ancestor,  $ancestors) ) {
     2287                                        $post_parent = 0;
     2288                                        break;
     2289                                }
     2290                                $parent_id = $ancestors[] = $ancestor;
     2291                        }
     2292                        unset($ancestors);
    22772293                }
    22782294        }
    22792295
     
    30113027 * @return string Page URI.
    30123028 */
    30133029function get_page_uri($page) {
    3014         if ( ! is_object($page) )
    3015                 $page = get_page($page);
     3030        $page = get_page($page);
    30163031        $uri = $page->post_name;
    30173032
    30183033        // A page cannot be it's own parent.
    3019         if ( $page->post_parent == $page->ID )
     3034        if ( $page->post_parent == $page->ID || 0 == $page->post_parent )
    30203035                return $uri;
    30213036
    3022         while ($page->post_parent != 0) {
    3023                 $page = get_page($page->post_parent);
     3037        foreach ( $page->ancestors as $ancestor) {
     3038                $page = get_page($ancestor);
    30243039                $uri = $page->post_name . "/" . $uri;
    30253040        }
    30263041
     
    43274342        if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent )
    43284343                return;
    43294344
    4330         $id = $_post->ancestors[] = $_post->post_parent;
    4331         while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) {
     4345        $ancestor = $_post->post_parent;
     4346        while ( $ancestor ) {
    43324347                // Loop detection: If the ancestor has been seen before, break.
    43334348                if ( ( $ancestor == $_post->ID ) || in_array($ancestor,  $_post->ancestors) )
    43344349                        break;
    4335                 $id = $_post->ancestors[] = $ancestor;
     4350                $_post->ancestors[] = $ancestor;
     4351                if ( false === ( $ancestor = wp_cache_get($ancestor, 'posts') ) ) {
     4352                        $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $ancestor) );
     4353                } else {
     4354                        $ancestor = $ancestor->post_parent;
     4355                }
    43364356        }
    43374357}
    43384358
  • wp-admin/includes/default-list-tables.php

     
    333333                        $children_pages = array();
    334334
    335335                        foreach ( $pages as $page ) {
    336 
     336                                $page = get_post($page);
    337337                                // catch and repair bad pages
    338338                                if ( $page->post_parent == $page->ID ) {
    339339                                        $page->post_parent = 0;
     
    479479
    480480                                        if ( 0 == $level && (int) $post->post_parent > 0 ) {
    481481                                                //sent level 0 by accident, by default, or because we don't know the actual level
    482                                                 $find_main_page = (int) $post->post_parent;
    483                                                 while ( $find_main_page > 0 ) {
    484                                                         $parent = get_page( $find_main_page );
     482                                                $level = count($post->ancestors);
    485483
    486                                                         if ( is_null( $parent ) )
    487                                                                 break;
     484                                                $parent = get_page( $post->ancestors[$level] );
    488485
    489                                                         $level++;
    490                                                         $find_main_page = (int) $parent->post_parent;
    491 
    492                                                         if ( !isset( $parent_name ) )
    493                                                                 $parent_name = $parent->post_title;
    494                                                 }
     486                                                if ( !isset( $parent_name ) )
     487                                                        $parent_name = $parent->post_title;
    495488                                        }
    496489
    497490                                        $post->post_title = esc_html( $post->post_title );