GC_Comment_Query::get_comments()
最后更新于:2021-11-26 22:37:52
GC_Comment_Query::get_comments()Get a list of comments matching the query vars.
响应
(int|array) List of comments or number of found comments if $count
argument is true.
源文件
文件: gc-includes/class-gc-comment-query.php
public function get_comments() {
global $gcdb;
$this->parse_query();
// Parse meta query.
$this->meta_query = new GC_Meta_Query();
$this->meta_query->parse_query_vars( $this->query_vars );
/**
* Fires before comments are retrieved.
*
* @since 3.1.0
*
* @param GC_Comment_Query $this Current instance of GC_Comment_Query (passed by reference).
*/
do_action_ref_array( 'pre_get_comments', array( &$this ) );
// Reparse query vars, in case they were modified in a 'pre_get_comments' callback.
$this->meta_query->parse_query_vars( $this->query_vars );
if ( ! empty( $this->meta_query->queries ) ) {
$this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $gcdb->comments, 'comment_ID', $this );
}
$comment_data = null;
/**
* Filters the comments data before the query takes place.
*
* 响应 a non-null value to bypass GeChiUI' default comment queries.
*
* The expected return type from this filter depends on the value passed
* in the request query vars:
* - When `$this->query_vars['count']` is set, the filter should return
* the comment count as an integer.
* - When `'ids' === $this->query_vars['fields']`, the filter should return
* an array of comment IDs.
* - Otherwise the filter should return an array of GC_Comment objects.
*
* Note that if the filter returns an array of comment data, it will be assigned
* to the `comments` property of the current GC_Comment_Query instance.
*
* Filtering functions that require pagination information are encouraged to set
* the `found_comments` and `max_num_pages` properties of the GC_Comment_Query object,
* passed to the filter by reference. If GC_Comment_Query does not perform a database
* query, it will not have enough information to generate these values itself.
*
* @since 5.3.0
* @since 5.6.0 The returned array of comment data is assigned to the `comments` property
* of the current GC_Comment_Query instance.
*
* @param array|int|null $comment_data 响应 an array of comment data to short-circuit GC's comment query,
* the comment count as an integer if `$this->query_vars['count']` is set,
* or null to allow GC to run its normal queries.
* @param GC_Comment_Query $query The GC_Comment_Query instance, passed by reference.
*/
$comment_data = apply_filters_ref_array( 'comments_pre_query', array( $comment_data, &$this ) );
if ( null !== $comment_data ) {
if ( is_array( $comment_data ) && ! $this->query_vars['count'] ) {
$this->comments = $comment_data;
}
return $comment_data;
}
/*
* Only use the args defined in the query_var_defaults to compute the key,
* but ignore 'fields', which does not affect query results.
*/
$_args = gc_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
unset( $_args['fields'] );
$key = md5( serialize( $_args ) );
$last_changed = gc_cache_get_last_changed( 'comment' );
$cache_key = "get_comments:$key:$last_changed";
$cache_value = gc_cache_get( $cache_key, 'comment' );
if ( false === $cache_value ) {
$comment_ids = $this->get_comment_ids();
if ( $comment_ids ) {
$this->set_found_comments();
}
$cache_value = array(
'comment_ids' => $comment_ids,
'found_comments' => $this->found_comments,
);
gc_cache_add( $cache_key, $cache_value, 'comment' );
} else {
$comment_ids = $cache_value['comment_ids'];
$this->found_comments = $cache_value['found_comments'];
}
if ( $this->found_comments && $this->query_vars['number'] ) {
$this->max_num_pages = ceil( $this->found_comments / $this->query_vars['number'] );
}
// If querying for a count only, there's nothing more to do.
if ( $this->query_vars['count'] ) {
// $comment_ids is actually a count in this case.
return (int) $comment_ids;
}
$comment_ids = array_map( 'intval', $comment_ids );
if ( 'ids' === $this->query_vars['fields'] ) {
$this->comments = $comment_ids;
return $this->comments;
}
_prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] );
// Fetch full comment objects from the primed cache.
$_comments = array();
foreach ( $comment_ids as $comment_id ) {
$_comment = get_comment( $comment_id );
if ( $_comment ) {
$_comments[] = $_comment;
}
}
// Prime comment post caches.
if ( $this->query_vars['update_comment_post_cache'] ) {
$comment_post_ids = array();
foreach ( $_comments as $_comment ) {
$comment_post_ids[] = $_comment->comment_post_ID;
}
_prime_post_caches( $comment_post_ids, false, false );
}
/**
* Filters the comment query results.
*
* @since 3.1.0
*
* @param GC_Comment[] $_comments An array of comments.
* @param GC_Comment_Query $query Current instance of GC_Comment_Query (passed by reference).
*/
$_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) );
// Convert to GC_Comment instances.
$comments = array_map( 'get_comment', $_comments );
if ( $this->query_vars['hierarchical'] ) {
$comments = $this->fill_descendants( $comments );
}
$this->comments = $comments;
return $this->comments;
}