You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:40:43