WordPress 多域名共享内容与模板的实现方案

秋雪小哥_8056

秋雪小哥_8056

2026-04-09

441人浏览

原创

WordPress 多域名共享内容与模板的实现方案

本文介绍如何在 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+):

Wordpress OAuth
Wordpress OAuth

启动并完成 WordPress.com OAuth 认证,通过 REST API 发布文章。适用于需要生成授权链接、交换授权码等场景。

下载
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() 机制,即可构建可控、可审计、低耦合的跨站内容中枢,真正实现“一处编辑、全域生效”。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

12504

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

7221

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2235

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4548

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5254

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

4131

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5977

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4702

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12482

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何在 Windows 11 上安装 XAMPP
如何在 Windows 11 上安装 XAMPP

共1课时 | 235人学习

第二十三期_前端开发
第二十三期_前端开发

共98课时 | 12.1万人学习