wordpress插件必须安装到wp-content/plugins/才能被识别,而composer默认装入vendor/;需配置composer/installers插件、声明type为wordpress-plugin,并在extra.installer-paths中映射路径如"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],三者缺一不可。

WordPress插件目录不是 Composer 的默认安装路径
Composer 默认把包装进 vendor/,而 WordPress 插件必须放在 wp-content/plugins/ 才能被识别。直接运行 composer install 不会把插件放进那里——你得改 composer.json 的 installer-paths 配置,让特定包(比如 johnpbloch/wordpress-core 或自定义插件)走指定路径。
用 composer/installers 插件接管路径分发
这个插件是关键中间层,它扩展了 Composer 的安装逻辑,支持 wordpress-plugin、wordpress-theme 等类型。没它,installer-paths 会完全失效。
实操建议:
- 先执行
composer require composer/installers - 在
composer.json中声明插件类型和路径映射,例如:
{
"type": "project",
"require": {
"composer/installers": "^2.0"
},
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"wp-content/themes/{$name}/": ["type:wordpress-theme"]
}
}
}
注意:{$name} 是包名(如 advanced-custom-fields-pro),不是文件夹名;确保你要安装的包在 composer.json 的 require 里明确写了 "type": "wordpress-plugin",否则匹配不上。
第三方插件包没声明 type 怎么办
很多开源插件(比如 wp-cli/wp-cli-bundle)或私有 Git 包默认是 library 类型,composer/installers 不认——它们不会进 wp-content/plugins/。
解决办法只有两个:
- 用
repositories手动覆盖包信息,在composer.json里加一段:
"repositories": [
{
"type": "package",
"package": {
"name": "wpackagist-plugin/woocommerce",
"version": "8.9.0",
"type": "wordpress-plugin",
"dist": {
"url": "https://downloads.wordpress.org/plugin/woocommerce.8.9.0.zip",
"type": "zip"
}
}
}
]
- 或者 fork 插件仓库,改它的
composer.json,加上"type": "wordpress-plugin",再指向你的 fork 地址
别指望 installer-paths 能靠包名模糊匹配——它只看 type 字段,不看 vendor 名或目录结构。
wp-content 目录不在项目根目录时怎么处理
如果 WordPress 安装在子目录(比如 ./public/wp/),或 wp-content 被移到了别处(通过 WP_CONTENT_DIR 定义),installer-paths 里的相对路径就失效了。
此时不能硬写 ../public/wp/wp-content/plugins/ 这种路径——Composer 不解析 PHP 常量,也不读 wp-config.php。
可行做法:
- 用符号链接:在项目根下建
wp-content→ 指向真实位置,保持路径一致 - 或改用
post-autoload-dump脚本,在composer.json的scripts里写个移动逻辑(但要小心重复执行风险)
最稳的方式其实是统一项目结构:让 composer.json 和 wp-content 在同一仓库层级下,否则每次部署都要额外同步路径,容易漏掉。
真正卡住人的往往不是配置写法,而是没意识到 type 字段必须存在、composer/installers 必须显式 require、以及 wp-content 的物理位置必须和配置路径对得上——这三个点错一个,插件就安静地躺在 vendor/ 里,连报错都不会有。











