Установка 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 или с отдельной директорией ядра.