应先停用目标站点插件主题并设blog_public=0,再用information_schema生成DROP语句批量删wp_2_*表,最后清理wp_usermeta/wp_site_meta中wp_2_%残留键值。
wp_blogs 表里删了站点,但 wp_2_posts 还在怎么办
wordpress 多站点网络中,直接从 wp_blogs 表删除记录只是“逻辑下线”,对应子站的全部数据表(如 wp_2_posts、wp_2_options)不会自动清理。残留表会持续占用磁盘、拖慢 show tables 查询、干扰备份与迁移。
实操建议:
- 先确认目标站点的
blog_id(比如是2),再检查是否存在wp_2_*前缀的表:SHOW TABLES LIKE 'wp_2\_%';
- 不要用
DROP TABLE wp_2_posts, wp_2_options, ...手动列全——容易漏表,且 WordPress 动态添加的表(如插件建的wp_2_wpforms_entries)无法预知 - 用 MySQL 生成批量 DROP 语句更可靠:
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name))<br>FROM information_schema.tables<br>WHERE table_schema = 'your_db_name'<br>AND table_name REGEXP '^wp_[0-9]+_.*$'<br>AND table_name LIKE 'wp_2\_%';然后复制结果执行
drop 表前必须停用对应站点的插件和主题
某些插件(如 WPML、WooCommerce Multivendor)会在站点删除后仍通过钩子访问其数据表;如果表已删但插件缓存未清,可能触发 PHP Fatal error: Call to a member function get() on null 或后台白屏。
实操建议:
- 进入网络管理后台 → “站点” → 编辑目标站点 → 在“设置”页把
blog_public设为0,并保存 - 手动停用该站点启用的所有插件:查
wp_2_sitemeta或wp_2_options中的active_plugins选项值,清空或设为a:0:{} - 切换回默认主题(如
twentynineteen),避免子站主题带自定义表或钩子依赖
wp_usermeta 和 wp_site_meta 里的残留关联怎么清
删完站点表后,wp_usermeta 里还留着大量 wp_2_capabilities、wp_2_user_level 这类键名;wp_site_meta 也可能有 wp_2_blog_public 等废弃字段。它们不报错,但会膨胀元数据表、影响用户查询性能。
实操建议:
- 用通配删除(注意备份):
DELETE FROM wp_usermeta WHERE meta_key REGEXP '^wp_[0-9]+_.*$' AND meta_key LIKE 'wp_2\_%';
-
wp_site_meta同理,但要先确认它存在(5.1+ 才默认启用):DELETE FROM wp_site_meta WHERE meta_key LIKE 'wp_2\_%';
- 别碰
wp_2_开头但不含下划线的键(如wp_2),那是旧版多站点的站点 ID 映射,删了会导致主站路由异常
为什么不能用 WP-CLI 的 site delete 命令直接干掉
wp site delete --slug=example 看似省事,但它默认只删 wp_blogs 和 wp_site 记录,不删子站数据表,除非加 --delete-tables 参数——而这个参数在 WP-CLI 2.7+ 才支持,且要求 MySQL 用户有 DROP 权限,很多托管环境(如 SiteGround、WP Engine)禁用该权限。
实操建议:
- 先运行
wp site delete --slug=example --dry-run看实际行为,别信文档版本 - 若托管环境限制权限,老老实实用上文的
information_schema方案,比反复提工单快 - 执行前务必 mysqldump 导出对应前缀的所有表,误删
wp_1_(主站)就彻底没救了
最麻烦的不是 DROP 表本身,而是得逐个验证每个插件是否悄悄写了独立表——比如 wp_2_wpforms_entry_notes 这种名字,根本不在 WordPress 官方表清单里。别偷懒跳过 SHOW TABLES LIKE 'wp_2\_%' 这一步。











