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

WordPress多站点能否复用主站点文章表?无插件实现咨询

解决WordPress多站点子站点显示主站点指定文章的问题

看起来你已经找对了方向——pre_get_posts是实现这个需求的核心钩子,但可能在查询逻辑或多站点的博客切换上出了问题。我来帮你调整代码,实现子站点自动展示主站点中勾选了对应站点的文章:

完整实现代码

function gnl_site_query( $query ) {
    // 只处理前台主查询,避免影响后台和次要查询
    if ( is_admin() || ! $query->is_main_query() || is_singular() ) {
        return;
    }

    $current_blog_id = get_current_blog_id();
    // 仅在子站点执行逻辑
    if ( $current_blog_id !== 1 ) {
        // 切换到主站点,查询符合条件的文章ID
        switch_to_blog( 1 );
        
        // 替换成你实际使用的元字段键名
        $meta_key = '_show_on_sites';
        
        // 查询主站点中勾选了当前子站点的文章
        $post_ids = get_posts( array(
            'post_type'      => 'post', // 匹配你的文章类型,比如page或自定义类型
            'posts_per_page' => -1,
            'fields'         => 'ids', // 只获取ID,提升性能
            'meta_query'     => array(
                array(
                    'key'     => $meta_key,
                    // 因为多选框元字段通常存储为序列化数组,所以用LIKE匹配当前站点ID
                    'value'   => '"' . $current_blog_id . '"',
                    'compare' => 'LIKE'
                )
            )
        ) );
        
        // 切回当前子站点
        restore_current_blog();

        // 如果有符合条件的文章,修改查询参数;否则返回空结果
        if ( ! empty( $post_ids ) ) {
            $query->set( 'post__in', $post_ids );
            // 保持原有的排序规则(如果需要自定义排序可以调整这里)
            $query->set( 'orderby', 'date' );
            $query->set( 'order', 'DESC' );
        } else {
            // 设置一个不存在的ID,确保查询返回空
            $query->set( 'post__in', array( 0 ) );
        }
    }
}
add_action( 'pre_get_posts', 'gnl_site_query' );

关键细节说明

  • 博客切换处理:子站点无法直接读取主站点的元数据,所以必须用switch_to_blog(1)切换到主站点查询文章ID,之后用restore_current_blog()切回,避免影响后续功能。
  • 元字段查询逻辑:如果你的多选框元字段是用标准方式添加的(比如通过add_meta_box),它的值会以序列化数组存储在数据库中,所以用LIKE '"2"'来精确匹配数组中的站点ID(序列化后的数组元素会用双引号包裹数字)。
  • 查询范围控制:通过is_admin()、is_main_query()等条件,确保代码只影响前台的主文章列表查询,不会干扰后台编辑、搜索或其他次要查询。

可能的调整点

  1. 元字段键替换:把代码中的_show_on_sites替换成你实际使用的元字段名称(在添加自定义字段时定义的meta_key)。
  2. 文章类型适配:如果你的内容是页面(page)或自定义文章类型,把post_type参数改成对应的类型。
  3. 存储格式适配:如果你的元字段是存储为逗号分隔的字符串(比如"2,3"),可以把meta_query改成:
'meta_query' => array(
    array(
        'key'     => $meta_key,
        'value'   => ',' . $current_blog_id . ',',
        'compare' => 'LIKE'
    )
)

这样可以避免匹配到类似12、22这类包含目标数字的ID。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:43