You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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':这是核心,把两个条件从默认的“与”改成“或”,实现二选一匹配
2. 针对co-author自定义字段,修改作者页面展示所有作者/合著者内容

这是第一个问题的具体落地场景,咱们只需要把自定义字段名换成你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:07:30