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()等条件,确保代码只影响前台的主文章列表查询,不会干扰后台编辑、搜索或其他次要查询。
可能的调整点
- 元字段键替换:把代码中的
_show_on_sites替换成你实际使用的元字段名称(在添加自定义字段时定义的meta_key)。 - 文章类型适配:如果你的内容是页面(page)或自定义文章类型,把
post_type参数改成对应的类型。 - 存储格式适配:如果你的元字段是存储为逗号分隔的字符串(比如
"2,3"),可以把meta_query改成:
'meta_query' => array( array( 'key' => $meta_key, 'value' => ',' . $current_blog_id . ',', 'compare' => 'LIKE' ) )
这样可以避免匹配到类似12、22这类包含目标数字的ID。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

