WordPress.org

Make WordPress Core

Ticket #8071: 8071.5.diff

File 8071.5.diff, 8.3 KB (added by boonebgorges, 4 years ago)
  • src/wp-includes/class-wp-comment-query.php

    diff --git src/wp-includes/class-wp-comment-query.php src/wp-includes/class-wp-comment-query.php
    index 787e769..28b17d7 100644
    class WP_Comment_Query { 
    3535        public $meta_query = false;
    3636
    3737        /**
     38         * Metadata query clauses.
     39         *
     40         * @since 4.4.0
     41         * @access protected
     42         * @var array
     43         */
     44        protected $meta_query_clauses;
     45
     46        /**
    3847         * Date query container
    3948         *
    4049         * @since 3.7.0
    class WP_Comment_Query { 
    261270        public function get_comments() {
    262271                global $wpdb;
    263272
    264                 $groupby = '';
    265 
    266273                $this->parse_query();
    267274
    268275                // Parse meta query
    class WP_Comment_Query { 
    281288                // Reparse query vars, in case they were modified in a 'pre_get_comments' callback.
    282289                $this->meta_query->parse_query_vars( $this->query_vars );
    283290                if ( ! empty( $this->meta_query->queries ) ) {
    284                         $meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );
     291                        $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );
    285292                }
    286293
    287294                // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
    class WP_Comment_Query { 
    291298                        $last_changed = microtime();
    292299                        wp_cache_set( 'last_changed', $last_changed, 'comment' );
    293300                }
    294                 $cache_key = "get_comments:$key:$last_changed";
     301                $cache_key = "get_comment_ids:$key:$last_changed";
     302
     303                $comment_ids = wp_cache_get( $cache_key, 'comment' );
     304                if ( false === $comment_ids ) {
     305                        $comment_ids = $this->get_comment_ids();
     306                        wp_cache_add( $cache_key, $comment_ids, 'comment' );
     307                }
     308
     309                // If querying for a count only, there's nothing more to do.
     310                if ( $this->query_vars['count'] ) {
     311                        return $comment_ids;
     312                }
     313
     314                $comment_ids = array_map( 'intval', $comment_ids );
    295315
    296                 if ( $cache = wp_cache_get( $cache_key, 'comment' ) ) {
    297                         $this->comments = $cache;
     316                if ( 'ids' == $this->query_vars['fields'] ) {
     317                        $this->comments = $comment_ids;
    298318                        return $this->comments;
    299319                }
    300320
     321                _prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] );
     322
     323                // Fetch full comment objects from the primed cache.
     324                $_comments = array();
     325                foreach ( $comment_ids as $comment_id ) {
     326                        if ( $_comment = wp_cache_get( $comment_id, 'comment' ) ) {
     327                                $_comments[] = $_comment;
     328                        }
     329                }
     330
     331                /**
     332                 * Filter the comment query results.
     333                 *
     334                 * @since 3.1.0
     335                 *
     336                 * @param array            $results  An array of comments.
     337                 * @param WP_Comment_Query &$this    Current instance of WP_Comment_Query, passed by reference.
     338                 */
     339                $_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) );
     340
     341                // Convert to WP_Comment instances
     342                $comments = array_map( 'get_comment', $_comments );
     343
     344                $this->comments = $comments;
     345                return $this->comments;
     346        }
     347
     348        /**
     349         * Used internally to get a list of comment IDs matching the query vars.
     350         *
     351         * @since 4.4.0
     352         * @access protected
     353         *
     354         * @global wpdb $wpdb
     355         */
     356        protected function get_comment_ids() {
     357                global $wpdb;
     358
     359                $groupby = '';
    301360                $where = array();
    302361
    303362                // Assemble clauses related to 'comment_approved'.
    class WP_Comment_Query { 
    455514                        $orderby = "$wpdb->comments.comment_date_gmt $order";
    456515                }
    457516
    458                 $number = absint( $this->query_vars['number'] );
    459                 $offset = absint( $this->query_vars['offset'] );
    460 
    461                 if ( ! empty( $number ) ) {
    462                         if ( $offset ) {
    463                                 $limits = 'LIMIT ' . $offset . ',' . $number;
    464                         } else {
    465                                 $limits = 'LIMIT ' . $number;
    466                         }
    467                 } else {
    468                         $limits = '';
    469                 }
    470 
    471517                if ( $this->query_vars['count'] ) {
    472518                        $fields = 'COUNT(*)';
    473519                } else {
    474                         switch ( strtolower( $this->query_vars['fields'] ) ) {
    475                                 case 'ids':
    476                                         $fields = "$wpdb->comments.comment_ID";
    477                                         break;
    478                                 default:
    479                                         $fields = "*";
    480                                         break;
    481                         }
     520                        $fields = "$wpdb->comments.comment_ID";
    482521                }
    483522
    484523                $join = '';
    class WP_Comment_Query { 
    625664                        $join = "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";
    626665                }
    627666
    628                 if ( ! empty( $meta_query_clauses ) ) {
    629                         $join .= $meta_query_clauses['join'];
     667                if ( ! empty( $this->meta_query_clauses ) ) {
     668                        $join .= $this->meta_query_clauses['join'];
    630669
    631670                        // Strip leading 'AND'.
    632                         $where[] = preg_replace( '/^\s*AND\s*/', '', $meta_query_clauses['where'] );
     671                        $where[] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] );
    633672
    634673                        if ( ! $this->query_vars['count'] ) {
    635674                                $groupby = "{$wpdb->comments}.comment_ID";
    class WP_Comment_Query { 
    677716                $this->request = "SELECT $fields FROM $wpdb->comments $join $where $groupby $orderby $limits";
    678717
    679718                if ( $this->query_vars['count'] ) {
    680                         return $wpdb->get_var( $this->request );
    681                 }
    682 
    683                 if ( 'ids' == $this->query_vars['fields'] ) {
    684                         $this->comments = $wpdb->get_col( $this->request );
    685                         return array_map( 'intval', $this->comments );
    686                 }
    687 
    688                 $results = $wpdb->get_results( $this->request );
    689                 /**
    690                  * Filter the comment query results.
    691                  *
    692                  * @since 3.1.0
    693                  *
    694                  * @param array            $results  An array of comments.
    695                  * @param WP_Comment_Query &$this    Current instance of WP_Comment_Query, passed by reference.
    696                  */
    697                 $_comments = apply_filters_ref_array( 'the_comments', array( $results, &$this ) );
    698 
    699                 // Convert to WP_Comment instances
    700                 $comments = array_map( 'get_comment', $_comments );
    701 
    702                 wp_cache_add( $cache_key, $comments, 'comment' );
    703                 if ( '*' === $fields ) {
    704                         update_comment_cache( $comments, $this->query_vars['update_comment_meta_cache'] );
     719                        return intval( $wpdb->get_var( $this->request ) );
     720                } else {
     721                        $comment_ids = $wpdb->get_col( $this->request );
     722                        return array_map( 'intval', $comment_ids );
    705723                }
    706 
    707                 $this->comments = $comments;
    708                 return $this->comments;
    709724        }
    710725
    711726        /**
  • src/wp-includes/comment-functions.php

    diff --git src/wp-includes/comment-functions.php src/wp-includes/comment-functions.php
    index f0807b1..d10dd26 100644
    function update_comment_cache( $comments, $update_meta_cache = true ) { 
    23772377}
    23782378
    23792379/**
     2380 * Adds any comments from the given ids to the cache that do not already exist in cache.
     2381 *
     2382 * @since 4.4.0
     2383 * @access private
     2384 *
     2385 * @see update_comment_cache()
     2386 *
     2387 * @global wpdb $wpdb
     2388 *
     2389 * @param array $comment_ids       ID list
     2390 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.
     2391 */
     2392function _prime_comment_caches( $comment_ids, $update_meta_cache = true ) {
     2393        global $wpdb;
     2394
     2395        $non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' );
     2396        if ( !empty( $non_cached_ids ) ) {
     2397                $fresh_comments = $wpdb->get_results( sprintf( "SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) );
     2398
     2399                update_comment_cache( $fresh_comments, $update_meta_cache );
     2400        }
     2401}
     2402
     2403/**
    23802404 * Lazy load comment meta when inside of a `WP_Query` loop.
    23812405 *
    23822406 * @since 4.4.0
  • tests/phpunit/tests/comment/metaCache.php

    diff --git tests/phpunit/tests/comment/metaCache.php tests/phpunit/tests/comment/metaCache.php
    index ff7de36..edec8b8 100644
    class Tests_Comment_Meta_Cache extends WP_UnitTestCase { 
    1717                        update_comment_meta( $cid, 'foo', 'bar' );
    1818                }
    1919
     20                // Clear comment cache, just in case.
     21                clean_comment_cache( $comment_ids );
     22
    2023                $q = new WP_Comment_Query( array(
    2124                        'post_ID' => $p,
    2225                ) );
    class Tests_Comment_Meta_Cache extends WP_UnitTestCase { 
    4245                        update_comment_meta( $cid, 'foo', 'bar' );
    4346                }
    4447
     48                // Clear comment cache, just in case.
     49                clean_comment_cache( $comment_ids );
     50
    4551                $q = new WP_Comment_Query( array(
    4652                        'post_ID' => $p,
    4753                        'update_comment_meta_cache' => true,
  • tests/phpunit/tests/comment/query.php

    diff --git tests/phpunit/tests/comment/query.php tests/phpunit/tests/comment/query.php
    index cecf92c..73ab4aa 100644
    class Tests_Comment_Query extends WP_UnitTestCase { 
    16671667                $q1 = new WP_Comment_Query();
    16681668                $q1->query( array(
    16691669                        'post_id' => $p,
     1670                        'fields' => 'ids',
    16701671                ) );
    16711672
    16721673                $num_queries = $wpdb->num_queries;
    class Tests_Comment_Query extends WP_UnitTestCase { 
    16741675                $q2 = new WP_Comment_Query();
    16751676                $q2->query( array(
    16761677                        'post_id' => $p,
     1678                        'fields' => 'ids',
    16771679                        'foo' => 'bar',
    16781680                ) );
    16791681