Composer 不能直接管理 WordPress 核心文件,因其非为替换 wp-admin/wp-includes 等系统目录设计,强行覆盖会导致权限、路径及钩子失效;官方无原生 wordpress-core type 支持,核心路径硬编码且与 Composer 自动加载冲突,wp-config.php 位置和常量依赖运行时环境,升级易丢失配置;推荐 Composer 管理插件/主题等依赖,WP-CLI 专职核心下载、更新与校验,二者职责分离。

Composer 不能直接管理 WordPress 核心文件——它不是为替换或覆盖 wp-admin、wp-includes 这类系统级目录设计的,强行用 composer install 覆盖会导致权限、路径、钩子失效等连锁问题。
为什么不能把 WordPress 核心当普通包用 Composer 安装?
WordPress 官方不提供 composer/installers 兼容的 type: wordpress-core 原生支持(虽有社区插件如 wpackagist,但本质是镜像索引,非官方维护)。核心文件结构硬编码依赖固定相对路径(比如 wp-settings.php 加载顺序),Composer 的自动加载机制与之冲突。
-
wp-config.php必须位于 Web 根目录,而 Composer 默认安装到vendor/ - 插件/主题激活依赖
WP_PLUGIN_DIR和WP_CONTENT_DIR的运行时定义,Composer 不参与该流程 - 升级时若用
composer update johnpbloch/wordpress替换整个wp/目录,会丢失.htaccess、自定义wp-content符号链接、甚至wp-config.php自定义常量
推荐方案:用 Composer 管理依赖,用 WP-CLI 管理核心
把 Composer 当作「项目依赖管理器」,WP-CLI 当作「WordPress 运行时操作工具」,二者职责分离:
- Composer 只管
plugins、themes、mu-plugins和开发工具(如wp-cli/wp-cli-bundle) - WP-CLI 负责下载、校验、升级、迁移核心文件:
wp core download、wp core update、wp core verify-checksums - 通过
wp config create或wp rewrite structure等命令初始化环境,避免手写配置出错
示例:在 composer.json 中声明 WP-CLI 并设为可执行命令
{
"require-dev": {
"wp-cli/wp-cli-bundle": "^2.9"
},
"scripts": {
"wp": "wp",
"wp-update-core": "wp core update --minor",
"wp-verify": "wp core verify-checksums"
}
}
之后可直接运行 composer run wp-update-core,实际调用的是 WP-CLI,而非 Composer 自身逻辑。
如果坚持用 Composer 下载核心:必须加约束和钩子
仅限开发环境快速搭建,生产环境不建议。需配合 composer/installers 和自定义安装路径,并用脚本补全缺失环节:
- 使用
johnpbloch/wordpress(社区维护,非官方)或roots/wordpress(Bedrock 方案) - 在
composer.json中强制指定安装路径:"wordpress": "web/wp"(需提前配置installer-paths) - 必须手动复制或符号链接
wp-config.php到 Web 根目录,并确保define('WP_SITEURL', ...)指向正确位置 - 每次
composer install后需运行wp rewrite structure '/%postname%/' --hard重写规则,否则 permalinks 失效
常见报错:Warning: require_once(/path/to/vendor/autoload.php): failed to open stream —— 因为 wp-settings.php 仍试图从默认位置加载 autoload.php,需在 wp-config.php 开头手动 require 正确路径。
WP-CLI 配合 Composer 的真实工作流
典型部署流程中,Composer 解决「什么版本的插件该装」,WP-CLI 解决「装到哪、怎么生效、是否完整」:
- CI/CD 中先
composer install --no-dev,再wp core download --version=6.4.3 --force - 用
wp plugin install --activate acf-pro --activate-network批量启用插件,比写composer require更可靠(因插件可能含私有 license key) - 数据库迁移用
wp search-replace 'http://dev.example.com' 'https://prod.example.com' --all-tables,这一步 Composer 完全不参与 - 升级前运行
wp core verify-checksums,失败则说明核心被手动修改过,此时composer update无法修复,必须人工介入
最易忽略的一点:WP-CLI 命令默认以当前用户权限运行,若 Web 服务器用 www-data 用户,而你用 sudo -u www-data wp ... 执行,务必确认 wp-config.php 中的 WP_CONTENT_DIR 路径对 www-data 可读写——否则插件更新会静默失败,日志里只显示 Could not create directory。










