Composer无法直接安装WordPress核心,因官方未发布composer包;应使用Bedrock模板通过create-project初始化,并用composer管理WP核心、插件及主题依赖。

Composer 本身不安装 WordPress,它只安装符合 Composer 规范的 PHP 包;而默认的 WordPress 官方发布包不是 Composer 包——所以直接 composer require wordpress/wordpress 会失败或装错东西。真正可行的路径是:用 Bedrock 项目结构 + composer create-project 初始化,再通过 composer install 管理依赖(含 WP 核心、插件、主题)。
为什么不能直接 composer require wordpress/core
WordPress 官方没有发布 wordpress/core 这个 Composer 包;社区维护的 johnpbloch/wordpress 或 roots/wordpress 才是实际可用的镜像包,且它们只提供核心文件,不含 wp-config.php 和 webroot 结构。Bedrock 正是为补全这套缺失的工程化能力而生——它定义了目录约定、环境配置方式和自动加载逻辑。
-
johnpbloch/wordpress是最接近官方发布的镜像,更新及时,但无内置钩子 -
roots/wordpress是 Bedrock 官方绑定的变体,支持wp core download后自动 symlink,但版本同步略滞后 - 直接
require会导致wp-content与核心混在一起,破坏 Bedrock 的分离原则
用 composer create-project 初始化 Bedrock
这是唯一推荐的起点。Bedrock 本身是个模板项目,不是库,不能 require 进现有项目——否则 web/、config/、.env 等关键结构会缺失或错位。
- 运行:
composer create-project roots/bedrock my-wordpress-site - 完成后进入目录,
cp .env.example .env并填写数据库、密钥等 -
WP_HOME和WP_SITEURL必须设为生产域名(如https://example.com),不能留空或写localhost,否则后台链接和媒体路径会出错 - 不要手动修改
vendor/roots/wordpress下的文件——所有定制应通过wp-content下的插件/主题完成
添加插件或主题时,必须用 composer require 而非手动复制
Bedrock 的 wp-content 是由 Composer 自动生成的:插件和主题的源码来自 Packagist 或自建 VCS 仓库,最终被软链或复制到 web/app/plugins/ 或 web/app/themes/。手动放文件进去,下次 composer install 会被清掉。
- 装官方插件:
composer require wpackagist-plugin/advanced-custom-fields-pro(需先加wpackagist.org为 repo) - 装私有主题:
composer require myorg/my-theme:dev-main,并在composer.json中声明"repositories"指向 Git URL - 若插件含 JS/CSS 构建流程,确保其
composer.json里有"type": "wordpress-plugin",否则 Bedrock 的自动加载器不会识别
wp-cli 在 Bedrock 中必须走 ./vendor/bin/wp
全局 wp 命令无法感知 Bedrock 的 .env 和目录结构,执行 wp plugin list 会报错 “Error: This does not seem to be a WordPress installation.”
- 始终用项目内路径:
./vendor/bin/wp plugin list --path=web/ - 如果提示
Missing argument: --path,说明没传--path=web/——Bedrock 的 webroot 是web/,不是根目录 - 运行
wp rewrite structure '/%postname%/'前,先确认web/.htaccess可写,且 Apache 已启用mod_rewrite
最易被忽略的是环境变量加载时机:Bedrock 的 config/environments/production.php 会在 wp-settings.php 加载前生效,但如果你在 wp-config.php 里写了硬编码的 DB_NAME,就会覆盖 .env 的值——所有配置必须走 getenv() 或 $_ENV,不能写死。










