自从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@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实现,请在下面的注释中告诉我们!