如何在pre_get_posts中合并作者与自定义合著者字段查询
嘿,这两个问题在多作者协作的WordPress站点里真的很实用!我来一步步给你拆解怎么实现:
1. 如何在pre_get_posts中合并作者查询与自定义字段查询?
首先,pre_get_posts是WordPress用来修改主查询的核心钩子,咱们要做的就是在这个钩子里面,给查询添加双重条件:要么文章的作者是当前用户,要么文章的某个自定义字段匹配这个用户(比如合著者字段)。关键是要把这两个条件用OR关系组合起来,这样满足其中一个就能被查询到。
直接上代码示例,你可以放到主题的functions.php里:
add_action('pre_get_posts', 'merge_author_and_custom_field_query'); function merge_author_and_custom_field_query($query) { // 只修改前台主查询,且仅针对作者页面(可根据需求调整场景) if (!is_admin() && $query->is_main_query() && $query->is_author()) { // 获取当前作者页面的用户ID $author_id = get_queried_object_id(); // 构造复合查询条件 $meta_query = array( 'relation' => 'OR', // 两个条件满足其一即可 // 条件1:文章的主作者就是当前用户 array( 'key' => 'post_author', 'value' => $author_id, 'type' => 'numeric', 'compare' => '=' ), // 条件2:自定义字段匹配当前用户ID(替换成你的字段名) array( 'key' => 'your_custom_field_name', 'value' => $author_id, 'type' => 'numeric', 'compare' => '=' // 若字段存多个ID数组,改成'IN' ) ); // 将复合查询赋值给主查询 $query->set('meta_query', $meta_query); // 无需再单独设置author参数,因为已将post_author纳入复合条件 } }
几个关键点要注意:
!is_admin():避免影响后台的查询逻辑,只处理前台请求$query->is_main_query():确保修改的是页面的主查询,不会干扰侧边栏、小工具等次级查询'relation' => 'OR':这是核心,把两个条件从默认的“与”改成“或”,实现二选一匹配
这是第一个问题的具体落地场景,咱们只需要把自定义字段名换成你的co-author,再根据字段的存储方式调整细节:
情况1:co-author字段存储单个用户ID(单合著者场景)
直接复用上面的代码,把your_custom_field_name改成co-author即可。
情况2:co-author字段存储多个用户ID(多合著者场景)
如果是用数组存储(比如ACF的多用户字段会自动序列化存储),把compare改成'IN';如果是用逗号分隔的字符串(比如"12,34,56"),要使用LIKE查询,但得给ID加引号避免部分匹配(比如ID 1被误匹配到ID 12):
add_action('pre_get_posts', 'show_author_and_coauthor_posts'); function show_author_and_coauthor_posts($query) { if (!is_admin() && $query->is_main_query() && $query->is_author()) { $author_id = get_queried_object_id(); $meta_query = array( 'relation' => 'OR', // 条件1:作为主作者的文章 array( 'key' => 'post_author', 'value' => $author_id, 'type' => 'numeric', 'compare' => '=' ), // 条件2:作为合著者的文章(逗号分隔字符串存储) array( 'key' => 'co-author', 'value' => '"' . $author_id . '"', // 加引号避免部分匹配 'compare' => 'LIKE' ) ); $query->set('meta_query', $meta_query); // 移除默认的author参数,避免和复合查询冲突 $query->set('author', ''); } }
最后提个醒:修改主题文件前最好备份,或者用子主题来添加代码,避免主题更新后代码丢失哦。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

