
本文介绍如何在 wordpress 多站点网络(multisite)中实现多个域名共享同一套文章、页面和模板,避免内容重复发布,通过自定义钩子同步核心内容,并提供可扩展的安全代码示例。
本文介绍如何在 wordpress 多站点网络(multisite)中实现多个域名共享同一套文章、页面和模板,避免内容重复发布,通过自定义钩子同步核心内容,并提供可扩展的安全代码示例。
在 WordPress 多站点环境中,启用多域名(如 example.com 和 blog.example.com 或完全独立的 brand-a.com / brand-b.com)本身是可行的,但默认情况下各站点内容(文章、页面、分类、自定义字段等)相互隔离。若需实现“一份编辑、多站共用”的效果——例如全局统一的「团队介绍」页面、「服务条款」或「公司简介」——则需突破默认架构限制。
最稳妥的路径是利用 WordPress Multisite 的 switch_to_blog() 机制,在主站发布/更新内容时,自动将指定类型的内容(如特定页面、自定义文章类型)同步至其他关联站点。以下是一个生产就绪的轻量级实现方案:
生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
✅ 核心逻辑说明
- 监听 save_post 钩子,在文章/页面状态变为 publish 时触发;
- 跳过自动保存(DOING_AUTOSAVE)及非已发布状态,防止误操作;
- 使用 switch_to_blog() 切换目标站点上下文,调用 wp_insert_post() + wp_set_object_terms() + add_post_meta() 完整复刻内容;
- 自动跳过同 slug 已存在内容,避免冲突;支持手动配置目标站点 ID 数组(如 [2, 3]);
- 关键安全防护:临时移除自身钩子,防止递归调用导致内存溢出(Maximum function nesting level reached)。
? 示例代码(推荐放入主题 functions.php 或专用插件)
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 ( 'publish' !== $post->post_status ) return;
// 防止递归:临时解绑当前钩子
remove_action( 'save_post', __FUNCTION__, 20 );
// 【关键配置】指定需同步的目标站点 ID(对应 wp_blogs 表中的 blog_id)
$target_blog_ids = [2, 3]; // 替换为你的实际站点ID
// 构建基础文章数据(排除ID、修改时间等动态字段)
$post_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_status' => 'publish',
'post_name' => $post->post_name,
'post_type' => $post->post_type,
];
// 获取分类、标签及自定义字段
$terms = wp_get_object_terms( $post_id, get_object_taxonomies( $post->post_type, 'names' ), [
'fields' => 'all_with_object_id'
] );
$meta = get_post_custom( $post_id );
foreach ( $target_blog_ids as $blog_id ) {
switch_to_blog( $blog_id );
// 检查同 slug 内容是否已存在(避免覆盖)
$existing = get_posts( [
'name' => $post_data['post_name'],
'post_type' => $post_data['post_type'],
'post_status' => 'publish',
'posts_per_page' => 1,
'fields' => 'ids'
] );
if ( ! empty( $existing ) ) {
restore_current_blog();
continue;
}
// 插入新文章
$new_id = wp_insert_post( $post_data );
if ( ! is_wp_error( $new_id ) && ! empty( $terms ) ) {
foreach ( $terms as $term ) {
wp_set_object_terms( $new_id, $term->term_id, $term->taxonomy, true );
}
}
// 同步自定义字段(过滤系统保留字段)
if ( ! empty( $meta ) ) {
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, maybe_unserialize( $value ) );
}
}
}
restore_current_blog();
}
}
}⚠️ 重要注意事项
- ID 映射需准确:务必通过数据库 wp_blogs 表或 WP-CLI 命令 wp site list --format=csv 确认目标站点 blog_id,错误 ID 将导致同步失败;
- 模板与主题一致性:共享内容的前提是所有站点使用相同主题或兼容的模板结构(如 page-employees.php 在各站均存在),否则前端渲染可能异常;
- 性能与扩展性:该方案适用于中小规模网络(≤5 个站点)。若需高频同步或复杂逻辑(如按分类/标签规则筛选、双向同步、版本回滚),建议选用专业插件(如 Multisite Content Sync、WP All Import Pro);
- 备份与测试:上线前务必在开发环境完整测试,开启 WP_DEBUG_LOG 记录潜在错误;
- 权限控制:仅对管理员或特定角色触发同步(可在函数开头添加 current_user_can('manage_network') 判断)。
通过此方案,你既能保持 WordPress Multisite 的架构优势,又能以最小侵入方式实现跨域名内容复用,真正达成「一处维护、全域生效」的运营目标。

















