WordPress 官方未提供 Composer 包,需用 johnpbloch/wordpress 等第三方包管理核心,并通过 composer/installers 将插件、主题安装到 web/wp-content 对应目录;wp-config.php 等定制文件需 Git 跟踪,更新后须手动同步入口文件。

composer install wordpress 会失败,因为 WordPress 官方不提供 composer 包
直接运行 composer create-project wordpress/wordpress 或类似命令会报错:找不到包。WordPress 核心本身未发布到 Packagist,也没有官方维护的 wordpress/wordpress Composer 包。你看到的某些教程用的其实是第三方镜像(比如 johnpbloch/wordpress),它只是定期同步官方 zip 包并打标签,并非 WordPress 官方行为。
所以第一步必须明确:你不是在“安装 WordPress”,而是在用 Composer 管理一个含 WordPress 的项目结构——核心文件由 Composer 下载,主题/插件可声明为依赖项。
- 推荐使用
johnpbloch/wordpress(最稳定,更新及时,支持 WP-CLI 兼容路径) - 避免用
roots/wordpress(已归档,不再维护) - 不要手动改
vendor/wordpress目录里的文件——它会被重写,所有定制应通过wp-content目录完成
wp-content 必须脱离 vendor,否则插件/主题无法被 WordPress 加载
Composer 默认把所有包装进 vendor/,但 WordPress 只从固定位置读取 wp-content/plugins 和 wp-content/themes。如果你把插件直接 require 进 vendor/,它们根本不会出现在后台列表里。
解决办法是用 composer/installers + 自定义安装路径,把插件、主题、mu-plugins 映射到正确的子目录:
{
"require": {
"johnpbloch/wordpress": "^6.5",
"wpackagist-plugin/advanced-custom-fields": "^6.3",
"wpackagist-theme/twentytwentyfour": "^1.0"
},
"extra": {
"installer-paths": {
"web/wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"web/wp-content/themes/{$name}/": ["type:wordpress-theme"],
"web/wp-content/mu-plugins/{$name}/": ["type:wordpress-muplugin"]
}
}
}
-
wpackagist-plugin/和wpackagist-theme/是 WPACKAGIST 提供的镜像源,自动同步 wordpress.org 上的公开插件/主题 -
web/是你的 webroot,需与 Web 服务器配置一致;若用public/,就全换成public/wp-content/... - 别漏掉
"type:wordpress-plugin"这类 type 声明——它是composer/installers匹配路径的关键
wp-cli 命令在 composer 管理项目中容易找不到 wp-config.php
执行 wp plugin list 或 wp rewrite structure 时提示 Could not find wp-config.php,是因为 WP-CLI 默认从当前目录向上找 wp-config.php,而 Composer 项目结构里它通常在 web/ 下,且 wp-settings.php 路径可能被改写。
有三个实际可用的解法:
- 进
web/目录再运行wp命令(最简单,适合本地开发) - 加
--path=web/参数:例如wp plugin list --path=web/ - 设环境变量
WP_CLI_PHP_ARGS="-d auto_prepend_file=$(pwd)/web/wp-config.php"(不推荐,易出错)
注意:wp core download 这类命令在 Composer 项目里完全不需要——核心由 johnpbloch/wordpress 提供,手动下载反而破坏一致性。
更新 WordPress 核心时,vendor 中的文件不会自动复制到 web/
运行 composer update johnpbloch/wordpress 后,新版本只更新了 vendor/johnpbloch/wordpress 里的代码,但 web/ 下的 index.php、wp-load.php 等入口文件不会自动同步。这些文件必须手动或通过脚本复制过去,否则站点会 500 或白屏。
标准做法是加一个 post-update-cmd 脚本:
"scripts": {
"post-update-cmd": [
"cp -R vendor/johnpbloch/wordpress/* web/"
]
}
- Linux/macOS 用
cp,Windows 用户需换xcopy或用roave/composer-bundle类工具 - 复制前建议先
rm -f web/index.php web/wp-*.php web/license.txt,避免残留旧文件干扰 - 这个步骤极易被忽略——很多团队更新后发现后台还能进,但前台挂了,就是入口文件没更新
真正麻烦的是 wp-content 之外的定制:比如修改过的 wp-config.php、自定义 wp-settings.php 补丁、或 .htaccess 规则,这些都不会被 Composer 管理,得靠 Git 跟踪和人工合并。











