去年这个站装了 23 个插件。后台打开要三秒,WordPress 一更新就有人白屏,最离谱的一次是某个插件自动升级后整个站点 500。

现在只剩 5 个插件,另外 18 个功能全在 wp-content/mu-plugins/ 里,一共 6 个文件。

一、mu-plugins 是什么

WordPress 启动时会扫描 wp-content/mu-plugins/ 目录,把里面所有 .php 文件全部加载。没有开关,没有启用停用,没有更新提示。

三个必须记住的规则:

  • 只加载这个目录下的 *.php,改个后缀就等于停用
  • 不递归子目录,子目录里的文件不会自动加载
  • 加载时机在普通插件之前,代码一执行就已经生效

第三条是它最大的价值。普通插件要等 plugins_loaded 钩子,mu-plugins 更早,所以它能改的东西更多,也更不容易被别的插件抢了执行顺序。

二、哪些该搬,哪些别搬

功能 适合搬吗 原因
图片灯箱 适合 逻辑简单,不需要后台开关
代码高亮 适合 只输出 CSS 和 JS,一次写完不用改
SEO 的 noindex 规则 适合 规则固定,越少改动越好
蜘蛛日志 适合 自己写才拿得到想要的数据
缓存插件 不适合 涉及页面规则、清缓存、兼容性,太复杂
支付接口 不适合 出问题赔钱,必须用有人维护的
对象存储 不适合 SDK 会升级,自己维护成本高

判断标准就一条:这个功能需不需要后台开关。不需要,就该搬。

三、目录怎么组织

因为不递归,子目录要自己 include。我的做法是留一个 loader 文件:

wp-content/mu-plugins/
├── ysw-loader.php
├── ysw-lightbox.php
├── ysw-code.php
├── ysw-spider-log.php
└── parts/
    └── ysw-seo-fix.php

ysw-loader.php 的内容:

<?php
foreach (glob(__DIR__ . '/parts/*.php') as $f) {
    require_once $f;
}

glob 只会匹配 parts/ 下的文件,不会把 loader 自己再加载一遍,不会死循环。

四、命名必须带前缀

mu-plugins 没有沙箱。函数名撞了就是 fatal error,表现是全站白屏,连后台都进不去。

所以每个函数、每个全局变量都要带前缀:

function ysw_lightbox_render() { ... }
define('YSW_LIGHTBOX_VER', '6.1');

不要用 init_xxx、get_xxx、render_xxx 这种名字。主题和插件里几乎肯定有同名的。

五、一个真实例子

原来用的某灯箱插件,压缩后 40 KB JS 加 12 KB CSS,每次访问都要下载。

而我只用到一个功能:点图片全屏看大图。

自己写一个,挂在 wp_footer:

add_action('wp_footer', function () {
    if (!is_singular()) return;
    echo '<style>...</style>';
    echo '<script>...</script>';
});

最终 3.8 KB,gzip 后 1.4 KB。少了两个 HTTP 请求,也少了插件的自动更新风险。

六、怎么调试

mu-plugins 没有"启用成功"的提示,也没法在后台点停用。出错了只能看两个地方:

  1. PHP 错误日志:/www/wwwlogs/php-error.log,或者宝塔面板的「网站 → 错误日志」
  2. 临时加 error_log() 打点,看变量到底传进来没有

最常见的错误是少了个分号、括号不配对、函数名拼错,表现全是整站白屏。所以每次改完先在命令行跑一遍语法检查:

/www/server/php/81/bin/php -l /www/wwwroot/站点/wp-content/mu-plugins/ysw-xxx.php

输出 No syntax errors detected 再上传,能省掉 90% 的白屏。

七、怎么停用

删文件,或者移出目录:

mv ysw-lightbox.php ../disabled/

不建议改后缀来停用。改成 .bak 确实不加载了,但过两天你自己都忘了,然后排查半天"为什么功能没了"。

我踩过这个坑:一个 noindex 插件被改成 .php.bak 放了一个月,后来站点冒出一堆垃圾页被收录,查了两小时日志才发现那个文件根本没被加载。

八、代价

不是没有缺点:

  • 没有版本管理界面,改了什么只能看 git 记录或者文件修改时间
  • 没人帮你测兼容性,WordPress 大版本升级要自己先跑一遍
  • 换主题的时候这些代码不会跟着走,得手动迁移

所以我留了 5 个插件没搬:缓存、安全、支付、对象存储、SEO 主插件。这些要么更新频繁,要么逻辑复杂,自己重写不值当。

mu-plugins 适合放"自己写的小功能",不适合放"别人维护的复杂系统"。分界线就是:这段代码出问题,你三分钟能不能看懂。

俗人源码网免责声明:

1、本站所有资源均收集于互联网,分享目的仅限学习与参考。如有侵权,请联系 1685698671@qq.com 及时删除!

2、本站资源不保证完整性和安全性,下载后请自行检测。使用过程中出现的任何问题均与本站无关,敬请自行处理。

3、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。