Установка WordPress через Composer
В этой статье разберем, как установить WordPress через Composer, зафиксировать версию ядра и не хранить его файлы в Git.
Рассмотрим два варианта:
- классическая структура, когда файлы ядра WordPress копируются в корень проекта;
- установка ядра WordPress в отдельную директорию, например
wp.
Зачем устанавливать WordPress через Composer
Установка WordPress через Composer имеет смысл, когда сайт разрабатывается как проект с контролем версий и управляемым деплоем:
- код хранится в Git;
- обновления через админку отключены;
- ядро, плагины и другие зависимости устанавливаются при сборке;
- изменения сначала проверяются, а затем разворачиваются на сервере.
В таком проекте WordPress становится обычной зависимостью, а не частью исходного кода.
Это дает несколько преимуществ:
- версия ядра фиксируется в
composer.lock; - локальная среда, staging и production получают одинаковую версию WordPress;
- проект можно восстановить командой
composer install; - файлы WordPress Core не хранятся в Git и не попадают в изменения;
- репозиторий остается меньше и чище.
Если сайт обновляется через админку, не хранится в Git и не использует процесс сборки и деплоя, установка WordPress через Composer обычно не нужна.
Composer-репозиторий WordPress
В примерах будем использовать Composer-репозиторий doiftrue/wordpress-composer-repo. Он позволяет подключить ядро WordPress как Composer-зависимость и загружает официальные ZIP-архивы WordPress.
В репозитории есть три варианта дистрибутива:
full- полный WordPress, включаяakismetиhello.php;new-bundled- WordPress безakismetиhello.php;no-content- WordPress без директорииwp-content.
Для большинства проектов удобнее использовать:
new-bundled, если WordPress копируется в корень проекта;no-content, если ядро WordPress устанавливается в отдельную директорию./wp.
repositories в composer.json - это список источников для поиска пакетов.
Официального Composer-пакета WordPress на Packagist нет. Поэтому в composer.json нужно добавить отдельный источник:
"repositories": [
{
"type": "composer",
"url": "https://raw.githubusercontent.com/doiftrue/wordpress-composer-repo/main/repo/new-bundled"
}
],Альтернативные варианты пакетов для установки WordPress через композер смотрите ниже в разделе Альтернатива.
Вариант 1 - установка WordPress в корень проекта
При классической структуре файлы ядра WordPress находятся в корне проекта:
. ├── vendor/ ├── wp-admin/ ├── wp-content/ ├── wp-includes/ ├── index.php ├── composer.json ├── composer.lock ├── wp-config.php ├── wp-load.php └── wp-login.php
Классическая структура лучше подходит для существующих сайтов, где WordPress уже установлен в корне проекта. Такая установка через Composer не меняет привычные пути WordPress.
Плюсы:
- максимальная совместимость с плагинами;
- не нужно менять пути и URL через константы;
- проще внедрить в существующий проект.
Минус:
- файлы ядра WordPress лежат вперемешку с файлами проекта.
composer.json
Для классической структуры используем репозиторий new-bundled и копируем файлы ядра из vendor/wordpress/wordpress в корень проекта через post-autoload-dump.
{
"repositories": [
{
"type": "composer",
"url": "https://raw.githubusercontent.com/doiftrue/wordpress-composer-repo/main/repo/new-bundled"
}
],
"require": {
"wordpress/wordpress": "~6.3.0"
},
"scripts": {
"post-autoload-dump": "rsync -a --exclude={wp-content/,wp-config-sample.php} ./vendor/wordpress/wordpress/* ./"
}
}
Скрипт post-autoload-dump запускается автоматически после команд:
composer install composer update
После установки WordPress сначала появится в директории:
vendor/wordpress/wordpress
Затем rsync скопирует файлы WordPress Core в корень проекта, исключая wp-content и wp-config-sample.php.
Для этого варианта на сервере должен быть доступен rsync.
.gitignore
Чтобы файлы ядра не попали в Git, можно использовать такой .gitignore:
/vendor/ /index.php /license.txt /readme.html /wp-activate.php /wp-blog-header.php /wp-comments-post.php /wp-config-sample.php /wp-config.php /wp-cron.php /wp-links-opml.php /wp-load.php /wp-login.php /wp-mail.php /wp-settings.php /wp-signup.php /wp-trackback.php /xmlrpc.php /wp-admin/ /wp-includes/ /wp-content/* !/wp-content/ /wp-content/plugins/* !/wp-content/plugins/ !/wp-content/plugins/YourCustomPluginName/ /wp-content/themes/* !/wp-content/themes/ !/wp-content/themes/YourCustomTheme/
Если нужно добавить в репозиторий новую тему или плагин, добавьте исключение:
!/wp-content/plugins/my-plugin/ !/wp-content/themes/my-plugin/
Символ ! отменяет правило игнорирования для конкретной директории.
Вариант 2 - установка WordPress в отдельную директорию
В этом варианте ядро WordPress устанавливается в отдельную директорию wp, а wp-content остается в корне проекта:
. ├── index.php ├── composer.json ├── composer.lock ├── vendor/ ├── wp/ # Ядро WordPress ├── wp-config.php └── wp-content/ ├── mu-plugins/ ├── plugins/ ├── themes/ └── uploads/
Этот вариант лучше подходит для новых проектов.
Плюсы:
- файлы ядра отделены от кода проекта.
- удобнее работать с темами, плагинами и
wp-content. - меньше риск случайно затронуть файлы проекта при обновлении WordPress.
Минусы:
- нужно настроить
index.php. - нужно задать константы путей и URL в
wp-config.php. - старые или плохо написанные плагины могут ожидать стандартную структуру файлов.
Админка в такой структуре будет доступна по адресу:
https://example.com/wp/wp-admin
composer.json
Для установки WordPress в отдельную директорию используем репозиторий no-content и пакет composer/installers.
Вариант no-content содержит файлы ядра WordPress без директории wp-content.
{
"repositories": [
{
"type": "composer",
"url": "https://raw.githubusercontent.com/doiftrue/wordpress-composer-repo/main/repo/no-content"
}
],
"require": {
"wordpress/wordpress": "~6.3.0",
"composer/installers": "*"
},
"extra": {
"installer-paths": {
"wp/": [
"wordpress/wordpress"
]
}
},
"config": {
"allow-plugins": {
"composer/installers": true
}
}
}
После этого выполним:
composer install
Composer установит WordPress в директорию wp/, указанную в extra.installer-paths для пакета wordpress/wordpress.
.gitignore
/vendor/ /wp/ /wp-content/* !/wp-content/ !/wp-content/index.php !/wp-content/mu-plugins/ !/wp-content/plugins/ !/wp-content/themes/
Если нужно добавить конкретную директорию из wp-content в Git, добавьте исключение:
!/wp-content/plugins/YourCustomPluginName/ !/wp-content/themes/YourCustomTheme/
Символ ! отменяет правило игнорирования для конкретной директории.
index.php
Точка входа WordPress - файл index.php, поэтому его нужно создать в корне проекта.
Создайте index.php с таким кодом:
<?php define( 'WP_USE_THEMES', true ); require __DIR__ . '/wp/wp-blog-header.php';
Это стандартный index.php, изменен только путь к wp-blog-header.php - он указывает на директорию wp.
wp-content
Ядро WordPress находится в директории wp, а темы, плагины и загрузки будут храниться в корневой директории wp-content.
Создайте директорию wp-content в корне проекта:
wp-content/ ├── index.php ├── mu-plugins/ ├── plugins/ ├── themes/ └── uploads/
Темы и плагины проекта будут храниться здесь, а не внутри ./wp/wp-content.
wp-config.php
Чтобы WordPress нашел ядро в директории wp и корневую директорию wp-content, нужно настроить wp-config.php.
Создайте wp-config.php в корне проекта и добавьте в него следующие константы:
define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] ); define( 'WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/wp' ); define( 'WP_CONTENT_DIR', __DIR__ . '/wp-content' ); define( 'WP_CONTENT_URL', WP_HOME . '/wp-content' );
WP_HOME - URL фронта сайта.
WP_SITEURL - URL директории ядра WordPress.
Эти константы переопределяют значения опций home и siteurl из таблицы wp_options, но не изменяют их в БД.
WP_CONTENT_DIR и WP_CONTENT_URL указывают WordPress, где находится директория wp-content.
Версия WordPress в Composer
Допустимые версии WordPress задаются в composer.json с помощью ограничений версий.
Точная версия без перехода на другие релизы:
"wordpress/wordpress": "6.3.0"
Обновления внутри ветки 6.3, например с 6.3.0 до 6.3.1:
"wordpress/wordpress": "~6.3.0"
Обновления до любых стабильных версий внутри 6.x:
"wordpress/wordpress": "^6.3.0"
Последняя разрабатываемая версия WordPress:
"wordpress/wordpress": "dev-master"
dev-master предназначен для разработки и тестирования, а не для production-сайтов.
Чтобы обновить только WordPress в пределах указанного ограничения, выполните:
composer update wordpress/wordpress
Выбранная версия будет записана в composer.lock. После этого composer install установит зафиксированную версию WordPress на всех окружениях.
Альтернатива - roots/wordpress
В статье используется Composer-репозиторий doiftrue/wordpress-composer-repo. Альтернативный вариант - пакет roots/wordpress, доступный через Packagist.
Оба проекта не являются официальными пакетами WordPress.
doiftrue/wordpress-composer-repo |
roots/wordpress |
|
|---|---|---|
| Источник | Отдельный Composer-репозиторий | Packagist |
| Дистрибутивы | full, new-bundled, no-content |
no-content, отдельный пакет roots/wordpress-full |
| Установка | composer/installers или Composer-скрипт |
roots/wordpress-core-installer |
| Структура проекта | Можно установить ядро в корень или отдельную директорию | Рассчитан прежде всего на отдельную директорию ядра |
roots/wordpress - это метапакет из экосистемы Roots. Он подключает roots/wordpress-no-content и установщик roots/wordpress-core-installer. Для полного дистрибутива есть отдельный пакет roots/wordpress-full.
doiftrue/wordpress-composer-repo удобнее, если нужна собственная структура проекта или установка WordPress в корень. roots/wordpress больше подходит для проектов на Roots или с отдельной директорией ядра.