WordPress.org

Make WordPress Core

Ticket #21309: 21309.4.diff

File 21309.4.diff, 13.1 KB (added by scribu, 3 years ago)
  • wp-includes/load.php

    diff --git wp-includes/load.php wp-includes/load.php
    index 94e6339..09e6067 100644
    function wp_start_object_cache() { 
    410410 
    411411        if ( function_exists( 'wp_cache_add_global_groups' ) ) { 
    412412                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); 
    413                 wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); 
     413                wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins', 'post_ancestors' ) ); 
    414414        } 
    415415} 
    416416 
  • wp-includes/nav-menu-template.php

    diff --git wp-includes/nav-menu-template.php wp-includes/nav-menu-template.php
    index 51321f5..2173087 100644
    function _wp_menu_item_classes_by_context( &$menu_items ) { 
    286286                                } 
    287287                        } 
    288288                } 
    289         } elseif ( ! empty( $queried_object->post_type ) && is_post_type_hierarchical( $queried_object->post_type ) ) { 
    290                 _get_post_ancestors( $queried_object ); 
    291289        } elseif ( ! empty( $queried_object->taxonomy ) && is_taxonomy_hierarchical( $queried_object->taxonomy ) ) { 
    292290                $term_hierarchy = _get_term_hierarchy( $queried_object->taxonomy ); 
    293291                $term_to_ancestor = array(); 
  • wp-includes/post-template.php

    diff --git wp-includes/post-template.php wp-includes/post-template.php
    index 0581a10..89ad4c4 100644
    class Walker_Page extends Walker { 
    10161016                $css_class = array('page_item', 'page-item-'.$page->ID); 
    10171017                if ( !empty($current_page) ) { 
    10181018                        $_current_page = get_page( $current_page ); 
    1019                         _get_post_ancestors($_current_page); 
    1020                         if ( isset($_current_page->ancestors) && in_array($page->ID, (array) $_current_page->ancestors) ) 
     1019                        if ( in_array( $page->ID, $_current_page->ancestors ) ) 
    10211020                                $css_class[] = 'current_page_ancestor'; 
    10221021                        if ( $page->ID == $current_page ) 
    10231022                                $css_class[] = 'current_page_item'; 
  • wp-includes/post.php

    diff --git wp-includes/post.php wp-includes/post.php
    index ea4f3d6..66c8a8c 100644
    function get_extended($post) { 
    375375 * @param int|object $post Post ID or post object. 
    376376 * @param string $output Optional, default is Object. Either OBJECT, ARRAY_A, or ARRAY_N. 
    377377 * @param string $filter Optional, default is raw. 
    378  * @return mixed Post data 
     378 * @return mixed Post data or null on failure 
    379379 */ 
    380380function &get_post(&$post, $output = OBJECT, $filter = 'raw') { 
    381         global $wpdb; 
    382381        $null = null; 
    383382 
    384         if ( empty($post) ) { 
    385                 if ( isset($GLOBALS['post']) ) 
    386                         $_post = & $GLOBALS['post']; 
    387                 else 
    388                         return $null; 
    389         } elseif ( is_object($post) && empty($post->filter) ) { 
    390                 _get_post_ancestors($post); 
    391                 $_post = sanitize_post($post, 'raw'); 
    392                 wp_cache_add($post->ID, $_post, 'posts'); 
    393         } elseif ( is_object($post) && 'raw' == $post->filter ) { 
     383        if ( empty( $post ) && isset( $GLOBALS['post'] ) ) { 
     384                $_post = & $GLOBALS['post']; 
     385        } elseif ( is_a( $post, 'WP_Post' ) ) { 
    394386                $_post = $post; 
     387        } elseif ( is_object( $post ) ) { 
     388                if ( empty( $post->filter ) ) { 
     389                        $_post = sanitize_post( $post, 'raw' ); 
     390                        wp_cache_add( $post->ID, $_post, 'posts' ); 
     391                        $_post = new WP_Post( $_post ); 
     392                } elseif ( 'raw' == $post->filter ) { 
     393                        $_post = new WP_Post( $post ); 
     394                } else { 
     395                        $_post = WP_Post::get_instance( $post->ID ); 
     396                } 
    395397        } else { 
    396                 if ( is_object($post) ) 
    397                         $post_id = $post->ID; 
    398                 else 
    399                         $post_id = $post; 
     398                $_post = WP_Post::get_instance( $post ); 
     399        } 
     400 
     401        if ( !$_post ) 
     402                return $null; 
     403 
     404        $_post->filter = $filter; 
     405 
     406        if ( $output == ARRAY_A ) { 
     407                $__post = $_post->to_array(); 
     408                return $__post; 
     409        } elseif ( $output == ARRAY_N ) { 
     410                $__post = array_values( $_post->to_array() ); 
     411                return $__post; 
     412        } 
     413 
     414        return $_post; 
     415} 
     416 
     417/** 
     418 * WordPress Post class. 
     419 * 
     420 * @since 3.5.0 
     421 * 
     422 * @property $ID; 
     423 * @property $post_author; 
     424 * @property $post_date; 
     425 * @property $post_date_gmt; 
     426 * @property $post_content; 
     427 * @property $post_title; 
     428 * @property $post_excerpt; 
     429 * @property $post_status; 
     430 * @property $comment_status; 
     431 * @property $ping_status; 
     432 * @property $post_password; 
     433 * @property $post_name; 
     434 * @property $to_ping; 
     435 * @property $pinged; 
     436 * @property $post_modified; 
     437 * @property $post_modified_gmt; 
     438 * @property $post_content_filtered; 
     439 * @property $post_parent; 
     440 * @property $guid; 
     441 * @property $menu_order; 
     442 * @property $post_type; 
     443 * @property $post_mime_type; 
     444 * @property $comment_count; 
     445 * @property $ancestors; 
     446 */ 
     447final class WP_Post { 
     448 
     449        private $post; 
     450 
     451        public $filter = 'raw'; 
     452 
     453        public static function get_instance( $post_id ) { 
     454                global $wpdb; 
    400455 
    401456                $post_id = (int) $post_id; 
    402                 if ( ! $_post = wp_cache_get($post_id, 'posts') ) { 
    403                         $_post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id)); 
     457                if ( !$post_id ) 
     458                        return false; 
     459 
     460                if ( ! $_post = wp_cache_get( $post_id, 'posts' ) ) { 
     461                        $_post = $wpdb->get_row( $wpdb->prepare( " 
     462                                SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1 
     463                        ", $post_id ) ); 
     464 
    404465                        if ( ! $_post ) 
    405                                 return $null; 
    406                         _get_post_ancestors($_post); 
    407                         $_post = sanitize_post($_post, 'raw'); 
    408                         wp_cache_add($_post->ID, $_post, 'posts'); 
     466                                return false; 
     467 
     468                        $_post = sanitize_post( $_post, 'raw' ); 
     469                        wp_cache_add( $_post->ID, $_post, 'posts' ); 
    409470                } 
     471 
     472                return new WP_Post( $_post ); 
    410473        } 
    411474 
    412         if ($filter != 'raw') 
    413                 $_post = sanitize_post($_post, $filter); 
     475        public function __construct( $post ) { 
     476                $this->post = $post; 
     477        } 
    414478 
    415         if ( $output == OBJECT ) { 
    416                 return $_post; 
    417         } elseif ( $output == ARRAY_A ) { 
    418                 $__post = get_object_vars($_post); 
    419                 return $__post; 
    420         } elseif ( $output == ARRAY_N ) { 
    421                 $__post = array_values(get_object_vars($_post)); 
    422                 return $__post; 
    423         } else { 
    424                 return $_post; 
     479        public function to_array() { 
     480                $post = get_object_vars( $this->post ); 
     481                $post['ancestors'] = array(); 
     482                $post['filter'] = $this->filter; 
     483 
     484                return $post; 
     485        } 
     486 
     487        public function __isset( $key ) { 
     488                if ( 'ancestors' == $key ) 
     489                        return true; 
     490 
     491                if ( isset( $this->post->$key ) ) 
     492                        return true; 
     493 
     494                return metadata_exists( 'post', $this->post->ID, $key ); 
     495        } 
     496 
     497        public function &__get( $key ) { 
     498                if ( 'ancestors' == $key ) { 
     499                        $value = get_post_ancestors( $this ); 
     500                } elseif ( isset( $this->post->$key ) ) { 
     501                        $value = $this->post->$key; 
     502                } else { 
     503                        $value = get_post_meta( $this->post->ID, $key, true ); 
     504                } 
     505 
     506                if ( $this->filter ) { 
     507                        $value = sanitize_post_field( $key, $value, $this->post->ID, $this->filter ); 
     508                } 
     509 
     510                return $value; 
     511        } 
     512 
     513        public function __set( $key, $value ) { 
     514                if ( 'ancestors' == $key ) 
     515                        return; 
     516 
     517                $this->post->$key = $value; 
     518        } 
     519 
     520        public function __unset( $key ) { 
     521                unset( $this->post->$key ); 
    425522        } 
    426523} 
    427524 
    function &get_post(&$post, $output = OBJECT, $filter = 'raw') { 
    433530 * @param int|object $post Post ID or post object 
    434531 * @return array Ancestor IDs or empty array if none are found. 
    435532 */ 
    436 function get_post_ancestors($post) { 
    437         $post = get_post($post); 
     533function get_post_ancestors( $post ) { 
     534        if ( !$post ) 
     535                return false; 
    438536 
    439         if ( ! isset( $post->ancestors ) ) 
    440                 _get_post_ancestors( $post ); 
     537        if ( ! $ancestors = wp_cache_get( $post->ID, 'post_ancestors' ) ) { 
     538                $ancestors = array(); 
    441539 
    442         if ( ! empty( $post->ancestors ) ) 
    443                 return $post->ancestors; 
     540                if ( !empty( $post->post_parent ) && $post->ID != $post->post_parent ) { 
     541                        $id = $ancestors[] = $post->post_parent; 
    444542 
    445         return array(); 
     543                        while ( $ancestor = get_post( $id ) ) { 
     544                                // Loop detection: If the ancestor has been seen before, break. 
     545                                if ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors ) ) 
     546                                        break; 
     547 
     548                                $id = $ancestors[] = $ancestor->post_parent; 
     549                        } 
     550                } 
     551 
     552                wp_cache_add( $post->ID, $ancestors, 'post_ancestors' ); 
     553        } 
     554 
     555        return $ancestors; 
    446556} 
    447557 
    448558/** 
    function get_post_ancestors($post) { 
    460570 * @param string $field Post field name 
    461571 * @param id $post Post ID 
    462572 * @param string $context Optional. How to filter the field. Default is display. 
    463  * @return WP_Error|string Value in post field or WP_Error on failure 
     573 * @return bool|string False on failure or returns the value in post field 
    464574 */ 
    465575function get_post_field( $field, $post, $context = 'display' ) { 
    466         $post = (int) $post; 
    467576        $post = get_post( $post ); 
    468577 
    469         if ( is_wp_error($post) ) 
    470                 return $post; 
    471  
    472         if ( !is_object($post) ) 
     578        if ( !$post ) 
    473579                return ''; 
    474580 
    475581        if ( !isset($post->$field) ) 
    function get_page_uri($page) { 
    33483454                $page = get_page($page); 
    33493455        $uri = $page->post_name; 
    33503456 
    3351         // A page cannot be it's own parent. 
    3352         if ( $page->post_parent == $page->ID ) 
    3353                 return $uri; 
    3354  
    3355         while ($page->post_parent != 0) { 
    3356                 $page = get_page($page->post_parent); 
    3357                 $uri = $page->post_name . "/" . $uri; 
     3457        foreach ( $page->ancestors as $parent ) { 
     3458                $uri = get_page($parent)->post_name . "/" . $uri; 
    33583459        } 
    33593460 
    33603461        return $uri; 
    function &get_pages($args = '') { 
    34063507        $key = md5( serialize( compact(array_keys($defaults)) ) ); 
    34073508        if ( $cache = wp_cache_get( 'get_pages', 'posts' ) ) { 
    34083509                if ( is_array($cache) && isset( $cache[ $key ] ) ) { 
    3409                         $pages = apply_filters('get_pages', $cache[ $key ], $r ); 
    3410                         return $pages; 
     3510                        // Convert to WP_Post instances 
     3511                        $pages = array_map( 'get_post', $cache[ $key ] ); 
     3512 
     3513                        return apply_filters( 'get_pages', $pages, $r ); 
    34113514                } 
    34123515        } 
    34133516 
    function &get_pages($args = '') { 
    35813684        $cache[ $key ] = $pages; 
    35823685        wp_cache_set( 'get_pages', $cache, 'posts' ); 
    35833686 
     3687        // Convert to WP_Post instances 
     3688        $pages = array_map( 'get_post', $pages ); 
     3689 
    35843690        $pages = apply_filters('get_pages', $pages, $r); 
    35853691 
    35863692        return $pages; 
    function _save_post_hook( $post_id, $post ) { 
    46124718} 
    46134719 
    46144720/** 
    4615  * Retrieve post ancestors and append to post ancestors property. 
    4616  * 
    4617  * Will only retrieve ancestors once, if property is already set, then nothing 
    4618  * will be done. If there is not a parent post, or post ID and post parent ID 
    4619  * are the same then nothing will be done. 
    4620  * 
    4621  * The parameter is passed by reference, so nothing needs to be returned. The 
    4622  * property will be updated and can be referenced after the function is 
    4623  * complete. The post parent will be an ancestor and the parent of the post 
    4624  * parent will be an ancestor. There will only be two ancestors at the most. 
    4625  * 
    4626  * @since 2.5.0 
    4627  * @access private 
    4628  * @uses $wpdb 
    4629  * 
    4630  * @param object $_post Post data. 
    4631  * @return null When nothing needs to be done. 
    4632  */ 
    4633 function _get_post_ancestors(&$_post) { 
    4634         global $wpdb; 
    4635  
    4636         if ( isset($_post->ancestors) ) 
    4637                 return; 
    4638  
    4639         $_post->ancestors = array(); 
    4640  
    4641         if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent ) 
    4642                 return; 
    4643  
    4644         $id = $_post->ancestors[] = (int) $_post->post_parent; 
    4645         while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) { 
    4646                 // Loop detection: If the ancestor has been seen before, break. 
    4647                 if ( ( $ancestor == $_post->ID ) || in_array($ancestor,  $_post->ancestors) ) 
    4648                         break; 
    4649                 $id = $_post->ancestors[] = (int) $ancestor; 
    4650         } 
    4651 } 
    4652  
    4653 /** 
    46544721 * Determines which fields of posts are to be saved in revisions. 
    46554722 * 
    46564723 * Does two things. If passed a post *array*, it will return a post array ready 
  • wp-includes/query.php

    diff --git wp-includes/query.php wp-includes/query.php
    index e976cdf..e8c5454 100644
    class WP_Query { 
    26432643 
    26442644                        if ( $ids ) { 
    26452645                                $this->set_found_posts( $q, $limits ); 
    2646  
    26472646                                _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); 
    2648  
    2649                                 $this->posts = array_map( 'get_post', $ids ); 
     2647                                $this->posts = $ids; 
    26502648                        } else { 
    2651                                 $this->found_posts = $this->max_num_pages = 0; 
    26522649                                $this->posts = array(); 
     2650                                $this->found_posts = $this->max_num_pages = 0; 
    26532651                        } 
    26542652                } else { 
    26552653                        $this->posts = $wpdb->get_results( $this->request ); 
     2654                        update_post_caches( $this->posts, 'any', $q['update_post_term_cache'], $q['update_post_meta_cache'] ); 
    26562655                        $this->set_found_posts( $q, $limits ); 
    26572656                } 
    26582657 
     2658                // Convert to WP_Post objects 
     2659                $this->posts = array_map( 'get_post', $this->posts ); 
     2660 
    26592661                // Raw results filter. Prior to status checks. 
    26602662                if ( !$q['suppress_filters'] ) 
    26612663                        $this->posts = apply_filters_ref_array('posts_results', array( $this->posts, &$this ) ); 
  • wp-includes/taxonomy.php

    diff --git wp-includes/taxonomy.php wp-includes/taxonomy.php
    index 8ea976f..e3f0a16 100644
    function get_ancestors($object_id = 0, $object_type = '') { 
    32073207                        $ancestors[] = (int) $term->parent; 
    32083208                        $term = get_term($term->parent, $object_type); 
    32093209                } 
    3210         } elseif ( null !== get_post_type_object( $object_type ) ) { 
    3211                 $object = get_post($object_id); 
    3212                 if ( ! is_wp_error( $object ) && isset( $object->ancestors ) && is_array( $object->ancestors ) ) 
    3213                         $ancestors = $object->ancestors; 
    3214                 else { 
    3215                         while ( ! is_wp_error($object) && ! empty( $object->post_parent ) && ! in_array( $object->post_parent, $ancestors ) ) { 
    3216                                 $ancestors[] = (int) $object->post_parent; 
    3217                                 $object = get_post($object->post_parent); 
    3218                         } 
    3219                 } 
     3210        } elseif ( post_type_exists( $object_type ) ) { 
     3211                $ancestors = get_post_ancestors($object_id); 
    32203212        } 
    32213213 
    32223214        return apply_filters('get_ancestors', $ancestors, $object_id, $object_type);