从 WordPress 中获取某些作者发表的“或”在某些分类或标签中的文章——当 WP_Query 满足不了我们的需求时
文 / @WordPress主题
小本本的自我介绍
嗨,大家好,我是小本本,一个致力于成为优秀程序员的小白。
关于WP_Query和自定义文章查询
WP_Query是WordPress用来从数据库中获取文章的类,这个类非常强大。使用这个类,我们可以根据文章分类、标签、时间、评论、作者、文章ID、文章状态、自定义字段等信息来获取文章,几乎所有的文章查询都可以通过这个类实现。但是总有一些情况,我们只使用WP_Query是实现不了的。
这段时间我们开发了一个WordPress文章订阅系统,用户可以同时订阅网站中的作者、分类、标签这三个信息。订阅了这些信息后,用户可以在自己的订阅页面查看自己订阅的所有包含这些信息的文章,也可以分别查看自己订阅的分类、标签或作者的文章。如果是查询“在某些分类或者标签中的文章”中的文章,使用WP_Query的“tax_query”,relation设置为“or”即可实现。
在所有订阅结果页面,我们需要的是“某些作者发表的、或者在某些分类或标签中的文章”,如果使用和“tax_query”和“author__in”参数查询文章,查询的结果是“某作者发表的,并且在某个分类中的文章”,显然,这并不是我们需要的。我们的解决办法是先用原始SQL语句把符合这种情况的文章ID查询出来,然后再使用post__in参数来构造一个新的WP_Query查询。示例代码如下:
首先使用原始SQL查询获取符合条件的文章ID
$sql_query="SELECTwp_posts.ID
FROMwp_posts
LEFTJOINwp_term_relationshipsON(wp_posts.ID=wp_term_relationships.object_id)
WHERE1=1
AND(
wp_term_relationships.term_taxonomy_idIN(".implode(',',$followed_categories_ids).")
OR
wp_term_relationships.term_taxonomy_idIN(".implode(',',$followed_tags_ids).")
)
ORwp_posts.post_authorIN(".implode(',',$followed_authors_ids).")
ANDwp_posts.post_type='post'
AND(wp_posts.post_status='publish'ORwp_posts.post_status='private')
GROUPBYwp_posts.ID
ORDERBYwp_posts.post_dateDESC
";
$result=array_values(wp_list_pluck($wpdb->get_results($sql_query,OBJECT_K),'ID'));
然后通过使用上面的查询结果构造一个标签的WP_Query查询
获得文章ID后,再使用“post__in”参数构造一个标准的WP_Query查询,用来适配主题的一些功能、实现分页等。
$args=[
'post_type'=>'post',
'posts_per_page'=>$per_page,
'paged'=>$paged,
'post__in'=>$result;
];
除了上述的情况,WP_Query肯定还会有不能满足我们需求的情况存在,遇到类似问题的时候,可以参考上面的方式来实现自定义查询,解决我们的问题。

相关文章
-
搭建一个WordPress网站需要多少成本 2023-11-06 00:09:51
-
Symlink介绍(附:如何使用Symlink进行WordPress开发) 2023-11-05 23:38:32
-
让WordPress实现数据库同步的插件:HyperDB 2023-10-24 23:40:49
-
allegro电商平台值得做吗(附:2023年Allegro注册流程指南) 2023-10-08 21:53:39
-
印度跨境电商平台有哪些(附:印度跨境电商做什么产品好) 2023-10-08 21:34:23
-
跨境电商必看的几大海外二手电商平台 2023-10-08 18:04:42
-
WordPress同城互联网产品解决方案:UBASE 2023-10-03 16:40:39
-
WordPress网站的安全插件:wordfence 2023-09-14 09:25:18
-
WordPress 6.3 支持在手动更新插件和主题失败后回滚旧版本 2023-08-28 16:58:45
-
WordPress 6.3版本(2023年8月)性能提升了哪些? 2023-08-28 16:56:02