
本文介绍如何在 wordpress 多站点网络(multisite)中实现多个域名共享同一份文章、页面及模板,避免内容重复存储,通过代码级同步机制或专业插件达成真正的“单源发布、多站共用”。
本文介绍如何在 wordpress 多站点网络(multisite)中实现多个域名共享同一份文章、页面及模板,避免内容重复存储,通过代码级同步机制或专业插件达成真正的“单源发布、多站共用”。
在 WordPress 多站点环境中,启用子域名或独立域名(如 site1.com 和 sub.site2.com)本身并不难,但默认情况下各站点的数据(文章、页面、自定义字段、分类等)完全隔离——这与“共享员工页、统一品牌模板”的业务需求相悖。虽然存在镜像类插件(如 Multisite Post Duplicator、WP All Import + Custom Logic),但多数仅做一次性复制,无法保证后续编辑的实时同步,且易造成数据冗余与维护混乱。
更稳健的方案是基于 save_post 钩子实现跨站点自动同步:当主站发布或更新某篇指定类型的内容(如页面 employees)时,系统自动将其结构化数据(标题、正文、元信息、分类)推送至其他关联站点,确保全网内容一致、ID 独立、SEO 友好。
以下为可直接集成到主题 functions.php 或专用插件中的核心同步逻辑(已适配 WordPress 6.x+):
if ( ! function_exists( 'sync_post_to_network_sites' ) ) {
add_action( 'save_post', 'sync_post_to_network_sites', 20, 2 );
function sync_post_to_network_sites( $post_id, $post ) {
// 跳过自动保存、修订版本及非发布状态
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( wp_is_post_revision( $post_id ) || 'publish' !== $post->post_status ) return;
// 防止递归触发(关键!)
remove_action( 'save_post', __FUNCTION__, 20 );
// 【配置】指定需同步的目标站点 ID(如主站 ID=1,子站 ID=2,3)
$target_blog_ids = [2, 3];
// 构建基础内容数组(排除不必要字段)
$sync_data = [
'post_author' => $post->post_author,
'post_date' => $post->post_date,
'post_content' => $post->post_content,
'post_title' => $post->post_title,
'post_excerpt' => $post->post_excerpt,
'post_name' => $post->post_name,
'post_type' => $post->post_type,
'post_status' => 'publish',
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
];
// 获取原始文章的分类与自定义字段
$terms = wp_get_object_terms( $post_id, 'category', [ 'fields' => 'slugs' ] );
$meta = get_post_custom( $post_id );
foreach ( $target_blog_ids as $blog_id ) {
switch_to_blog( $blog_id );
// 检查目标站是否已存在同 slug 的同类型内容(防重复)
$existing = get_posts([
'name' => $sync_data['post_name'],
'post_type' => $sync_data['post_type'],
'post_status' => 'publish',
'posts_per_page' => 1,
'fields' => 'ids'
]);
if ( ! empty( $existing ) ) {
restore_current_blog();
continue; // 跳过已存在项
}
// 插入新文章
$new_id = wp_insert_post( $sync_data );
if ( $new_id && ! is_wp_error( $new_id ) ) {
// 同步分类
if ( ! is_wp_error( $terms ) ) {
wp_set_object_terms( $new_id, $terms, 'category', false );
}
// 同步自定义字段(过滤 _wp_old_slug 等系统字段)
foreach ( $meta as $key => $values ) {
if ( in_array( $key, [ '_wp_old_slug', '_edit_lock', '_edit_last' ], true ) ) continue;
foreach ( $values as $value ) {
add_post_meta( $new_id, $key, $value );
}
}
}
restore_current_blog();
}
}
}✅ 关键注意事项:
- 务必测试环境先行:该代码会直接影响多站点数据库,请先在本地或 staging 环境验证;
- 精准控制同步范围:可在函数开头添加白名单判断(如 if ( 'page' !== $post->post_type || 'employees' !== $post->post_name ) return;),仅同步特定页面;
- 模板共享无需额外操作:所有站点共用同一套主题文件(启用网络级主题),只需确保主题在各站点中被激活;
- 媒体文件需手动处理:附件(图片/文件)不会自动同步,建议使用 WP Offload Media 或将媒体库设为网络级共享;
- 替代方案推荐:若开发资源有限,可优先尝试插件 Multisite Content Sync(支持双向/条件同步)或 Blog Copier(轻量级定时同步),降低维护风险。
综上,WordPress 多域名共享内容并非只能依赖插件妥协——通过合理钩子与 switch_to_blog() 机制,即可构建可控、可审计、低耦合的跨站内容中枢,真正实现“一处编辑、全域生效”。


















