使用WP_Comment_Query检索评论

自从WordPress实施了一段时间以来的自定义帖子类型以来,使用WP_Query根据自定义条件检索帖子已成为标准做法。 尽管可以使用WP_Comment_Query类,但由于某种原因,列表注释并未变得如此普遍。

WP_Comment_Query允许主题和插件作者使用标准化界面撤消帖子评论。 丑陋的直接数据库查询时代已经一去不复返了。 现在,我们可以使用模块化和易读的参数进行出价了。

为什么我们要列出评论? (Why Should We List Comments?)

您可能在想:为什么? 我里面的程序员会回答:因为我们可以! 这似乎有些愚蠢,但其中隐藏着更深的含义。 框架只有灵活且模块化,才有好处。 模块化框架应允许对信息进行浪费和标准化的访问。 能够根据您的自定义条件检索评论是这种思维方式的一部分。

我内的实用主义者着眼于特定的用例来回答这个问题。 使用WP_Comment_Query您可以构建一个页面,用户可以在其中根据日期,受欢迎程度和自定义特色评论浏览您的站点评论。

如果要构建用户个人资料,则可能要显示特定用户的评论,或与用户喜欢的文章相关的评论。

WP_Comment_Query如何工作

注释查询通常与列出检索到的注释的循环结合使用。 查询和循环的完整实现如下所示:

// Arguments for the query
$args = array();
 
// The comment query
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );
 
// The comment loop
if ( !empty( $comments ) ) {
    foreach ( $comments as $comment ) {
        echo '<p>' . $comment->comment_content . '</p>';
    }
} else {
    echo 'No comments found.';
}

如您所见,它并不太复杂。 我们唯一需要了解的是传递给第6行的query()方法的参数。

通过帖子限制评论 (Restricting Comments By Post)

将评论限制为特定帖子的最明显方法是使用post_id参数。 通过提供帖子的ID,您可以确保仅显示与该帖子相关的评论。

您也可以根据多个帖子列出评论。 如果您想显示两个非常相关的帖子的评论,这可能会很有用。 在这种情况下,请为post__in参数提供一个帖子ID数组。

$related_posts = array( 12, 833, 229, 38 );
$args = array(
    'post__in' => $related_posts
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

您可以使用许多与帖子相关的属性,这是一个简短列表:

post_id: Retrieves comments for a specific ID
post_id :检索特定ID的注释
post__in: Retrieves comments for an array of posts
post__in :检索一系列帖子的评论
post__not_in: Retrieves comments for all posts except those in the supplied array
post__not_in :检索所有帖子的注释(提供数组中的注释除外)
post_status: Retrieves comments for posts with the given status
post_status :检索具有给定状态的帖子的评论
post_type: Retrieves comments for the given post type
post_type :检索给定帖子类型的评论
post_name: Post name to retrieve comments for
post_name :帖子名称以检索评论
post_parent: Retrive comments for posts with the given parent
post_parent :检索具有给定父级的帖子的评论

您可以选择混合匹配这些参数。 您可以检索具有特定父级但不在给定集中的所有帖子的评论:

$unwanted = array( 3, 6, 10 );
$args = array(
    'post__not_in' => $unwanted,
    'post_parent' => 223
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

按作者限制评论 (Restricting Comments By Author)

与发布限制类似,您可以使用user_id参数列出特定用户的评论。 您还可以使用author__in和author__not_in提供包含/排除数组。

列出评论的另一种很好的方法是使用作者的电子邮件地址。 许多评论将由非注册用户提交,在这种情况下,通过电子邮件轻松获取它们:

$email = array( 'awesomecommenter&commat;email.com' );
$args = array(
    'author_email' => $email
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

回顾一下,让我们再次遍历所有用户参数:

user_id: Retrieves comments by a specific user
user_id :检索特定用户的评论
author__in: Retrieves comments by a set of users
author__in :检索一组用户的评论
author__not_in: Retrieves all comments except from the given users
author__not_in :检索给定用户以外的所有评论
author_email: Retrieves comments by user with the given email
author_email :使用给定的电子邮件检索用户的评论

其他简单评论限制 (Other Simple Comment Restrictions)

您可以添加一堆基于注释的限制,从日期到注释类型以及搜索。 以下是一些示例的完整列表:

comment__in: Retrieves comments with the given IDs
comment__in :检索具有给定ID的评论
comment__not_in: Retrieves all comments except ones with the given IDs
comment__not_in :检索除具有给定ID的注释以外的所有注释
include_unapproved: Retrieved comments will include unapproved ones from the given users (ID or email)
include_unapproved :检索到的评论将包括来自给定用户(ID或电子邮件)的未批准评论
karma: Karma score to retrieve comments for
karma : karma分数以检索有关的评论
search: Retrieve comments which match the given search string
search :检索与给定搜索字符串匹配的注释
status: Retrieve comments with the given status (accepts: hold, approve, all or custom status)
status :检索具有给定状态的注释(接受:保留,批准,全部或自定义状态)
type: The comment type to return ( comment, pings or custom type )
type :要返回的评论类型(评论,ping或自定义类型)
type__in: Retrieves comments from the given types
type__in :检索给定类型的注释
type__not_in: Retrieves comments excluding the given types
type__not_in :检索不包含给定类型的注释

使用这些参数,我们可以列出包含术语“ kazoo”的自定义注释类型。

$args = array(
    'type' => 'review',
    'search' => 'kazoo'
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

基于日期的查询 (Date Based Queries)

WP_Comment_Query支持使用WP_Date_Query基于日期的限制,该限制也用于常规的帖子查询中。 此类允许您为任何查询添加灵活的日期限制,例如:

$args = array(
    'type' => 'review',
    'date_query' => array(
        array(
            'after'     => 'January 1st, 2014',
            'before'    => array(
                'year'  => 2014,
                'month' => 7,
                'day'   => 01,
            ),
        ),
    ),
);
 
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

日期查询是一个包含描述日期间隔信息的数组数组。 这是一个很好的自我解释,展示了如何以文本或数组形式提供日期。 最后,此查询将返回2014年上半年发布的所有评论。

您可以使用WP_Date_Query类从单个日期,某个范围抓取帖子,或者将其与其他参数结合使用,以获取一周前发布的评论,并在过去两天内进行修改。

遗憾的是,此类本身没有很好的文档。 您可以在WP_Query的日期参数中找到很多示例。

元查询 (Meta Queries)

元查询是功能强大的参数,可让您根据comment_meta表中的数据来缩小结果范围。 例如,对于将评论用于评论的自定义实现,这非常有用。

$args = array(
    'type' => 'review',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'design',
            'value' => '4',
            'type' => 'numeric',
            'compare' => '>='
        ),
        array(
            'key' => 'features',
            'value' => '4',
            'type' => 'numeric',
            'compare' => '>='
        )
    )
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

本示例说明了如何查询对产品和功能评分为4或更高的评论。 如您所见,添加了多个元查询。 relation参数指示查询如何将这些因素考虑在内。 AND类型关系可确保两者都为真, OR类型关系可确保至少一个为真。

接下来是两个数组,它们定义了元键,它的值以及我们如何比较它。 如果您使用适当的比较运算符( IN , NOT IN , BETWEEN , NOT BETWEEN , EXISTS或NOT EXISTS ),则该值也可能是数组。

类型也很重要,尤其是在区分文本和数字时。 提供以下选项: NUMERIC , BINARY , CHAR , DATE , DATETIME , DECIMAL , SIGNED , TIME , UNSIGNED 。

排列和返回数据 (Ordering And Returning Data)

有两个参数可帮助我们组织返回的结果,限制其数量并确定要返回的数据以供我们注释。 这是所有这些的快速列表:

count: Set to true to return a comment count or false to return an array of comments
count :设置为true返回评论数,设置为false返回评论数列
fields: Set to ids to return comment ID only or false to grab everything
fields :设置为ids来唯一的评论ID或假返回抢一切
number: Sets the number of comments to return
number :设置要返回的评论数
offset: Use an offset when grabbing comments from the database
offset :从数据库中获取注释时使用偏移量
orderby: The database column to order the comments by
orderby :按以下顺序排序注释的数据库列
order: Sets the direction of ordering - ASC or DESC
order :设置排列顺序ASC或DESC

使用上面的参数,我们可以将结果限制为由meta_value排序的后三条评论:

$args = array(
    'type' => 'review',
    'meta_key' => 'rating',
    'orderby' => 'meta_value',
    'offset' => 3
);
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query( $args );

WP_Comment_Query问题 (Problems With WP_Comment_Query)

暂时我想提到一个关于此类的问题:不一致。 您可能经常听到WordPress代码库一团糟。 这有点夸张,但是WP_Comment_Query的状态是其中WP_Comment_Query的一个很好的例子。

此类看起来像WP_Query但实际上并非如此。 当您列出帖子时,可以使用具有have_posts()和the_post()类的函数的循环。 通过WP_Comment_Query您可以使用常规循环。 如果我们可以将相同的格式用于have_comments()和the_comment()会更好。

参数也无处不在。 该文档没有列出所有这些参数,并且还有大量重复的参数。 查看完整列表的源代码 。

您可以使用post_author__in或author__in获得作者。 include_unapproved属性完全具有误导性,status在类型参数中没有status__in并且确实应将parent参数称为comment_parent以与WP_Query 。 更不用说WP_Query本身应该被命名为WP_Post_Query来最大化模块化。

结论 (Conclusion)

除了批评, WP_Comment_Query是根据您自己的需求获取评论的出色类。 它使列出评论变得容易得多,尤其是当您具有一些自定义功能时。

我强烈建议您熟悉日期和元查询,常规WP_Query的日期和元查询也是如此,因此您可以在那里重新使用您的知识。

如果您使用WP_Comment_Query对注释进行了特别WP_Comment_Query实现,请在下面的注释中告诉我们!