站群管理插件:跨站分发、双向同步与媒体随文复制

一个多站点运营团队给自己写的 WordPress 插件:在主站写一次,分发到任意分站;分站改完能推回主站;图片跟着文章一起走。

事实卡

形态 WordPress 插件,仅限 Multisite,必须网络启用
版本 v1.1.0(GPL-2.0-or-later)
兼容 WordPress 5.9+ / PHP 7.4+,实测至 WP 6.7
规模 15 个类,约 4,900 行 PHP,2 张自建数据表
实际部署 9 个站点(1 主站 + 8 子站),全部在线运行
接口 后台 UI + REST 只读统计端点(snm/v1/network-stats,JWT 鉴权,10 分钟缓存)

背景:多站点运营真正的成本在“第二份”

做多站点的人最初都以为成本在建站。实际不是——成本在建完之后:同一篇内容要在 N 个站上存在,每一次修改都要改 N 次。我们试过、也评估过三种常见做法,每一种都只解决一半:

  • 手动复制粘贴:文字能粘,图片要重传,改一次重复 N 次,规模一上来就不可维护。
  • RSS / 采集拉取:拿不到草稿和定时状态,正文结构被二次解析破坏,媒体还得重新下载。
  • 单向镜像:分站只读,分站的原创内容永远回不来,等于放弃了分站的编辑能力。

我们要的不是“同步”,是分发 + 回流:内容可以往下走,也可以往上走,但两条路都不能自己失控。

四个关键决策

1. 分发关系双写。关系同时存全局表 wp_snm_relations(跨站一次查询可答)和 post meta _snm_children / _snm_origin(编辑页 O(1) 定位)。用写入冗余换读取性能——在读远多于写的后台场景里划算。

2. 媒体走同服务器文件直拷,绝不自请求。用 HTTP 去下载源站自己的图片,等于占着 PHP-FPM 进程再请求自己,站点一多进程池直接假死——这是同类插件最常见的死法。实际做法:copy() 直拷 → wp_insert_attachment() → 生成各尺寸,零网络开销;代价是要求同文件系统,这个限制我们写出来而不是藏起来。

3. 放弃“全自动双向”,改成显式按钮。全自动双向同步是所有同步系统的坟场。最终方案:正向自动、反向只允许人工点“推送回源站”,配三层防循环——进程内保护栈(挡递归)、site transient 关系锁(挡并发)、_snm_synced_at 标记(挡回响),三层职责不同、缺一不可。

4. 分类靠“同名映射”,不搬 term_id。不同站点的 term_id 完全独立,按「名称 + 分类法」查找复用、不存在则创建,结果缓存进 term meta;媒体同理用映射表去重——同一张图分发到 5 个站,第二次同步不会再变 10 份。幂等不是优化项,是这类插件的生存条件。

撞到过的两个硬限制

聚合视图有性能天花板。“全站文章总览”要跨 N 个站查表,站点越多越慢,这是架构性的、优化不掉的。所以设置里直接给了「总览聚合站点上限」,超过时关闭“全部站点”视图——宁可少一个视图,也不给一个转圈的后台。

必须网络启用。插件依赖 switch_to_blog、site transient、全局表,单站环境里这些不存在或语义不同。激活时直接拦下来并给出提示,不让它半死不活地跑。

现在能做什么

  • 跨站分发:编辑页勾选目标站,每站可独立设状态(跟随源 / 直接发布 / 存草稿),支持定时文章
  • 自动同步:源文章保存后同步到全部分站副本,可按站取消
  • 双向回流:分站副本一键推回源站(显式触发,三层防循环);分站原创文章可反向采集回主站
  • 全站总览:跨站搜索、筛选、批量改状态、批量同步、批量采集
  • 媒体随文同步:正文图 / 附件 / 特色图随文复制并重写 URL,映射去重;共享媒体库
  • 仪表盘与日志:站点 / 文章 / 媒体 / 活跃分发关系统计,全部分发操作可追溯

实际运行情况

部署在 9 站 Multisite 网络上,网络内容 253 篇(203 已发布 + 50 草稿)、280 个媒体文件、5,139 浏览量,覆盖小说、漫画、视频、游戏、校园、学习、应用、AI 九条垂类。这些数字都能当场验证:随便挑一个子站,未登录请求 GET /wp-json/snm/v1/network-stats,返回的是插件自己的 snm_forbidden 而不是 WordPress 默认错误——说明路由已注册、权限回调已生效。

一句实话:截至本文写作,跨站分发在真实内容上还没有跑过一单——关系表 active_relations = 0,分发日志为空。所以这一页现在证明的是工程完成度(9 站部署、总览与统计跑通、四类分发模式齐备、三层防循环有实现),而不是生产验证。访客迟早会去查这个接口,与其让他自己发现,不如先讲清楚。下一步是把 3–5 篇内容在 2–3 个站上真跑一轮。

已知不足

  • 仅支持 Multisite,单站用户激活即停用
  • 媒体直拷要求同服务器文件系统,跨机部署时媒体走降级路径
  • 没有自动化测试,目前靠四条主链路手工回归(分发 / 双向 / 媒体 / 删除级联)

想用的话

把目录放进 /wp-content/plugins/ → 网络管理 → 插件 → 网络启用。首次激活自动建表(wp_snm_relations / wp_snm_logs)并写入默认设置。

本插件列入免费开放下载(A 级):加微信 xin103021(注明来意)获取发布包与使用文档,反馈同走该微信。

插件的定位:这是“一次建设、多站分发”能力的载体。想看它撑起来的站点矩阵,见网站案例里的开心站群。

← 返回插件案例