WordPress.org

Make WordPress Core

Ticket #22176: 22176.3.patch

File 22176.3.patch, 8.0 KB (added by spacedmonkey, 22 months ago)
  • src/wp-includes/class-wp-query.php

     
    472472         * @access public
    473473         * @var bool
    474474         */
    475          public $thumbnails_cached = false;
     475        public $thumbnails_cached = false;
    476476
    477477        /**
    478478         * Cached list of search stopwords.
     
    574574        public function fill_query_vars($array) {
    575575                $keys = array(
    576576                        'error'
    577                         , 'm'
    578                         , 'p'
    579                         , 'post_parent'
    580                         , 'subpost'
    581                         , 'subpost_id'
    582                         , 'attachment'
    583                         , 'attachment_id'
    584                         , 'name'
    585                         , 'static'
    586                         , 'pagename'
    587                         , 'page_id'
    588                         , 'second'
    589                         , 'minute'
    590                         , 'hour'
    591                         , 'day'
    592                         , 'monthnum'
    593                         , 'year'
    594                         , 'w'
    595                         , 'category_name'
    596                         , 'tag'
    597                         , 'cat'
    598                         , 'tag_id'
    599                         , 'author'
    600                         , 'author_name'
    601                         , 'feed'
    602                         , 'tb'
    603                         , 'paged'
    604                         , 'meta_key'
    605                         , 'meta_value'
    606                         , 'preview'
    607                         , 's'
    608                         , 'sentence'
    609                         , 'title'
    610                         , 'fields'
    611                         , 'menu_order'
    612                         , 'embed'
     577                , 'm'
     578                , 'p'
     579                , 'post_parent'
     580                , 'subpost'
     581                , 'subpost_id'
     582                , 'attachment'
     583                , 'attachment_id'
     584                , 'name'
     585                , 'static'
     586                , 'pagename'
     587                , 'page_id'
     588                , 'second'
     589                , 'minute'
     590                , 'hour'
     591                , 'day'
     592                , 'monthnum'
     593                , 'year'
     594                , 'w'
     595                , 'category_name'
     596                , 'tag'
     597                , 'cat'
     598                , 'tag_id'
     599                , 'author'
     600                , 'author_name'
     601                , 'feed'
     602                , 'tb'
     603                , 'paged'
     604                , 'meta_key'
     605                , 'meta_value'
     606                , 'preview'
     607                , 's'
     608                , 'sentence'
     609                , 'title'
     610                , 'fields'
     611                , 'menu_order'
     612                , 'embed'
    613613                );
    614614
    615615                foreach ( $keys as $key ) {
     
    10901090                                        'field' => 'slug',
    10911091                                );
    10921092
    1093                                 if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {
     1093                                if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {
    10941094                                        $q[$t->query_var] = wp_basename( $q[$t->query_var] );
    10951095                                }
    10961096
     
    17331733                        $q['suppress_filters'] = false;
    17341734
    17351735                if ( !isset($q['cache_results']) ) {
    1736                         if ( wp_using_ext_object_cache() )
    1737                                 $q['cache_results'] = false;
    1738                         else
    1739                                 $q['cache_results'] = true;
     1736                        $q['cache_results'] = true;
    17401737                }
    17411738
     1739                if ( ! isset( $q['update_post_cache'] ) ) {
     1740                        $q['update_post_cache'] = $q['cache_results'];
     1741                }
     1742
    17421743                if ( !isset($q['update_post_term_cache']) )
    17431744                        $q['update_post_term_cache'] = true;
    17441745
     
    18121813                        case 'ids':
    18131814                                $fields = "{$wpdb->posts}.ID";
    18141815                                break;
    1815                         case 'id=>parent':
    1816                                 $fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent";
    1817                                 break;
    18181816                        default:
    18191817                                $fields = "{$wpdb->posts}.*";
    18201818                }
     
    27802778                 */
    27812779                $this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) );
    27822780
    2783                 if ( 'ids' == $q['fields'] ) {
    2784                         if ( null === $this->posts ) {
    2785                                 $this->posts = $wpdb->get_col( $this->request );
     2781                if ( null === $this->posts && $q['cache_results'] ) {
     2782                        global $wp_post_types;
     2783
     2784                        $key          = md5( serialize( $this->request + $wp_post_types ) );
     2785                        $last_changed = wp_cache_get_last_changed( 'posts' );
     2786                        // If there is a taxonomy query, salt the cache key with terms last changed.
     2787                        if ( ! empty( $q['tax_query'] ) ) {
     2788                                $last_changed .= wp_cache_get_last_changed( 'terms' );
    27862789                        }
     2790                        $cache_key   = "get_posts:$key:$last_changed";
     2791                        $cache_value = wp_cache_get( $cache_key, 'posts' );
    27872792
    2788                         $this->posts = array_map( 'intval', $this->posts );
    2789                         $this->post_count = count( $this->posts );
    2790                         $this->set_found_posts( $q, $limits );
    2791 
    2792                         return $this->posts;
     2793                        if ( false !== $cache_value ) {
     2794                                $this->posts       = $cache_value['post_ids'];
     2795                                $this->found_posts = $cache_value['found_posts'];
     2796                        }
    27932797                }
    27942798
    2795                 if ( 'id=>parent' == $q['fields'] ) {
    2796                         if ( null === $this->posts ) {
    2797                                 $this->posts = $wpdb->get_results( $this->request );
    2798                         }
     2799                if ( null === $this->posts ) {
    27992800
    2800                         $this->post_count = count( $this->posts );
    2801                         $this->set_found_posts( $q, $limits );
    2802 
    2803                         $r = array();
    2804                         foreach ( $this->posts as $key => $post ) {
    2805                                 $this->posts[ $key ]->ID = (int) $post->ID;
    2806                                 $this->posts[ $key ]->post_parent = (int) $post->post_parent;
    2807 
    2808                                 $r[ (int) $post->ID ] = (int) $post->post_parent;
     2801                        if ( "{$wpdb->posts}.ID" == $fields ) {
     2802                                $split_the_query = true;
     2803                        } else if ( "{$wpdb->posts}.*" == $fields ) {
     2804                                $split_the_query = ( $old_request == $this->request &&  ! empty( $limits ) && $q['posts_per_page'] < 500 );
    28092805                        }
    28102806
    2811                         return $r;
    2812                 }
    28132807
    2814                 if ( null === $this->posts ) {
    2815                         $split_the_query = ( $old_request == $this->request && "{$wpdb->posts}.*" == $fields && !empty( $limits ) && $q['posts_per_page'] < 500 );
    28162808
    28172809                        /**
    28182810                         * Filters whether to split the query.
     
    28462838                                $ids = $wpdb->get_col( $this->request );
    28472839
    28482840                                if ( $ids ) {
    2849                                         $this->posts = $ids;
     2841                                        $this->posts      = array_map( 'intval', $ids );
    28502842                                        $this->set_found_posts( $q, $limits );
    2851                                         _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
     2843                                        if ( 'ids' != $q['fields'] ) {
     2844                                                _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
     2845                                        }
    28522846                                } else {
    28532847                                        $this->posts = array();
    28542848                                }
     
    28582852                        }
    28592853                }
    28602854
     2855                if ( 'ids' == $q['fields'] ) {
     2856                        $this->post_count = count( $this->posts );
     2857                        if ( $q['cache_results'] ) {
     2858                                $cache_value = array(
     2859                                        'post_ids'    => $this->posts,
     2860                                        'found_posts' => $this->found_posts,
     2861                                );
     2862                                wp_cache_add( $cache_key, $cache_value, 'posts' );
     2863                        }
     2864
     2865                        return $this->posts;
     2866                }
     2867
    28612868                // Convert to WP_Post objects.
    28622869                if ( $this->posts ) {
    28632870                        $this->posts = array_map( 'get_post', $this->posts );
     
    28752882                        $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) );
    28762883                }
    28772884
     2885                if ( $q['cache_results'] && is_array( $this->posts ) ) {
     2886                        $post_ids = wp_list_pluck( $this->posts, 'ID' );
     2887                        $cache_value = array(
     2888                                'post_ids'    => $post_ids,
     2889                                'found_posts' => $this->found_posts,
     2890                        );
     2891                        wp_cache_add( $cache_key, $cache_value, 'posts' );
     2892                }
     2893
    28782894                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    28792895                        /** This filter is documented in wp-includes/query.php */
    28802896                        $cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) );
     
    30113027                // of the type WP_Post and are filtered.
    30123028                if ( $this->posts ) {
    30133029                        $this->post_count = count( $this->posts );
    3014 
    30153030                        $this->posts = array_map( 'get_post', $this->posts );
    30163031
    3017                         if ( $q['cache_results'] )
     3032                        // Prime post caches.
     3033                        if ( $q['update_post_cache'] ) {
    30183034                                update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']);
     3035                        }
    30193036
    30203037                        $this->post = reset( $this->posts );
    30213038                } else {
     
    30273044                        wp_queue_posts_for_term_meta_lazyload( $this->posts );
    30283045                }
    30293046
     3047
     3048                if ( 'id=>parent' == $q['fields'] ) {
     3049                        $r = array();
     3050                        foreach ( $this->posts as $key => $post ) {
     3051                                $this->posts[ $key ]->ID          = (int) $post->ID;
     3052                                $this->posts[ $key ]->post_parent = (int) $post->post_parent;
     3053
     3054                                $r[ (int) $post->ID ] = (int) $post->post_parent;
     3055                        }
     3056
     3057                        return $r;
     3058                }
     3059
    30303060                return $this->posts;
    30313061        }
    30323062
     
    34063436        }
    34073437
    34083438        /**
    3409          * Is the query for an existing archive page?
    3410          *
    3411          * Month, Year, Category, Author, Post Type archive...
     3439         * Is the query for an existing archive page?
    34123440         *
    3413          * @since 3.1.0
    3414          *
    3415          * @return bool
    3416          */
     3441         * Month, Year, Category, Author, Post Type archive...
     3442         *
     3443         * @since 3.1.0
     3444         *
     3445         * @return bool
     3446         */
    34173447        public function is_archive() {
    34183448                return (bool) $this->is_archive;
    34193449        }
     
    36053635                        return true;
    36063636
    36073637                return isset( $queried_object->term_id ) &&
    3608                         count( array_intersect(
    3609                                 array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
    3610                                 $term_array
    3611                         ) );
     3638                       count( array_intersect(
     3639                               array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
     3640                               $term_array
     3641                       ) );
    36123642        }
    36133643
    36143644        /**
     
    40554085                        }
    40564086                        $multipage = 1;
    40574087                } else {
    4058                         $multipage = 0;
    4059                 }
     4088                        $multipage = 0;
     4089                }
    40604090
    40614091                /**
    40624092                 * Fires once the post data has been setup.