Как использовать WordPress Multisite с разными доменными именами?
Я хочу работать с WordPress multisite, но хочу использовать свои собственные имена. Например, мой основной сайт называется example.com
. Если я хочу добавить новый сайт в мою мультисайтовую сеть, он будет называться newsite.example.com
. Я хочу, чтобы он был newsite.com
без example
. Есть ли способ достичь этого?
Я слышал о сопоставлении доменов (domain mapping) с помощью плагина, но не знаю, относится ли это к данному вопросу. Если это имеет отношение, я хотел бы узнать, что это такое.

Эта тема часто вызывает путаницу. Возможно, WordPress мог бы лучше направлять пользователей в этом процессе. Хотя, вероятно, мультисайт изначально не предназначался для работы с TLD-доменами.
Итак, сначала необходимо установить WordPress, настроить мультисайт и конфигурировать его как сеть с субдоменами.
Вот пример конфигурации для вашего файла wp-config.php
в корневой директории WordPress:
/* Multisite */
define( 'WP_ALLOW_MULTISITE', true );
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', true );
define( 'DOMAIN_CURRENT_SITE', 'www.primary-domain.example' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
А вот базовая конфигурация для файла .htaccess
при настройке субдоменов, в корневой директории WordPress:
# BoF WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# EoF WordPress
Для корректной работы с TLD-доменами потребовались дополнительные настройки в файле wp-config.php
:
define( 'COOKIE_DOMAIN', '' );
define( 'ADMIN_COOKIE_PATH', '/' );
define( 'COOKIEPATH', '/' );
define( 'SITECOOKIEPATH', '/' );
Это все специфичные настройки WordPress.
Лично я предпочитаю создать один виртуальный хост Apache для основного домена сети, а затем настроить этот виртуальный хост с псевдонимами доменов. Каждый псевдоним домена будет представлять один из дополнительных сайтов в вашей сети.
Независимо от вашей окончательной настройки, необходимо чтобы DNS каждого домена указывал на один и тот же веб-сервер, и каждый домен был направлен в ту же директорию, где установлен WordPress для основного домена. Все домены в вашей сети должны указывать на один сервер через DNS записи и использовать один и тот же путь к файлам WordPress.
После правильной настройки всего вышеперечисленного войдите в админ-панель WordPress и перейдите в раздел управления сетью, чтобы добавить новый сайт.
При добавлении сайта система потребует ввести его как субдомен основного домена. Введите временное значение.
После создания сайта найдите его в списке сайтов сети и нажмите "Редактировать". Теперь вы можете полностью изменить доменное имя этого сайта. Именно в этот момент вы указываете настоящее доменное имя для TLD-сайта.
Да, это требует некоторых ухищрений, но метод работает и не требует использования плагинов.

Спасибо, похоже, работает — и действительно требовалась часть с куки. В моём случае я: 1) зарегистрировал новый домен, 2) направил его NS-записи на мой существующий хостинг с WordPress Multisite, 3) в cPanel добавил домен как Add-On Domain, указав корневой каталог таким же, как public_html основного сайта (как вы и сказали; я не пробовал вариант по умолчанию с новым каталогом, так что не уверен, сработал бы он), и 4) изменил URL подсайта с http://oldsubdomain.primarysite.com на http://www.newdomain.com. Пока что, тьфу-тьфу, проблем с DNS не возникло.

Мне нравится этот ответ... но у меня есть проблема. Ваше предложение по изменению .htaccess совпадает с тем, что рекомендует WordPress. Однако, когда я вношу эти изменения, система падает. Есть идеи, почему так происходит?

В WordPress теперь есть статья поддержки по этой теме. По сути, рекомендуемые шаги совпадают с теми, что предложили Дэвид и Майкл:
- Настройте запись DNS для доменного имени, указывающую на ваш сервер
- Убедитесь, что этот домен зарегистрирован на вашем сервере с виртуальным хостом, указывающим на директорию WordPress
- Сгенерируйте и установите SSL-сертификат на сервер, включающий целевой домен (технически это необязательно, но ограничение пользователей HTTP — плохая практика, которая теперь регулярно наказывается низкими SEO-оценками)
- Обновите URL сайта в вашем блоге WordPress, чтобы он указывал на новый домен
- Если проблемы с куками сохраняются, определите
COOKIE_DOMAIN
в файлеwp-config.php
Основное отличие в том, что вместо оставления домена кук пустым (define( 'COOKIE_DOMAIN', '' );
), рекомендуется указать домен, на который пришёл HTTP-запрос:
define('COOKIE_DOMAIN', $_SERVER['HTTP_HOST']);
Это помогает избежать проблем с куками в мультисайтовых установках под разными доменами, особенно для установок с поддиректориями.

В чем разница между установкой ADMIN_COOKIE_PATH
, COOKIEPATH
и SITECOOKIEPATH
в виде пустой строки, как сделал Майкл? И использованием $_SERVER['HTTP_HOST']
вместо пустой строки для COOKIE_DOMAIN
? Не делает ли это систему уязвимой к инъекции HTTP Host заголовка? У меня сработало только изменение COOKIE_DOMAIN
, и единственное отличие, которое я заметил, это то, что $_SERVER['HTTP_HOST']
устанавливает домен для cookie в формате .subdomain.domain.tld
вместо subdomain.domain.tld
(что может быть полезно только если у нас есть еще один уровень поддоменов).

Эта возможность появилась без использования плагинов несколько версий назад (не помню точный релиз, но функция доступна уже довольно давно). Однако если вы начинаете с нуля, вам следует установить WordPress Multisite в режиме поддоменов.
Вам нужно объявить основной URL (вероятно, kevin123.example
) как главный URL для сети (multisite). Он хранится в файле wp-config.php
в константе DOMAIN_CURRENT_SITE
, а сайт (ранее известный как «блог»), использующий этот домен в качестве основного URL, должен иметь ID, указанный в BLOG_ID_CURRENT_SITE
. Но это стандартные настройки в процессе обычной установки.
WordPress позволяет указать только поддомен при создании нового сайта. Но после создания сайта вы можете отредактировать его и добавить совершенно произвольное значение для URL сайта. Я описывал это некоторое время назад в этом ответе с несколькими скриншотами: Возможны ли вложенные поддомены в мультисайте с поддоменами?
Вам также может понадобиться установить константу COOKIE_DOMAN
в пустое значение в вашем wp-config.php
:
define( 'COOKIE_DOMAIN', '' );
