Как сказал @ tom-j-nowell в комментарии к OP, мультисайты могут сделать это проще.
Производительность и безопасность на самом деле не являются проблемой для мультисайтов (по крайней мере, не больше, чем для обычных установок), но я согласен, что мультисайты иногда могут быть проблемой, потому что многие плагины (как пользовательские, так и сторонние) могут не правильно работать на мультисайтах, или, может быть, потому, что вы хотите полностью разделить пользователей разных сайтов.
Тем не менее, то, что вы хотите достичь, не так сложно.
Что вам нужно изменить между установкой:
- папка плагинов
- папка тем
- настройки базы данных
Конфигурирование может быть выполнено с использованием констант.wp-config.php
Единственная проблема в том, как их переключать на основе URL.
Переменная сервера 'SERVER_NAME'
должна работать для вас, по крайней мере, если ваш веб-сервер настроен правильно.
Например, вы можете создать папку с именем /conf
на том же уровне wp-config.php
файла и /WordPress
папки.
В эту папку вы можете добавить несколько файлов:
branch1.domain.com.conf
branch2.domain.com.conf
branch3.domain.com.conf
внутри каждого из них вы можете сделать что-то вроде
$branch = 'branch1';
$base_dir = dirname( __DIR__) . "/{$branch}";
defined( 'WP_CONTENT_DIR' ) or define( 'WP_CONTENT_DIR', $base_dir );
// be sure WP understand URLs correctly
defined( 'DB_HOME' ) or define( 'DB_HOME', "{$branch}.example.com" );
defined('WP_SITEURL') or define('WP_SITEURL', "{$branch}.example.com/WordPress");
// adjust DB settings as needed
defined( 'DB_NAME' ) or define( 'DB_NAME', $branch );
defined( 'DB_USER' ) or define( 'DB_USER', $branch );
defined( 'DB_PASSWORD' ) or define( 'DB_PASSWORD', '********' );
unset( $base_dir, $branch );
Это изменится в каждом файле конфигурации в соответствии с «веткой».
После этого в вашем уникальном wp-config.php
можно так что-то вроде:
$defaults_conf = [
'WP_CONTENT_DIR' => __DIR__ . '/branch1',
'DB_HOST' => 'localhost',
'DB_NAME' => 'branch1',
'DB_USER' => 'branch1',
'DB_PASSWORD' => '********',
];
$host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];
if ($host && file_exists(__DIR__."/conf/{$host}.conf")) {
require __DIR__."/conf/{$host}.conf";
}
array_walk($defaults_conf, function($value, $name) {
defined($name) or define($name, $value);
});
unset($defaults_conf, $host);
Выше происходит то, что на основе имени сервера вы загружаете другой файл конфигурации (если он найден), и если файл конфигурации не определяет какую-либо конфигурацию по умолчанию (или файл не найден), конфигурация устанавливается по умолчанию.
Приятно то, что для добавления новой ветки вам просто нужно создать папку ветки и указать .conf
имя для нового домена ветки, и все готово, на стороне WP нечего менять.
Линия:
$host = getenv('WORDPRESS_HOST') ?: $_SERVER['SERVER_NAME'];
где я получаю доменное имя. В качестве первого варианта я использую переменную среды, поскольку есть вероятность, что $_SERVER['SERVER_NAME']
она не будет работать в контексте командной строки, например, при использовании WP CLI. В этих ситуациях вы можете установить переменную окружения, чтобы заставить WP использовать настройки из определенной ветви.
Обратите внимание, что в специфичных для ветви файлах конфигурации я изменяю WP_CONTENT_DIR
и автоматически устанавливаю папку плагинов и тем в соответствующие подпапки /plugins
и /themes
подпапки веток.
Возможная проблема здесь, если вы хотите открыть общий доступ к /uploads
папке (куда загружаются файлы).
По умолчанию эта папка является подпапкой каталога содержимого, поэтому при использовании рабочего процесса над ней она будет /uploads
подпапкой корневой папки каждой ветви.
Если это не проблема для вас, а просто пойти на это, в противном случае самым простым решением будет сделать /uploads
в каждой папке ветки символическую ссылку на папку реальных загрузок, которой вы хотите поделиться.