如何在WordPress多站点子域名站点展示主站点自定义文章?
在WordPress多站点子域名展示主站点自定义文章的方案
嘿,这个需求我在项目里碰到过好几次,给你几个实用的解决方案,从代码实现到插件都有,你可以根据自己的情况选:
方法一:用WordPress内置函数(最推荐,原生无依赖)
WordPress多站点自带了站点切换的核心函数switch_to_blog(),可以临时切换到主站点去查询自定义文章,用完再切回子站点就行,完全不需要额外插件。
具体步骤:
- 打开子站点的主题文件(比如想在某个页面展示就改
page.php,想做自定义页面模板就新建template-custom-posts.php),插入以下代码:
// 先切换到主站点,主站点ID一般是1,不确定的话去网络后台站点列表里看,编辑主站点时地址栏?id=后面的数字就是ID switch_to_blog(1); // 配置查询参数,把your_custom_post_type改成你实际的自定义文章类型slug $main_site_posts = new WP_Query(array( 'post_type' => 'your_custom_post_type', 'posts_per_page' => 10, // 控制显示的文章数量 'post_status' => 'publish' // 只显示已发布的文章 )); // 循环输出文章内容 if ($main_site_posts->have_posts()) { echo '<div class="main-site-custom-posts">'; while ($main_site_posts->have_posts()) { $main_site_posts->the_post(); // 这里可以自定义输出的HTML结构,比如标题、摘要、缩略图都可以加 echo '<article>'; echo '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>'; echo '<p>' . get_the_excerpt() . '</p>'; echo '</article>'; } echo '</div>'; // 重置查询,避免影响子站点本身的内容 wp_reset_postdata(); } else { echo '<p>主站点暂无自定义文章</p>'; } // 切回当前子站点,这一步很重要,别忘了! restore_current_blog();
- 保存文件后,访问子站点对应的页面就能看到主站点的自定义文章了。
方法二:自定义REST API(适合前端异步加载)
如果你的子站点用了前端框架(比如Vue、React),或者想实现无刷新加载内容,可以在主站点注册一个REST API接口,然后子站点通过AJAX请求获取数据。
- 先在主站点的
functions.php里添加接口代码:
// 注册自定义REST API路由 add_action('rest_api_init', function() { register_rest_route('main-site/v1', '/custom-posts', array( 'methods' => WP_REST_Server::READABLE, // 允许GET请求 'callback' => 'fetch_main_site_custom_posts', 'permission_callback' => '__return_true' // 公开访问,需要权限的话可以改成自定义判断 )); }); // 接口回调函数,返回自定义文章数据 function fetch_main_site_custom_posts($request) { $per_page = $request->get_param('per_page') ?: 10; $posts = get_posts(array( 'post_type' => 'your_custom_post_type', 'posts_per_page' => $per_page, 'post_status' => 'publish' )); // 整理返回的数据格式 $response = array(); foreach ($posts as $post) { $response[] = array( 'id' => $post->ID, 'title' => get_the_title($post->ID), 'permalink' => get_permalink($post->ID), 'excerpt' => get_the_excerpt($post->ID), 'thumbnail' => get_the_post_thumbnail_url($post->ID) ); } return rest_ensure_response($response); }
- 然后在子站点的前端JS里请求这个接口:
// 假设页面上有个ID为custom-posts-container的容器用来放文章 const container = document.getElementById('custom-posts-container'); fetch('https://domainname.com/wp-json/main-site/v1/custom-posts') .then(res => res.json()) .then(posts => { let html = ''; posts.forEach(post => { html += ` <div class="post-item"> <h3><a href="${post.permalink}">${post.title}</a></h3> ${post.thumbnail ? `<img src="${post.thumbnail}" alt="${post.title}">` : ''} <p>${post.excerpt}</p> </div> `; }); container.innerHTML = html; }) .catch(err => console.log('加载主站点文章失败:', err));
方法三:用多站点插件(适合不想写代码的同学)
如果不想折腾代码,可以试试专门的多站点内容共享插件:
- Multisite Global Search:可以跨站点搜索并展示内容,支持自定义文章类型,设置好后就能在子站点搜索并显示主站点的自定义文章。
- Multisite Post Duplicator:可以把主站点的自定义文章复制到子站点,但不是实时同步,适合不需要实时更新的场景。
- 注意选插件的时候尽量挑维护活跃、用户量高的,避免兼容性问题。
几个重要的注意点
- 确认主站点的自定义文章类型注册时设置了
'public' => true,不然子站点没法访问到。如果用API的话,还要加'show_in_rest' => true。 - 如果自定义文章需要登录才能查看,记得调整代码里的权限逻辑,比如把REST API的
permission_callback改成判断用户是否有权限的函数。 - 文章数量多的话,记得加分页或者用缓存(比如WP Rocket、W3 Total Cache),避免拖慢子站点的加载速度。
内容的提问来源于stack exchange,提问作者Muktar Ali
相关产品推荐
相关产品推荐

