如何让WordPress插件的Composer脚本在顶级安装/更新时自动运行?
解决Composer顶级安装/更新时插件脚本不执行的问题
Composer默认不会自动触发依赖包内的post-install-cmd或post-update-cmd脚本,只有根项目的脚本会自动运行——这就是你在插件目录执行composer install能正常运行脚本,但在WordPress顶级目录执行时脚本没反应的核心原因。以下是几种可行的解决方案:
方案一:让用户在根项目的composer.json中手动添加触发脚本
这是最直接的方式,需要使用你插件的用户在他们的顶级composer.json里添加脚本,主动调用插件的自定义脚本:
{ "scripts": { "post-install-cmd": [ "@php vendor/your-plugin-slug/composer run install-mu-filter" ], "post-update-cmd": [ "@php vendor/your-plugin-slug/composer run install-mu-filter" ] } }
注意将your-plugin-slug替换成你插件在vendor目录中的实际文件夹名称。这种方式的好处是简单直接,但需要用户手动修改根配置。
方案二:使用Composer事件监听器(无需用户手动改根配置)
通过编写PHP类监听Composer的安装/更新事件,实现自动执行文件复制逻辑,这是更优雅的方案,不需要用户额外操作:
步骤1:创建事件监听器类
在你的插件目录中新建src/Composer/InstallerScript.php文件,内容如下:
<?php namespace YourPluginNamespace\Composer; use Composer\Script\Event; class InstallerScript { public static function installMuPlugin(Event $event) { // 获取vendor目录的绝对路径 $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir'); // 计算mu-plugins目录的绝对路径(假设根项目下的mu-plugins) $muPluginsDir = realpath($vendorDir . '/../mu-plugins'); // 若目录不存在则创建 if (!is_dir($muPluginsDir)) { mkdir($muPluginsDir, 0755, true); } // 源文件和目标文件的绝对路径 $sourceFile = realpath($vendorDir . '/your-plugin-slug/code/assets/mu/my-plugin-mu-plugin-file.php'); $destFile = $muPluginsDir . '/my-plugin-mu-plugin-file.php'; // 执行复制操作 if (file_exists($sourceFile)) { copy($sourceFile, $destFile); $event->getIO()->write('✅ 已将MU插件文件复制到mu-plugins目录'); } else { $event->getIO()->writeError('❌ 错误:未找到MU插件源文件'); } } }
将YourPluginNamespace替换成你的插件命名空间,your-plugin-slug替换成实际的插件目录名。
步骤2:修改插件的composer.json
更新插件的composer.json,添加自动加载配置、脚本定义和事件监听:
{ "autoload": { "psr-4": { "YourPluginNamespace\\": "src/" } }, "scripts": { "install-mu-filter": [ "\\YourPluginNamespace\\Composer\\InstallerScript::installMuPlugin" ] }, "extra": { "composer-events": { "post-install-cmd": [ "\\YourPluginNamespace\\Composer\\InstallerScript::installMuPlugin" ], "post-update-cmd": [ "\\YourPluginNamespace\\Composer\\InstallerScript::installMuPlugin" ] } } }
这样配置后,当用户在顶级目录执行composer install或composer update时,Composer会自动触发这个监听器类的方法,完成文件复制。
关键注意事项
- 路径处理:避免使用
../../这类相对路径,改用Composer提供的方法获取绝对路径,适配不同的项目结构。 - 权限问题:确保执行Composer的用户拥有
mu-plugins目录的读写权限,避免复制失败。 - 文件覆盖:如果
mu-plugins目录已存在同名文件,当前逻辑会直接覆盖,可根据需求添加判断逻辑(比如提示用户或跳过覆盖)。
内容的提问来源于stack exchange,提问作者O. Jones
相关产品推荐
相关产品推荐

