Настройка WordPress Multisite для сети сайтов
WordPress Multisite (WPMS) позволяет управлять несколькими сайтами из одной установки WordPress с единой БД, общим кодом и централизованным управлением плагинами/темами. Это не «несколько сайтов на одном сервере» — это один WordPress с разделяемой инфраструктурой. Подходит для сетей СМИ, мультирегиональных проектов, SaaS-платформ на WordPress, образовательных порталов. Настройка базовой сети занимает 1–2 дня; доработка под production с изоляцией данных и кастомными плагинами — от 5 дней.
Включение Multisite
Multisite активируется добавлением константы в wp-config.php до установки:
/* Включить WordPress Multisite */
define('WP_ALLOW_MULTISITE', true);
После перехода в Инструменты → Настройка сети выбирается тип адресации:
-
Поддомены (
site1.example.com,site2.example.com) — требует wildcard DNS и SSL -
Подпапки (
example.com/site1,example.com/site2) — проще в настройке
WordPress генерирует код для wp-config.php и .htaccess (или nginx.conf). Пример для nginx с поддоменами:
server {
listen 443 ssl;
server_name *.example.com example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/html;
index index.php;
# Multisite rewrite rules
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host/wp-admin/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Wildcard SSL для *.example.com — через Let's Encrypt с DNS-01 challenge:
certbot certonly --manual --preferred-challenges dns \
-d example.com -d '*.example.com'
Структура таблиц в БД
Multisite создаёт таблицы с префиксом для каждого подсайта. Главный сайт использует wp_posts, второй — wp_2_posts, третий — wp_3_posts:
wp_blogs -- реестр сайтов сети
wp_blog_versions -- версии БД по сайтам
wp_sitemeta -- мета-данные всей сети
wp_site -- корневой сайт
wp_users -- общие пользователи (один реестр)
wp_usermeta -- роли хранятся здесь per-site
-- Таблицы первого сайта
wp_posts, wp_postmeta, wp_options, wp_terms...
-- Таблицы второго сайта
wp_2_posts, wp_2_postmeta, wp_2_options, wp_2_terms...
Пользователи общие, но роли — разные для каждого подсайта. Пользователь может быть редактором на site2 и подписчиком на site3.
Программное создание подсайтов
// Создание нового подсайта
$blog_id = wpmu_create_blog(
'newsite.example.com', // домен
'/', // путь
'Новый сайт', // название
get_current_user_id(), // владелец
['public' => 1], // опции
1 // ID сети
);
if (is_wp_error($blog_id)) {
error_log('Ошибка создания сайта: ' . $blog_id->get_error_message());
return;
}
// Переключение контекста для работы с подсайтом
switch_to_blog($blog_id);
update_option('blogdescription', 'Описание нового сайта');
update_option('page_on_front', $homepage_id);
restore_current_blog();
Кастомный домен для подсайта
Domain mapping — привязка стороннего домена (client-site.ru) к подсайту Multisite. Нативно с WordPress 4.5+:
// В wp-config.php
define('COOKIE_DOMAIN', '');
// Через WP CLI
wp --url=site2.example.com site switch-language ru_RU
wp --url=site2.example.com option update siteurl 'https://client-site.ru'
wp --url=site2.example.com option update home 'https://client-site.ru'
Nginx нужно добавить:
server {
listen 443 ssl;
server_name client-site.ru www.client-site.ru;
# ... SSL config ...
root /var/www/html; # та же директория WordPress
# те же location блоки
}
Сетевые плагины и темы
Плагин, активированный на уровне сети, работает на всех подсайтах. Плагин, активированный на конкретном подсайте, работает только там. Важно: некоторые плагины не поддерживают Multisite — они используют хардкоженные table prefix или get_option без switch_to_blog.
// Проверка: запущены ли мы в контексте multisite
if (is_multisite()) {
$network_sites = get_sites(['number' => 100]);
foreach ($network_sites as $site) {
switch_to_blog($site->blog_id);
// операция для каждого сайта
restore_current_blog();
}
}
Разграничение контента между подсайтами
Медиафайлы по умолчанию изолированы по подсайту: wp-content/uploads/sites/2/, wp-content/uploads/sites/3/. Это правильно с точки зрения безопасности, но усложняет шаринг ресурсов.
Для общей медиабиблиотеки — плагин «Network Media Library» или кастомное решение через UPLOADBLOGSDIR:
// Глобальная таблица пользователей (если нужна общая библиотека)
define('WPMU_ACCEL_REDIRECT', true);
define('WPMU_SENDFILE', false);
Масштабирование и ограничения
Multisite хорошо работает до 50–100 активных подсайтов на одном сервере. При большем числе начинается деградация из-за таблицы wp_options каждого подсайта и глобального кеша опций. Признаки проблем: медленный switch_to_blog, долгий ответ на /wp-json/ для конкретного сайта.
Решения: Redis Object Cache с правильной сегрегацией ключей по blog_id, горизонтальное масштабирование через Varnish, разнос БД подсайтов на разные серверы (через HyperDB).
Типовые сроки: базовая настройка сети из 3–5 подсайтов — 2–3 дня. Настройка с domain mapping, SSL, сетевыми плагинами и кастомным регистратором подсайтов — 5–8 дней.







