Перенос WordPress Multisite в поддиректорию
Во-первых, я прочитал несколько постов об этом процессе. Однако по разным причинам процесс остается сложным для реализации или устранения неполадок из-за отсутствия даже абстрактных примеров или, возможно, слишком абстрактных. Также есть несколько постов "невозможно сделать", почти всегда сопровождаемых оговорками "с версией 3.5 теперь можно", поэтому остается неясным, возможно ли это, хотя, несомненно, задача нетривиальная.
Краткое описание:
Как переместить wordpress multisite (WPMS) с root.com на root.com/blogs?
В этом примере мы переносим WPMS с "root.com" на "root.com/blogs"
Я понимаю, что нужно соответственно обновить пути в базе данных и wp-config.php. Похоже, также может потребоваться обновить .htaccess? Я также знаю о проблеме сериализации при поиске/замене и обновлении mysql-запросов.
У меня есть WPMS, обновленный до версии 3.5. Я нашел следующие таблицы с информацией о домене и путях
Существующая рабочая конфигурация перед переносом в поддиректорию
1. wp_blogs
select blog_id, domain, path from wp_blogs;
+---------+-------------+--------+
| blog_id | domain | path |
+---------+-------------+--------+
| 1 | root.com | / |
| 2 | root.com | /matt/ |
+---------+-------------+--------+
2. wp_site
select * in wp_site;
+----+-------------+------+
| id | domain | path |
+----+-------------+------+
| 1 | root.com | / |
+----+-------------+------+
3. blog_id соответствует таблицам wp_#_options, которые содержат:
select option_name,option_value from wp_2_options
where option_name = 'home' or option_name = 'siteurl';
+-------------+--------------------------+
| option_name | option_value |
+-------------+--------------------------+
| home | http://root.com/matt/ |
| siteurl | http://root.com/matt/ |
+-------------+--------------------------+
4. В моем wp-config.php есть следующие специфичные для WPMS строки:
define('WP_ALLOW_MULTISITE', true);
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false);
$base = '/';
define( 'DOMAIN_CURRENT_SITE', 'root.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
5. Наконец, в моем .htaccess имеется:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# загруженные файлы
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# добавить слеш в конце /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
Обновления, необходимые для переноса сайта
Мне кажется, что для переноса сайта в /blogs нужно:
1. Обновить wp_blogs до
mysql> update wp_blogs set domain=concat(domain, '/blogs'), path=concat(path, 'blogs/');
select blog_id, domain, path from wp_blogs where blog_id < 3;
+---------+-------------+--------------+
| blog_id | domain | path |
+---------+-------------+--------------+
| 1 | root.com | /blogs/ |
| 2 | root.com | /blogs/matt/ |
+---------+-------------+--------------+
2. Обновить wp_site до
update wp_site set domain=concat(domain, '/blogs'), path=concat(path, 'blogs/');
select * from wp_site;
+----+-------------+------------+
| id | domain | path |
+----+-------------+------------+
| 1 | root.com | /blogs/ |
+----+-------------+------------+
3. wp_#_options
+-------------+--------------------------------+
| option_name | option_value |
+-------------+--------------------------------+
| home | http://root.com/blogs/matt/ |
| siteurl | http://root.com/blogs/matt/ |
+-------------+--------------------------------+
4. wp_config.php
define('WP_ALLOW_MULTISITE', true);
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false);
$base = '/blogs/';
define( 'DOMAIN_CURRENT_SITE', 'root.com' );
define( 'PATH_CURRENT_SITE', '/blogs/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
примечание: Мне не совсем понятно, как правильно обновляется этот шаг
5. .htaccess
Я нашел расплывчатые инструкции "обновить .htaccess соответственно", но без конкретики. Обновить RewriteBase? Какие строки в .htaccess нужно обновить при переносе root.com на root.com/blogs?
В вышеописанном процессе не хватает путей, найденных в постах. Я предпочитаю использовать инструмент поиска и замены для этого после того, как сделаю эти более фундаментальные обновления; или я ошибаюсь?
Обновление bungeshea предполагает, что да, я должен указать RewriteBase на поддиректорию "blogs", то есть:
RewriteBase /Blogs
Наконец, если вы не знаете о http://interconnectit.com/products/search-and-replace-for-wordpress-databases/, вам стоит узнать. Это отличный инструмент.

Я знаю, что это старая информация, но я исправил это! Я установил WP MU в подпапке.
htaccess
:
RewriteEngine On
RewriteBase /YOUR_SUBFOLDER
RewriteRule ^index\.php$ - [L]
# добавляем завершающий слэш к /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule ^(.*\.php)$ YOUR_SUBFOLDER/$1 [L]
RewriteRule . index.php [L]
wp-config.php
:
define( 'WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'localhost'); // или ваш хост
define('PATH_CURRENT_SITE', '');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
и в вашей базе данных измените следующее:
wp_site
domain: localhost (ИЛИ ваш домен, но без подпапки!)
path: /
wp_blogs
domain: localhost (ИЛИ ваш домен, но без подпапки в каждом blog_id!)
path: /
wp_sitemeta
siteurl: http://localhost/YOUR_SUBFOLDER (замените localhost на ваш хост)

Это было невероятно полезно. У меня была установка на поддомене, дамп базы данных и архив сайта. Мне нужно было восстановить его на новом сервере, и пришлось вручную обновлять сайт. Обновления базы данных были самыми важными, которые мне нужно было сделать. Спасибо!

Похоже, вы уже нашли решение своей проблемы — просто выполните шаги с 1 по 4, а для шага 5 обновите RewriteBase
в файле .htaccess
. Что касается обновления путей в записях, мне нравится использовать инструмент Interconnect IT sterilized search-and-replace.

Спасибо, bungshea. Как я указал в своем сообщении, на что именно обновить RewriteBase в соответствии с приведенным выше примером? Это будет: RewriteBase /blog ?

Bungshea; сделано, но все равно не работает. После всех выполненных действий по-прежнему получаю "Ошибка подключения к базе данных". Что еще хуже - в логе ошибок apache нет никаких сообщений об ошибках.

Вот что я сделал, и это сработало. Без подпапки. Сайт ранее был настроен на поддомены.
СНАЧАЛА СОЗДАЙТЕ РЕЗЕРВНУЮ КОПИЮ!!!
wp-config.php (замените этот блок в вашем файле)
define('WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'no-www-in-sitename.com'); // ваш хост
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
.htaccess
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# добавьте завершающий слеш к /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
теперь в SQL базе данных:
1) для каждой таблицы wp_(номер сайта)_суффикс перейдите в таблицу options и измените siteurl и home на http://www.sitename.com/blogname
2) в таблице wp_blogs для каждого blog_id измените домен с blogname.domain.com
на domain.com
и путь на /blogname/
3) не нужно изменять siteurl & home в wp_options или любые ячейки в wp_site или wp_sitemeta, если установка находится в том же месте.
После завершения не забудьте зайти (в панели администратора суперпользователя) в Настройки > Постоянные ссылки и нажать Сохранить.
Вуаля!

Это мой первый ответ, так что прошу отнестись с пониманием! :)
У меня НЕ БЫЛО блога, который уже находился в поддоменах и требовал преобразования. Но мне пришлось побороться, потому что это был старый блог, и мне не разрешали создать блог в подкаталоге. Я боялся, что WordPress внесёт изменения в мою базу данных к тому моменту, когда мне дадут коды для вставки.
Вот что сработало для меня в апреле 2018 года, ребята... Я использовал wp-config от hot_barbara и .htaccess также от них.
Поэтому, пожалуйста, не выбирайте подкаталог — я этого не делал!
ОДНАКО в SQL-базе данных в моём случае всё уже было настроено следующим образом, поэтому я не вносил изменений:
- wp_site domain: xyzabc.com path: /
wp_blogs domain: xyzabc.com path: /
wp_sitemeta siteurl: h**ps://xyzabc.com/
Как я понимаю, вы бы использовали завершающий слэш, если бы он был указан в ваших настройках.

Перезапишите ваш файл wp-config.php
следующим кодом:
define('SUBDOMAIN_INSTALL', false);
вместо define('SUBDOMAIN_INSTALL', true);
затем перейдите по адресу:
http://www.website.com/wp-admin/network/setup.php
затем:
Добавьте следующий код в ваш файл .htaccess в /var/www/vhosts/website.com/, заменив другие правила WordPress:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# добавить завершающий слеш к /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
Всё готово.
Создайте новый сайт с подкаталогом
