WordPress.org

Make WordPress Core

Ticket #13611: 13611.diff

File 13611.diff, 2.6 KB (added by chrisbliss18, 5 years ago)

Patch to fix infinite loop issues and repair broken entries

  • wp-admin/includes/template.php

    diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php
    index ec1d6c4..31748bb 100644
    a b function display_page_row( $page, $level = 0 ) { 
    14891489        if ( 0 == $level && (int)$page->post_parent > 0 ) { 
    14901490                //sent level 0 by accident, by default, or because we don't know the actual level 
    14911491                $find_main_page = (int)$page->post_parent; 
     1492                $used_page_ids = array($page->ID); 
    14921493                while ( $find_main_page > 0 ) { 
    14931494                        $parent = get_page($find_main_page); 
    14941495 
    1495                         if ( is_null($parent) ) 
     1496                        if ( is_null($parent) || $parent->post_type !== $page->post_type || in_array( $parent->ID, $used_page_ids ) ) 
    14961497                                break; 
    14971498 
     1499                        $used_page_ids[] = $parent->ID; 
     1500 
    14981501                        $level++; 
    14991502                        $find_main_page = (int)$parent->post_parent; 
    15001503 
    function page_rows($pages, $pagenum = 1, $per_page = 20) { 
    16761679 
    16771680                $top_level_pages = array(); 
    16781681                $children_pages = array(); 
     1682                $page_ids = array(); 
     1683 
     1684                foreach ( $pages as $page ) 
     1685                        $page_ids[] = $page->ID; 
    16791686 
    16801687                foreach ( $pages as $page ) { 
    16811688 
    16821689                        // catch and repair bad pages 
    1683                         if ( $page->post_parent == $page->ID ) { 
     1690                        if ( $page->post_parent == $page->ID || ! in_array( $page->post_parent, $page_ids ) ) { 
    16841691                                $page->post_parent = 0; 
    16851692                                $wpdb->update($wpdb->posts, array('post_parent' => 0), array('ID' => $page->ID)); 
    16861693                                clean_page_cache( $page->ID ); 
  • wp-includes/post.php

    diff --git a/wp-includes/post.php b/wp-includes/post.php
    index f43099a..19c1f22 100644
    a b function get_page_uri($page) { 
    30333033        if ( $page->post_parent == $page->ID ) 
    30343034                return $uri; 
    30353035 
     3036        $used_page_ids = array( $page->ID ); 
     3037 
    30363038        while ($page->post_parent != 0) { 
    3037                 $page = get_page($page->post_parent); 
     3039                $parent = get_page($page->post_parent); 
     3040 
     3041                if(in_array($parent->ID, $used_page_ids) || $parent->post_type !== $page->post_type) 
     3042                        break; 
     3043 
     3044                $used_page_ids[] = $parent->ID; 
     3045                $page = $parent; 
     3046 
    30383047                $uri = $page->post_name . "/" . $uri; 
    30393048        } 
    30403049 
    function _get_post_ancestors(&$_post) { 
    43224331                return; 
    43234332 
    43244333        $id = $_post->ancestors[] = $_post->post_parent; 
    4325         while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) { 
     4334        while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d AND post_type = %s LIMIT 1", $id, $_post->post_type) ) ) { 
     4335                if ( in_array( $ancestor, $_post->ancestors ) ) 
     4336                        break; 
    43264337                if ( $id == $ancestor ) 
    43274338                        break; 
    43284339                $id = $_post->ancestors[] = $ancestor; 
     4340                $count++; 
    43294341        } 
    43304342} 
    43314343