In `wp_list_comments()`, update the comment meta cache when the comments derive from `WP_Query` and the new `->comment_meta_cached` prop is `false`.

There are no uses of `wp_list_comments()` in Core where `$comments` are passed as the 2nd argument.

Adds unit tests.

Props wonderboymusic, bradt.
Fixes #16894.


git-svn-id: https://develop.svn.wordpress.org/trunk@33925 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Scott Taylor 2015-09-05 22:24:16 +00:00
parent 43340fe787
commit 542ac152fc
3 changed files with 79 additions and 0 deletions

View File

@ -2116,6 +2116,12 @@ function wp_list_comments( $args = array(), $comments = null ) {
} else { } else {
$_comments = $wp_query->comments; $_comments = $wp_query->comments;
} }
if ( ! $wp_query->comment_meta_cached ) {
$comment_ids = wp_list_pluck( $_comments, 'comment_ID' );
update_meta_cache( 'comment', $comment_ids );
$wp_query->comment_meta_cached = true;
}
} }
if ( '' === $r['per_page'] && get_option('page_comments') ) if ( '' === $r['per_page'] && get_option('page_comments') )

View File

@ -1292,6 +1292,15 @@ class WP_Query {
*/ */
public $thumbnails_cached = false; public $thumbnails_cached = false;
/**
* Set if comment meta has already been cached
*
* @since 4.4.0
* @access public
* @var bool
*/
public $comment_meta_cached = false;
/** /**
* Cached list of search stopwords. * Cached list of search stopwords.
* *

View File

@ -0,0 +1,64 @@
<?php
class Tests_Meta_Cache extends WP_UnitTestCase {
protected $i = 0;
protected $queries = 0;
public function test_comment_meta_cache() {
$post_id = $this->factory->post->create( array(
'post_status' => 'publish'
) );
$comment_ids = $this->factory->comment->create_post_comments( $post_id, 10 );
foreach ( $comment_ids as $cid ) {
update_comment_meta( $cid, 'sauce', 'fire' );
}
$post = get_post( $post_id );
$this->assertEquals( $post->comment_count, count( $comment_ids ) );
$this->go_to( get_permalink( $post_id ) );
$this->assertTrue( is_single() );
$this->assertTrue( have_posts() );
global $wp_query;
while ( have_posts() ) {
the_post();
$comment_args = array(
'order' => 'ASC',
'orderby' => 'comment_date_gmt',
'status' => 'approve',
'post_id' => get_the_ID(),
);
$comments = get_comments( $comment_args );
// This is beyond awful
$wp_query->comments = $comments;
wp_list_comments( array(
'echo' => false,
'callback' => array( $this, '_comment_callback' )
) );
}
}
public function _comment_callback( $comment ) {
global $wpdb;
get_comment_meta( $comment->comment_ID, 'sauce' );
if ( 0 === $this->i ) {
$this->queries = $wpdb->num_queries;
} else {
$this->assertEquals( $this->queries, $wpdb->num_queries );
}
$this->i++;
}
}