WordPress multisite с разными базами данных

Как я вообще докатился до режима multisite? Всё дело в том, что если создавать на движке какой-то более сложный функционал с помощью плагинов, который будет включать в себя возможности сразу нескольких разноплановых сайтов, его производительность будет ужасна.

Они везде добавляют свои js / css и туда, где они не нужны. Таким образом, если установить несколько мощных тяжёлых плагинов и еще + 10-15 дополнительных поменьше, можно увидеть огромное количество скриптов и стилей везде, практически на каждой странице.

Решение этому нашлось — режим multisite.

Подключить его не составит труда и начать пользоваться можно за пару минут.

Для этого нужно добавить строку в wp-config.php

<code class="php hljs"><span class="hljs-comment">/* Это всё, дальше не редактируем. Успехов! */</span>
define(<span class="hljs-string">'WP_ALLOW_MULTISITE'</span>, <span class="hljs-keyword">true</span>);
</code>

После чего пройти в Инструменты -> Установка сети.

Её обязательно нужно выполнять с выключенными плагинами.

image

Вам предложат заменить данные в wp-config и .htaccess и авторизоваться ещё раз на сайте.

Система multisite

Режимов сайта всего 2 — это либо папки / или поддомены.

сайт.ru/сайт2
сайт2.сайт.ru

Одна таблица общих пользователей — при регистрации на любом из них они смогут войти во все остальные так же, так что не придётся регистрироваться по нескольку раз.

Управление плагинами и темами для всех сайтов из панели. Можно добавить необходимые для всех в одном месте и далее активировать их только на тех, где они нужны по отдельности. Так же есть возможность активировать их сразу для всей сети.

Таким образом, возможно сократить потребление плагинов на 50% и более. Вроде бы всё хорошо, с фронтендом уже все в порядке, но вот беда:

image

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 баз

Эта опция позволяет размещать конкретный сайт в конкретной базе данных. Мне она не нужна. Затрагивать её не буду. Без разницы мне, в какую, главное — что в любую другую, а не в одну.

Первым делом нужно подготовить новые базы

<code class="sql hljs"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_0`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_1`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_2`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_3`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_4`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_5`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_6`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_7`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_8`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_9`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_a`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_b`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_c`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_d`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_e`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_f`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> <span class="hljs-string">`dbname_global`</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-built_in">CHARACTER</span> <span class="hljs-keyword">SET</span> utf8 <span class="hljs-keyword">COLLATE</span> utf8_general_ci;
</code>

Выполните этот sql запрос и тогда вы увидите их.

image

Создание пользователей и паролей в PhpMyAdmin

Так как я на Localhoste, мне это не нужно. Подойдёт root, но вам может понадобиться создать новые имена и пароли, а так же дать нужные привилегии в случае, если вы делаете сайт не для себя одного, а, например, для нескольких людей. Поэтому я пропущу этот пункт.

Распаковка файлов

db-config.php, db.php нужно разместить в wp-content

move-blogs.php в любой папке после wp-content, например в новой /wp-content/scripts/

Настройка подключаемых модулей

DB-config.php

<code class="php hljs">define (<span class="hljs-string">'DB_SCALING'</span>, <span class="hljs-string">'16'</span>);

<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---DC IPs---------------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Usage: add_dc_ip(IP, DC)</span>
<span class="hljs-comment">//	EX: add_dc_ip('123.123.123.', 'dc1');</span>
add_dc_ip(<span class="hljs-string">'127.0.0.'</span>, <span class="hljs-string">'dc1'</span>);
</code>

Здесь нужно указать кол-во баз, 16 в данном случае и ip сервера. В конце вместо последних цифр ставится точка 127.0.0.

Далее ниже на первом месте добавим глобальную таблицу add_global_table(‘dbname_global’);

<code class="php hljs"><span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---Global Tables--------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Do not include default global tables</span>
<span class="hljs-comment">//	Leave off base prefix (eg: wp_)</span>
<span class="hljs-comment">//  You don't really have to register these, they will work fine without.</span>
<span class="hljs-comment">//  However registering at least your busiest ones might shave a few milliseconds off by avoiding some regexes.</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	Usage: add_global_table(TABLE_NAME)</span>
<span class="hljs-comment">//	EX: add_global_table('something');</span>
add_global_table(<span class="hljs-string">'dbname_global'</span>);

add_global_table(<span class="hljs-string">'affiliatedata'</span>);
add_global_table(<span class="hljs-string">'affiliatereferrers'</span>);
add_global_table(<span class="hljs-string">'am_actions'</span>);
add_global_table(<span class="hljs-string">'am_queue'</span>);
add_global_table(<span class="hljs-string">'am_schedule'</span>);
add_global_table(<span class="hljs-string">'autoblog'</span>);

add_global_table(<span class="hljs-string">'bp_activity'</span>);
add_global_table(<span class="hljs-string">'bp_activity_meta'</span>);
add_global_table(<span class="hljs-string">'bp_friends'</span>);
add_global_table(<span class="hljs-string">'bp_groups'</span>);
add_global_table(<span class="hljs-string">'bp_groups_groupmeta'</span>);
add_global_table(<span class="hljs-string">'bp_groups_members'</span>);
add_global_table(<span class="hljs-string">'bp_messages_messages'</span>);
add_global_table(<span class="hljs-string">'bp_messages_notices'</span>);

add_global_table(<span class="hljs-string">'bp_messages_recipients'</span>);
add_global_table(<span class="hljs-string">'bp_notifications'</span>);
add_global_table(<span class="hljs-string">'bp_user_blogs'</span>);
add_global_table(<span class="hljs-string">'bp_user_blogs_blogmeta'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_data'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_fields'</span>);
add_global_table(<span class="hljs-string">'bp_xprofile_groups'</span>);

add_global_table(<span class="hljs-string">'domain_mapping'</span>);
</code>

После чего ниже останется установить логин и пароль для входа в mysql:

<code class="php hljs"><span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//---DB Servers-----------------------------------------------------------//</span>
<span class="hljs-comment">//------------------------------------------------------------------------//</span>
<span class="hljs-comment">//	Database servers grouped by dataset.</span>
<span class="hljs-comment">//	R can be 0 (no reads) or a positive integer indicating the order</span>
<span class="hljs-comment">//	in which to attempt communication (all locals, then all remotes)</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	Usage: add_db_server(DS, DC, READ, WRITE, HOST, LAN_HOST, NAME, USER, PASS)</span>
<span class="hljs-comment">//	EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser',  'globalpassword');</span>
<span class="hljs-comment">//</span>
<span class="hljs-comment">//	<span class="hljs-doctag">Note:</span> you can also place this section in a file called db-list.php in wp-content</span>
<span class="hljs-comment">//  EX: add_db_server('global', 'dc1', 1, 1,'global.mysql.example.com:3509','global.mysql.example.lan:3509', 'global-db', 'globaluser',  'globalpassword');</span>
add_db_server(<span class="hljs-string">'global'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_global'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);

add_db_server(<span class="hljs-string">'0'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_0'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'1'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_1'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'2'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_2'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'3'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_3'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'4'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_4'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'5'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_5'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'6'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_6'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'7'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_7'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'8'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_8'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'9'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_9'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'a'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_a'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'b'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_b'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'c'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_c'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'d'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_d'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'e'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_e'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
add_db_server(<span class="hljs-string">'f'</span>, <span class="hljs-string">'dc1'</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>,<span class="hljs-string">'localhost'</span>,<span class="hljs-string">'localhost'</span>, <span class="hljs-string">'dbname_f'</span>, <span class="hljs-string">'root'</span>,  <span class="hljs-string">'1'</span>);
</code>

логин root, пароль 1. Так же тут нужно указать эти названия которые мы регистрировали вначале: dbname_0, dbname_1…

Настройка move-blogs.php

Это самая важная часть. Здесь также формируется вывод разных ошибок.

<code class="php hljs">$dbname = <span class="hljs-string">"multi"</span>;  <span class="hljs-comment">//This is your current database</span>
$blog_table_prefix = <span class="hljs-string">'wp_'</span>;  <span class="hljs-comment">//Prefix of your wpmu blog tables, most likely this won't need to be changed</span>
$newdb_prefix = <span class="hljs-string">'dbname_'</span>;  <span class="hljs-comment">//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</span>

<span class="hljs-comment">//We need info to connect to the databases</span>
$dbhost = <span class="hljs-string">'localhost'</span>;
$dbuname = <span class="hljs-string">'root'</span>;
$dbpass = <span class="hljs-string">'1'</span>;

<span class="hljs-comment">//How many db's are you moving into (16, 256, or 4096)?</span>
$db_scaling = <span class="hljs-string">'16'</span>;
</code>

$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

image

Жмём Click here.

Дожидаемся, когда закончится процесс, ссылка в адресной строке должна поменяться. После этого жмём clicking here для обновления страницы. Статус обновлен.

image

Теперь видно, что создалась одна глобальная база, в которой содержится wp_users и т.д.

image

Остальные два сайта помимо основного раскидало по другим базам в рандомном порядке, например, второй сайт попал в dbname_c, а третий в dbname_e.

image
image

Теперь нужно проверить, что случилось. Можно попробовав, например, записать пост в несколько сайтов и проверить, где они будут отображаться. И действительно, в новых и глобальной появляются записи.

image
image

В старую «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.