WordPress.org

Make WordPress Core

Ticket #22176: 22176.4.diff

File 22176.4.diff, 20.9 KB (added by spacedmonkey, 21 months ago)
  • src/wp-includes/class-wp-query.php

     
    423423         * @since 3.2.0
    424424         * @var bool
    425425         */
    426          public $thumbnails_cached = false;
     426        public $thumbnails_cached = false;
    427427
    428428        /**
    429429         * Cached list of search stopwords.
     
    521521        public function fill_query_vars($array) {
    522522                $keys = array(
    523523                        'error'
    524                         , 'm'
    525                         , 'p'
    526                         , 'post_parent'
    527                         , 'subpost'
    528                         , 'subpost_id'
    529                         , 'attachment'
    530                         , 'attachment_id'
    531                         , 'name'
    532                         , 'static'
    533                         , 'pagename'
    534                         , 'page_id'
    535                         , 'second'
    536                         , 'minute'
    537                         , 'hour'
    538                         , 'day'
    539                         , 'monthnum'
    540                         , 'year'
    541                         , 'w'
    542                         , 'category_name'
    543                         , 'tag'
    544                         , 'cat'
    545                         , 'tag_id'
    546                         , 'author'
    547                         , 'author_name'
    548                         , 'feed'
    549                         , 'tb'
    550                         , 'paged'
    551                         , 'meta_key'
    552                         , 'meta_value'
    553                         , 'preview'
    554                         , 's'
    555                         , 'sentence'
    556                         , 'title'
    557                         , 'fields'
    558                         , 'menu_order'
    559                         , 'embed'
     524                , 'm'
     525                , 'p'
     526                , 'post_parent'
     527                , 'subpost'
     528                , 'subpost_id'
     529                , 'attachment'
     530                , 'attachment_id'
     531                , 'name'
     532                , 'static'
     533                , 'pagename'
     534                , 'page_id'
     535                , 'second'
     536                , 'minute'
     537                , 'hour'
     538                , 'day'
     539                , 'monthnum'
     540                , 'year'
     541                , 'w'
     542                , 'category_name'
     543                , 'tag'
     544                , 'cat'
     545                , 'tag_id'
     546                , 'author'
     547                , 'author_name'
     548                , 'feed'
     549                , 'tb'
     550                , 'paged'
     551                , 'meta_key'
     552                , 'meta_value'
     553                , 'preview'
     554                , 's'
     555                , 'sentence'
     556                , 'title'
     557                , 'fields'
     558                , 'menu_order'
     559                , 'embed'
    560560                );
    561561
    562562                foreach ( $keys as $key ) {
     
    10401040                                        'field' => 'slug',
    10411041                                );
    10421042
    1043                                 if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {
     1043                                if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {
    10441044                                        $q[$t->query_var] = wp_basename( $q[$t->query_var] );
    10451045                                }
    10461046
     
    16841684                        $q['suppress_filters'] = false;
    16851685
    16861686                if ( !isset($q['cache_results']) ) {
    1687                         if ( wp_using_ext_object_cache() )
    1688                                 $q['cache_results'] = false;
    1689                         else
    1690                                 $q['cache_results'] = true;
     1687                        $q['cache_results'] = true;
     1688                }
     1689
     1690                if ( ! isset( $q['update_post_cache'] ) ) {
     1691                        $q['update_post_cache'] = $q['cache_results'];
    16911692                }
    16921693
    16931694                if ( !isset($q['update_post_term_cache']) )
     
    17631764                        case 'ids':
    17641765                                $fields = "{$wpdb->posts}.ID";
    17651766                                break;
    1766                         case 'id=>parent':
    1767                                 $fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent";
    1768                                 break;
    17691767                        default:
    17701768                                $fields = "{$wpdb->posts}.*";
    17711769                }
     
    27552753                 */
    27562754                $this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) );
    27572755
    2758                 if ( 'ids' == $q['fields'] ) {
    2759                         if ( null === $this->posts ) {
    2760                                 $this->posts = $wpdb->get_col( $this->request );
     2756                $key          = md5( serialize( $this->request ) );
     2757                $last_changed = wp_cache_get_last_changed( 'posts' );
     2758                $last_changed .= wp_cache_get_last_changed( 'terms' );
     2759                $cache_key   = "get_posts:$key:$last_changed";
     2760
     2761                if ( null === $this->posts && $q['cache_results'] ) {
     2762
     2763                        $cache_value = wp_cache_get( $cache_key, 'posts' );
     2764
     2765                        if ( false !== $cache_value ) {
     2766                                $this->posts       = $cache_value['post_ids'];
     2767                                $this->found_posts = $cache_value['found_posts'];
    27612768                        }
    2762 
    2763                         $this->posts = array_map( 'intval', $this->posts );
    2764                         $this->post_count = count( $this->posts );
    2765                         $this->set_found_posts( $q, $limits );
    2766 
    2767                         return $this->posts;
    27682769                }
    27692770
    2770                 if ( 'id=>parent' == $q['fields'] ) {
    2771                         if ( null === $this->posts ) {
    2772                                 $this->posts = $wpdb->get_results( $this->request );
    2773                         }
    2774 
    2775                         $this->post_count = count( $this->posts );
    2776                         $this->set_found_posts( $q, $limits );
    2777 
    2778                         $r = array();
    2779                         foreach ( $this->posts as $key => $post ) {
    2780                                 $this->posts[ $key ]->ID = (int) $post->ID;
    2781                                 $this->posts[ $key ]->post_parent = (int) $post->post_parent;
     2771                if ( null === $this->posts ) {
    27822772
    2783                                 $r[ (int) $post->ID ] = (int) $post->post_parent;
     2773                        if ( "{$wpdb->posts}.ID" == $fields ) {
     2774                                $split_the_query = true;
     2775                        } else if ( "{$wpdb->posts}.*" == $fields ) {
     2776                                $split_the_query = ( $old_request == $this->request &&  ! empty( $limits ) && $q['posts_per_page'] < 500 );
    27842777                        }
    27852778
    2786                         return $r;
    2787                 }
    27882779
    2789                 if ( null === $this->posts ) {
    2790                         $split_the_query = ( $old_request == $this->request && "{$wpdb->posts}.*" == $fields && !empty( $limits ) && $q['posts_per_page'] < 500 );
    27912780
    27922781                        /**
    27932782                         * Filters whether to split the query.
     
    28212810                                $ids = $wpdb->get_col( $this->request );
    28222811
    28232812                                if ( $ids ) {
    2824                                         $this->posts = $ids;
     2813                                        $this->posts      = array_map( 'intval', $ids );
    28252814                                        $this->set_found_posts( $q, $limits );
    2826                                         _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
     2815                                        if ( 'ids' != $q['fields'] ) {
     2816                                                _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
     2817                                        }
    28272818                                } else {
    28282819                                        $this->posts = array();
    28292820                                }
     
    28332824                        }
    28342825                }
    28352826
     2827                if ( 'ids' == $q['fields'] ) {
     2828                        $this->post_count = count( $this->posts );
     2829                        if ( $q['cache_results'] ) {
     2830                                $cache_value = array(
     2831                                        'post_ids'    => $this->posts,
     2832                                        'found_posts' => $this->found_posts,
     2833                                );
     2834                                wp_cache_add( $cache_key, $cache_value, 'posts' );
     2835                        }
     2836
     2837                        return $this->posts;
     2838                }
     2839
    28362840                // Convert to WP_Post objects.
    28372841                if ( $this->posts ) {
    28382842                        $this->posts = array_map( 'get_post', $this->posts );
     
    28502854                        $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) );
    28512855                }
    28522856
     2857                if ( $q['cache_results'] && is_array( $this->posts ) ) {
     2858                        $post_ids = wp_list_pluck( $this->posts, 'ID' );
     2859                        $cache_value = array(
     2860                                'post_ids'    => $post_ids,
     2861                                'found_posts' => $this->found_posts,
     2862                        );
     2863                        wp_cache_add( $cache_key, $cache_value, 'posts' );
     2864                }
     2865
    28532866                if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {
    28542867                        /** This filter is documented in wp-includes/query.php */
    28552868                        $cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) );
     
    29862999                // of the type WP_Post and are filtered.
    29873000                if ( $this->posts ) {
    29883001                        $this->post_count = count( $this->posts );
    2989 
    29903002                        $this->posts = array_map( 'get_post', $this->posts );
    29913003
    2992                         if ( $q['cache_results'] )
     3004                        // Prime post caches.
     3005                        if ( $q['update_post_cache'] ) {
    29933006                                update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']);
     3007                        }
    29943008
    29953009                        $this->post = reset( $this->posts );
    29963010                } else {
     
    30023016                        wp_queue_posts_for_term_meta_lazyload( $this->posts );
    30033017                }
    30043018
     3019
     3020                if ( 'id=>parent' == $q['fields'] ) {
     3021                        $r = array();
     3022                        foreach ( $this->posts as $key => $post ) {
     3023                                $this->posts[ $key ]->ID          = (int) $post->ID;
     3024                                $this->posts[ $key ]->post_parent = (int) $post->post_parent;
     3025
     3026                                $r[ (int) $post->ID ] = (int) $post->post_parent;
     3027                        }
     3028
     3029                        return $r;
     3030                }
     3031
    30053032                return $this->posts;
    30063033        }
    30073034
     
    33743401        }
    33753402
    33763403        /**
    3377          * Is the query for an existing archive page?
    3378          *
    3379          * Month, Year, Category, Author, Post Type archive...
    3380          *
    3381          * @since 3.1.0
    3382          *
    3383          * @return bool
    3384          */
     3404         * Is the query for an existing archive page?
     3405         *
     3406         * Month, Year, Category, Author, Post Type archive...
     3407         *
     3408         * @since 3.1.0
     3409         *
     3410         * @return bool
     3411         */
    33853412        public function is_archive() {
    33863413                return (bool) $this->is_archive;
    33873414        }
     
    35733600                        return true;
    35743601
    35753602                return isset( $queried_object->term_id ) &&
    3576                         count( array_intersect(
    3577                                 array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
    3578                                 $term_array
    3579                         ) );
     3603                       count( array_intersect(
     3604                               array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
     3605                               $term_array
     3606                       ) );
    35803607        }
    35813608
    35823609        /**
     
    40234050                        }
    40244051                        $multipage = 1;
    40254052                } else {
    4026                         $multipage = 0;
    4027                 }
     4053                        $multipage = 0;
     4054                }
    40284055
    40294056                /**
    40304057                 * Fires once the post data has been setup.
  • src/wp-includes/post.php

     
    17131713        if ( $the_post = wp_is_post_revision($post_id) )
    17141714                $post_id = $the_post;
    17151715
    1716         return add_metadata('post', $post_id, $meta_key, $meta_value, $unique);
     1716        $added = add_metadata( 'post', $post_id, $meta_key, $meta_value, $unique );
     1717
     1718        // Bust post query cache.
     1719        if ( $added ) {
     1720                wp_cache_set( 'last_changed', microtime(), 'posts' );
     1721        }
     1722
     1723        return $added;
    17171724}
    17181725
    17191726/**
     
    17361743        if ( $the_post = wp_is_post_revision($post_id) )
    17371744                $post_id = $the_post;
    17381745
    1739         return delete_metadata('post', $post_id, $meta_key, $meta_value);
     1746        $deleted = delete_metadata( 'post', $post_id, $meta_key, $meta_value );
     1747
     1748        // Bust post query cache.
     1749        if ( $deleted ) {
     1750                wp_cache_set( 'last_changed', microtime(), 'posts' );
     1751        }
     1752
     1753        return $deleted;
    17401754}
    17411755
    17421756/**
     
    17781792        if ( $the_post = wp_is_post_revision($post_id) )
    17791793                $post_id = $the_post;
    17801794
    1781         return update_metadata('post', $post_id, $meta_key, $meta_value, $prev_value);
     1795        $updated = update_metadata( 'post', $post_id, $meta_key, $meta_value, $prev_value );
     1796
     1797        // Bust post query cache.
     1798        if ( $updated ) {
     1799                wp_cache_set( 'last_changed', microtime(), 'posts' );
     1800        }
     1801
     1802        return $updated;
    17821803}
    17831804
    17841805/**
     
    17901811 * @return bool Whether the post meta key was deleted from the database.
    17911812 */
    17921813function delete_post_meta_by_key( $post_meta_key ) {
    1793         return delete_metadata( 'post', null, $post_meta_key, '', true );
     1814
     1815        $deleted = delete_metadata( 'post', null, $post_meta_key, '', true );
     1816
     1817        // Bust post query cache.
     1818        if ( $deleted ) {
     1819                wp_cache_set( 'last_changed', microtime(), 'posts' );
     1820        }
     1821
     1822        return $deleted;
    17941823}
    17951824
    17961825/**
  • tests/phpunit/tests/query/cache.php

     
     1<?php
     2
     3/**
     4 *
     5 * Test various query vars and make sure the WP_Query class is caching correctly
     6 *
     7 * @ticket 22176
     8 * @group query
     9 */
     10class Tests_Query_Cache extends WP_UnitTestCase {
     11        protected $q;
     12
     13        static $cat_ids = array();
     14        static $tag_ids = array();
     15        static $post_ids = array();
     16
     17        static $parent_one;
     18        static $parent_two;
     19        static $parent_three;
     20        static $child_one;
     21        static $child_two;
     22        static $child_three;
     23        static $child_four;
     24
     25        public static function wpSetUpBeforeClass( $factory ) {
     26                self::$cat_ids[] = $cat_a = $factory->term->create( array( 'taxonomy' => 'category', 'name' => 'cat-a' ) );
     27                self::$cat_ids[] = $cat_b = $factory->term->create( array( 'taxonomy' => 'category', 'name' => 'cat-b' ) );
     28                self::$cat_ids[] = $cat_c = $factory->term->create( array( 'taxonomy' => 'category', 'name' => 'cat-c' ) );
     29
     30                self::$tag_ids[] = $tag_a = $factory->term->create( array( 'taxonomy' => 'post_tag', 'name' => 'tag-a' ) );
     31                self::$tag_ids[] = $tag_b = $factory->term->create( array( 'taxonomy' => 'post_tag', 'name' => 'tag-b' ) );
     32                self::$tag_ids[] = $tag_c = $factory->term->create( array( 'taxonomy' => 'post_tag', 'name' => 'tag-c' ) );
     33                self::$tag_ids[] = $tag_nun = $factory->term->create( array( 'taxonomy' => 'post_tag', 'name' => 'tag-נ' ) );
     34
     35                self::$post_ids[] = $factory->post->create( array(
     36                        'post_title' => 'tag-נ',
     37                        'tags_input' => array( 'tag-נ' ),
     38                        'post_date'  => '2008-11-01 00:00:00'
     39                ) );
     40                self::$post_ids[] = $factory->post->create( array(
     41                        'post_title'    => 'cats-a-b-c',
     42                        'post_date'     => '2008-12-01 00:00:00',
     43                        'post_category' => array( $cat_a, $cat_b, $cat_c )
     44                ) );
     45                self::$post_ids[] = $factory->post->create( array(
     46                        'post_title'    => 'cats-a-and-b',
     47                        'post_date'     => '2009-01-01 00:00:00',
     48                        'post_category' => array( $cat_a, $cat_b )
     49                ) );
     50                self::$post_ids[] = $factory->post->create( array(
     51                        'post_title'    => 'cats-b-and-c',
     52                        'post_date'     => '2009-02-01 00:00:00',
     53                        'post_category' => array( $cat_b, $cat_c )
     54                ) );
     55                self::$post_ids[] = $factory->post->create( array(
     56                        'post_title'    => 'cats-a-and-c',
     57                        'post_date'     => '2009-03-01 00:00:00',
     58                        'post_category' => array( $cat_a, $cat_c )
     59                ) );
     60                self::$post_ids[] = $factory->post->create( array(
     61                        'post_title'    => 'cat-a',
     62                        'post_date'     => '2009-04-01 00:00:00',
     63                        'post_category' => array( $cat_a )
     64                ) );
     65                self::$post_ids[] = $factory->post->create( array(
     66                        'post_title'    => 'cat-b',
     67                        'post_date'     => '2009-05-01 00:00:00',
     68                        'post_category' => array( $cat_b )
     69                ) );
     70                self::$post_ids[] = $factory->post->create( array(
     71                        'post_title'    => 'cat-c',
     72                        'post_date'     => '2009-06-01 00:00:00',
     73                        'post_category' => array( $cat_c )
     74                ) );
     75                self::$post_ids[] = $factory->post->create( array(
     76                        'post_title' => 'lorem-ipsum',
     77                        'post_date'  => '2009-07-01 00:00:00'
     78                ) );
     79                self::$post_ids[] = $factory->post->create( array(
     80                        'post_title' => 'comment-test',
     81                        'post_date'  => '2009-08-01 00:00:00'
     82                ) );
     83                self::$post_ids[] = $factory->post->create( array(
     84                        'post_title' => 'one-trackback',
     85                        'post_date'  => '2009-09-01 00:00:00'
     86                ) );
     87                self::$post_ids[] = $factory->post->create( array(
     88                        'post_title' => 'many-trackbacks',
     89                        'post_date'  => '2009-10-01 00:00:00'
     90                ) );
     91                self::$post_ids[] = $factory->post->create( array(
     92                        'post_title' => 'no-comments',
     93                        'post_date'  => '2009-10-01 00:00:00'
     94                ) );
     95                self::$post_ids[] = $factory->post->create( array(
     96                        'post_title' => 'one-comment',
     97                        'post_date'  => '2009-11-01 00:00:00'
     98                ) );
     99                self::$post_ids[] = $factory->post->create( array(
     100                        'post_title' => 'contributor-post-approved',
     101                        'post_date'  => '2009-12-01 00:00:00'
     102                ) );
     103                self::$post_ids[] = $factory->post->create( array(
     104                        'post_title' => 'embedded-video',
     105                        'post_date'  => '2010-01-01 00:00:00'
     106                ) );
     107                self::$post_ids[] = $factory->post->create( array(
     108                        'post_title' => 'simple-markup-test',
     109                        'post_date'  => '2010-02-01 00:00:00'
     110                ) );
     111                self::$post_ids[] = $factory->post->create( array(
     112                        'post_title' => 'raw-html-code',
     113                        'post_date'  => '2010-03-01 00:00:00'
     114                ) );
     115                self::$post_ids[] = $factory->post->create( array(
     116                        'post_title' => 'tags-a-b-c',
     117                        'tags_input' => array( 'tag-a', 'tag-b', 'tag-c' ),
     118                        'post_date'  => '2010-04-01 00:00:00'
     119                ) );
     120                self::$post_ids[] = $factory->post->create( array(
     121                        'post_title' => 'tag-a',
     122                        'tags_input' => array( 'tag-a' ),
     123                        'post_date'  => '2010-05-01 00:00:00'
     124                ) );
     125                self::$post_ids[] = $factory->post->create( array(
     126                        'post_title' => 'tag-b',
     127                        'tags_input' => array( 'tag-b' ),
     128                        'post_date'  => '2010-06-01 00:00:00'
     129                ) );
     130                self::$post_ids[] = $factory->post->create( array(
     131                        'post_title' => 'tag-c',
     132                        'tags_input' => array( 'tag-c' ),
     133                        'post_date'  => '2010-07-01 00:00:00'
     134                ) );
     135                self::$post_ids[] = $factory->post->create( array(
     136                        'post_title' => 'tags-a-and-b',
     137                        'tags_input' => array( 'tag-a', 'tag-b' ),
     138                        'post_date'  => '2010-08-01 00:00:00'
     139                ) );
     140                self::$post_ids[] = $factory->post->create( array(
     141                        'post_title' => 'tags-b-and-c',
     142                        'tags_input' => array( 'tag-b', 'tag-c' ),
     143                        'post_date'  => '2010-09-01 00:00:00'
     144                ) );
     145                self::$post_ids[] = $factory->post->create( array(
     146                        'post_title' => 'tags-a-and-c',
     147                        'tags_input' => array( 'tag-a', 'tag-c' ),
     148                        'post_date'  => '2010-10-01 00:00:00'
     149                ) );
     150
     151                self::$post_ids[] = self::$parent_one = $factory->post->create( array(
     152                        'post_title' => 'parent-one',
     153                        'post_date'  => '2007-01-01 00:00:00'
     154                ) );
     155                self::$post_ids[] = self::$parent_two = $factory->post->create( array(
     156                        'post_title' => 'parent-two',
     157                        'post_date'  => '2007-01-01 00:00:00'
     158                ) );
     159                self::$post_ids[] = self::$parent_three = $factory->post->create( array(
     160                        'post_title' => 'parent-three',
     161                        'post_date'  => '2007-01-01 00:00:00'
     162                ) );
     163                self::$post_ids[] = self::$child_one = $factory->post->create( array(
     164                        'post_title'  => 'child-one',
     165                        'post_parent' => self::$parent_one,
     166                        'post_date'   => '2007-01-01 00:00:01'
     167                ) );
     168                self::$post_ids[] = self::$child_two = $factory->post->create( array(
     169                        'post_title'  => 'child-two',
     170                        'post_parent' => self::$parent_one,
     171                        'post_date'   => '2007-01-01 00:00:02'
     172                ) );
     173                self::$post_ids[] = self::$child_three = $factory->post->create( array(
     174                        'post_title'  => 'child-three',
     175                        'post_parent' => self::$parent_two,
     176                        'post_date'   => '2007-01-01 00:00:03'
     177                ) );
     178                self::$post_ids[] = self::$child_four = $factory->post->create( array(
     179                        'post_title'  => 'child-four',
     180                        'post_parent' => self::$parent_two,
     181                        'post_date'   => '2007-01-01 00:00:04'
     182                ) );
     183        }
     184
     185        function setUp() {
     186                parent::setUp();
     187
     188                unset( $this->q );
     189                $this->q = new WP_Query();
     190        }
     191
     192        function test_caching_no_more_queries_same_query() {
     193                global $wpdb;
     194
     195                $posts1            = $this->q->query( array() );
     196                $number_of_queries = $wpdb->num_queries;
     197                $posts2            = $this->q->query( array() );
     198                $this->assertSame( $wpdb->num_queries, $number_of_queries );
     199                $this->assertEquals( $posts1, $posts2 );
     200
     201        }
     202
     203        function test_caching_no_more_queries_parent_id_query() {
     204                global $wpdb;
     205
     206                $posts1            = $this->q->query( array( 'fields' => 'all' ) );
     207                $number_of_queries = $wpdb->num_queries;
     208                $posts2            = $this->q->query( array( 'fields' => 'id=>parent' ) );
     209                $this->assertSame( $wpdb->num_queries, $number_of_queries );
     210                $this->assertNotEquals( $posts1, $posts2 );
     211        }
     212
     213        function test_caching_no_more_queries_id_query() {
     214                global $wpdb;
     215
     216                $posts1            = $this->q->query( array( 'fields' => 'all' ) );
     217                $number_of_queries = $wpdb->num_queries;
     218                $posts2            = $this->q->query( array( 'fields' => 'ids' ) );
     219                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     220                $this->assertNotEquals( $posts1, $posts2 );
     221        }
     222
     223        function test_caching_invalidation_queries_same_query() {
     224                global $wpdb;
     225
     226                $posts1 = $this->q->query( array() );
     227                self::factory()->post->create();
     228                $number_of_queries = $wpdb->num_queries;
     229                $posts2            = $this->q->query( array() );
     230                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     231                $this->assertNotEquals( $posts1, $posts2 );
     232
     233        }
     234
     235        function test_caching_invalidation_term_queries_same_query() {
     236                global $wpdb;
     237
     238                $posts1 = $this->q->query( array() );
     239                self::factory()->term->create();
     240                $number_of_queries = $wpdb->num_queries;
     241                $posts2            = $this->q->query( array() );
     242                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     243                $this->assertEquals( $posts1, $posts2 );
     244
     245        }
     246
     247        public function test_tax_query_single_query_single_term_field_slug() {
     248                global $wpdb;
     249                $t  = self::factory()->term->create( array(
     250                        'taxonomy' => 'category',
     251                        'slug'     => 'foo',
     252                        'name'     => 'Foo',
     253                ) );
     254                $p1 = self::factory()->post->create();
     255                $p2 = self::factory()->post->create();
     256
     257                $posts1 = new WP_Query( array(
     258                        'fields'                 => 'ids',
     259                        'update_post_meta_cache' => false,
     260                        'update_post_term_cache' => false,
     261                        'tax_query'              => array(
     262                                array(
     263                                        'taxonomy' => 'category',
     264                                        'terms'    => array( 'foo' ),
     265                                        'field'    => 'slug',
     266                                ),
     267                        ),
     268                ) );
     269
     270                wp_set_post_terms( $p1, $t, 'category' );
     271                $number_of_queries = $wpdb->num_queries;
     272                $posts2            = new WP_Query( array(
     273                        'fields'                 => 'ids',
     274                        'update_post_meta_cache' => false,
     275                        'update_post_term_cache' => false,
     276                        'tax_query'              => array(
     277                                array(
     278                                        'taxonomy' => 'category',
     279                                        'terms'    => array( 'foo' ),
     280                                        'field'    => 'slug',
     281                                ),
     282                        ),
     283                ) );
     284
     285                $this->assertEquals( array( $p1 ), $posts2->posts );
     286                $this->assertNotEquals( $posts1->posts, $posts2->posts );
     287                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     288        }
     289
     290        function test_disable_caching_query() {
     291                global $wpdb;
     292
     293                $posts1            = $this->q->query( array( 'cache_results' => false ) );
     294                $number_of_queries = $wpdb->num_queries;
     295                $posts2            = $this->q->query( array( 'cache_results' => false ) );
     296                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     297                $this->assertEquals( $posts1, $posts2 );
     298        }
     299
     300        public function test_meta_query_single_query_compare_default() {
     301                global $wpdb;
     302                $p1 = self::factory()->post->create();
     303                $p2 = self::factory()->post->create();
     304
     305                $query1 = new WP_Query( array(
     306                        'update_post_meta_cache' => false,
     307                        'update_post_term_cache' => false,
     308                        'fields'                 => 'ids',
     309                        'meta_query'             => array(
     310                                array(
     311                                        'key'   => 'foo',
     312                                        'value' => 'bar',
     313                                ),
     314                        ),
     315                ) );
     316
     317                add_post_meta( $p1, 'foo', 'bar' );
     318                $number_of_queries = $wpdb->num_queries;
     319                $query2            = new WP_Query( array(
     320                        'update_post_meta_cache' => false,
     321                        'update_post_term_cache' => false,
     322                        'fields'                 => 'ids',
     323                        'meta_query'             => array(
     324                                array(
     325                                        'key'   => 'foo',
     326                                        'value' => 'bar',
     327                                ),
     328                        ),
     329                ) );
     330
     331                $expected = array( $p1 );
     332                $this->assertEqualSets( $expected, $query2->posts );
     333                $this->assertNotSame( $wpdb->num_queries, $number_of_queries );
     334        }
     335}