去年这个站装了 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 没有"启用成功"的提示,也没法在后台点停用。出错了只能看两个地方:
- PHP 错误日志:
/www/wwwlogs/php-error.log,或者宝塔面板的「网站 → 错误日志」 - 临时加
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、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。


评论(0)