Как я вообще докатился до режима multisite? Всё дело в том, что если создавать на движке какой-то более сложный функционал с помощью плагинов, который будет включать в себя возможности сразу нескольких разноплановых сайтов, его производительность будет ужасна.
Они везде добавляют свои js / css и туда, где они не нужны. Таким образом, если установить несколько мощных тяжёлых плагинов и еще + 10-15 дополнительных поменьше, можно увидеть огромное количество скриптов и стилей везде, практически на каждой странице.
Решение этому нашлось — режим multisite.
Подключить его не составит труда и начать пользоваться можно за пару минут.
Для этого нужно добавить строку в wp-config.php
/* Это всё, дальше не редактируем. Успехов! */
define('WP_ALLOW_MULTISITE', true);
После чего пройти в Инструменты -> Установка сети.
Её обязательно нужно выполнять с выключенными плагинами.
Вам предложат заменить данные в wp-config и .htaccess и авторизоваться ещё раз на сайте.
Система multisite
Режимов сайта всего 2 — это либо папки / или поддомены.
сайт.ru/сайт2
сайт2.сайт.ru
Одна таблица общих пользователей — при регистрации на любом из них они смогут войти во все остальные так же, так что не придётся регистрироваться по нескольку раз.
Управление плагинами и темами для всех сайтов из панели. Можно добавить необходимые для всех в одном месте и далее активировать их только на тех, где они нужны по отдельности. Так же есть возможность активировать их сразу для всей сети.
Таким образом, возможно сократить потребление плагинов на 50% и более. Вроде бы всё хорошо, с фронтендом уже все в порядке, но вот беда:
multisite использует одну базу на все сайты — создавая на каждый из них отдельные таблицы.
wp_
wp_2
wp_3
Теперь одна база будет увеличиваться в несколько раз от каждого нового сайта.
Multisite c отдельной бд по каждый сайт
Для этого мы будем использовать плагин multi-db. Конечно, есть и другие, такие как HyperDB, SharDB, но я не нашёл никакой информации о них. Скачать multi-db вы можете по любой ссылке ниже.
cloud.mail.ru/public/KMNr/WDpoUeyUV
drive.google.com/open?id=0Bw4XcI3lCfQSUWZWLUUyUHZFVTA
Сам он предлагает сначала определиться, сколько баз вам нужно (16, 256, 4096).
Начну с 16. Важна последовательность. Сначала установите multisite, я буду начинать разделять базы данных, имея 3 созданных сайта — для того, чтобы протестировать его работу после этого.
Создание vip баз
Эта опция позволяет размещать конкретный сайт в конкретной базе данных. Мне она не нужна. Затрагивать её не буду. Без разницы мне, в какую, главное — что в любую другую, а не в одну.
Первым делом нужно подготовить новые базы
CREATE DATABASE `dbname_0` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_3` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_4` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_5` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_6` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_7` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_8` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_9` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_a` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_b` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_c` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_d` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_e` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_f` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `dbname_global` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Выполните этот sql запрос и тогда вы увидите их.
Создание пользователей и паролей в PhpMyAdmin
Так как я на Localhoste, мне это не нужно. Подойдёт root, но вам может понадобиться создать новые имена и пароли, а так же дать нужные привилегии в случае, если вы делаете сайт не для себя одного, а, например, для нескольких людей. Поэтому я пропущу этот пункт.
Распаковка файлов
db-config.php, db.php нужно разместить в wp-content
move-blogs.php в любой папке после wp-content, например в новой /wp-content/scripts/
Настройка подключаемых модулей
DB-config.php
define ('DB_SCALING', '16');
//------------------------------------------------------------------------//
//---DC IPs---------------------------------------------------------------//
//------------------------------------------------------------------------//
// Usage: add_dc_ip(IP, DC)
// EX: add_dc_ip('123.123.123.', 'dc1');
add_dc_ip('127.0.0.', 'dc1');
Здесь нужно указать кол-во баз, 16 в данном случае и ip сервера. В конце вместо последних цифр ставится точка 127.0.0.
Далее ниже на первом месте добавим глобальную таблицу add_global_table('dbname_global');
//------------------------------------------------------------------------//
//---Global Tables--------------------------------------------------------//
//------------------------------------------------------------------------//
// Do not include default global tables
// Leave off base prefix (eg: wp_)
// You don't really have to register these, they will work fine without.
// However registering at least your busiest ones might shave a few milliseconds off by avoiding some regexes.
//
// Usage: add_global_table(TABLE_NAME)
// EX: add_global_table('something');
add_global_table('dbname_global');
add_global_table('affiliatedata');
add_global_table('affiliatereferrers');
add_global_table('am_actions');
add_global_table('am_queue');
add_global_table('am_schedule');
add_global_table('autoblog');
add_global_table('bp_activity');
add_global_table('bp_activity_meta');
add_global_table('bp_friends');
add_global_table('bp_groups');
add_global_table('bp_groups_groupmeta');
add_global_table('bp_groups_members');
add_global_table('bp_messages_messages');
add_global_table('bp_messages_notices');
add_global_table('bp_messages_recipients');
add_global_table('bp_notifications');
add_global_table('bp_user_blogs');
add_global_table('bp_user_blogs_blogmeta');
add_global_table('bp_xprofile_data');
add_global_table('bp_xprofile_fields');
add_global_table('bp_xprofile_groups');
add_global_table('domain_mapping');
После чего ниже останется установить логин и пароль для входа в mysql:
//------------------------------------------------------------------------//
//---DB Servers-----------------------------------------------------------//
//------------------------------------------------------------------------//
// Database servers grouped by dataset.
// R can be 0 (no reads) or a positive integer indicating the order
// in which to attempt communication (all locals, then all remotes)
//
// Usage: add_db_server(DS, DC, READ, WRITE, HOST, LAN_HOST, NAME, USER, PASS)
// EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser', 'globalpassword');
//
// Note: you can also place this section in a file called db-list.php in wp-content
// EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser', 'globalpassword');
add_db_server('global', 'dc1', 1, 1,'localhost','localhost', 'dbname_global', 'root', '1');
add_db_server('0', 'dc1', 1, 1,'localhost','localhost', 'dbname_0', 'root', '1');
add_db_server('1', 'dc1', 1, 1,'localhost','localhost', 'dbname_1', 'root', '1');
add_db_server('2', 'dc1', 1, 1,'localhost','localhost', 'dbname_2', 'root', '1');
add_db_server('3', 'dc1', 1, 1,'localhost','localhost', 'dbname_3', 'root', '1');
add_db_server('4', 'dc1', 1, 1,'localhost','localhost', 'dbname_4', 'root', '1');
add_db_server('5', 'dc1', 1, 1,'localhost','localhost', 'dbname_5', 'root', '1');
add_db_server('6', 'dc1', 1, 1,'localhost','localhost', 'dbname_6', 'root', '1');
add_db_server('7', 'dc1', 1, 1,'localhost','localhost', 'dbname_7', 'root', '1');
add_db_server('8', 'dc1', 1, 1,'localhost','localhost', 'dbname_8', 'root', '1');
add_db_server('9', 'dc1', 1, 1,'localhost','localhost', 'dbname_9', 'root', '1');
add_db_server('a', 'dc1', 1, 1,'localhost','localhost', 'dbname_a', 'root', '1');
add_db_server('b', 'dc1', 1, 1,'localhost','localhost', 'dbname_b', 'root', '1');
add_db_server('c', 'dc1', 1, 1,'localhost','localhost', 'dbname_c', 'root', '1');
add_db_server('d', 'dc1', 1, 1,'localhost','localhost', 'dbname_d', 'root', '1');
add_db_server('e', 'dc1', 1, 1,'localhost','localhost', 'dbname_e', 'root', '1');
add_db_server('f', 'dc1', 1, 1,'localhost','localhost', 'dbname_f', 'root', '1');
логин root, пароль 1. Так же тут нужно указать эти названия которые мы регистрировали вначале: dbname_0, dbname_1…
Настройка move-blogs.php
Это самая важная часть. Здесь также формируется вывод разных ошибок.
$dbname = "multi"; //This is your current database
$blog_table_prefix = 'wp_'; //Prefix of your wpmu blog tables, most likely this won't need to be changed
$newdb_prefix = 'dbname_'; //This is the prefix of the db's you're moving your tables into - we assume they are all the same, if not, you're in trouble
//We need info to connect to the databases
$dbhost = 'localhost';
$dbuname = 'root';
$dbpass = '1';
//How many db's are you moving into (16, 256, or 4096)?
$db_scaling = '16';
$dbname = «multi»; //multi — это имя моей общей базы данных которую я хочу разделить на куски, нужно писать без префикса
$blog_table_prefix = 'wp_'; //это префикс в общей базе
$newdb_prefix = 'dbname_'; //новое имя
Логин, сервер и пароль, а так же количество баз.
$dbhost = 'localhost';
$dbuname = 'root';
$dbpass = '1';
$db_scaling = '16';
Теперь стоит пройти по адресу: localhost/wp-content/scripts/move-blogs.php
Жмём Click here.
Дожидаемся, когда закончится процесс, ссылка в адресной строке должна поменяться. После этого жмём clicking here для обновления страницы. Статус обновлен.
Теперь видно, что создалась одна глобальная база, в которой содержится wp_users и т.д.
Остальные два сайта помимо основного раскидало по другим базам в рандомном порядке, например, второй сайт попал в dbname_c, а третий в dbname_e.
Теперь нужно проверить, что случилось. Можно попробовав, например, записать пост в несколько сайтов и проверить, где они будут отображаться. И действительно, в новых и глобальной появляются записи.
В старую «multi» ничего не добавляется. Тогда, наверно, на этом всё. Пока что это только первые мнения об этой системе, выводы еще делать рано.
Нюансы multisite
Первое — это невозможность задать роли для новых зарегистрированных участников. Но для этого есть плагин. Помимо этого представим себе ситуацию, у вас два сайта — сайт 1 (основной) и сайт 2. Человек регистрируется на сайте 2 и он таки может теперь входить и отображаться на сайте 1, но вы его не видите из консоли сайта 1, несмотря на то, что он есть. Увидеть его можно или в общей сети, либо в сайте 2, с которого он совершил регистрацию.
Редирект регистрации
Если вы захотите регистрироваться через wp-login, wp-admin, wp-register с сайта 2, то вас перебросит на сайт 1. Как говорят разработчики multisite, это является логичным, так как аккаунт создаётся один для всей сети. Но это может быть неудобно и совсем не то что вам нужно. WooCommerce с его страницей My Account и шорткодом [woocommerce_my_account] поможет с нормальной регистрацией, так же можно использовать Login With Ajax.
Автор: alex1nd