Перенос WordPress Multisite в поддиректорию

21 дек. 2012 г., 21:28:01
Просмотры: 26.5K
Голосов: 22

Во-первых, я прочитал несколько постов об этом процессе. Однако по разным причинам процесс остается сложным для реализации или устранения неполадок из-за отсутствия даже абстрактных примеров или, возможно, слишком абстрактных. Также есть несколько постов "невозможно сделать", почти всегда сопровождаемых оговорками "с версией 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/, вам стоит узнать. Это отличный инструмент.

3
Комментарии

Отличный вопрос, отличный процесс +1

kaiser kaiser
10 февр. 2013 г. 14:19:54

Только мне так кажется? Думаю, запросы в процессе неверны. update wp_blogs set domain=concat(domain, '/blogs'), path=concat(path, 'blogs/'); должно быть скорее update wp_blogs set path=concat('/blogs',path);

M-R M-R
2 дек. 2015 г. 20:50:02

Работает. В /wp-admin сначала всё выглядит сломанным, потому что не загружаются скрипты/css, но я решил это, добавив define('CONCATENATE_SCRIPTS', false); в wp-config.php

nicogaldo nicogaldo
3 мар. 2022 г. 00:42:22
Все ответы на вопрос 5
2

Я знаю, что это старая информация, но я исправил это! Я установил 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 на ваш хост)
3 июн. 2015 г. 17:06:40
Комментарии

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

Jacob Raccuia Jacob Raccuia
13 окт. 2016 г. 06:56:56

Сначала это сработало для меня, но при вызове get_sites() и получении url подпапка не отображается.

nicogaldo nicogaldo
3 мар. 2022 г. 00:31:55
4

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

28 дек. 2012 г. 09:09:30
Комментарии

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

Screenack Screenack
2 янв. 2013 г. 16:05:43

Да: RewriteBase /blog

shea shea
2 янв. 2013 г. 23:41:57

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

Screenack Screenack
4 янв. 2013 г. 19:10:23

@Screenack какие конкретно ошибки в "Ошибка соединения с базой данных"? Подсказка: посетите wp-admin

shea shea
1 сент. 2013 г. 09:30:24
1

Вот что я сделал, и это сработало. Без подпапки. Сайт ранее был настроен на поддомены.

СНАЧАЛА СОЗДАЙТЕ РЕЗЕРВНУЮ КОПИЮ!!!

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, если установка находится в том же месте.

После завершения не забудьте зайти (в панели администратора суперпользователя) в Настройки > Постоянные ссылки и нажать Сохранить.

Вуаля!

20 нояб. 2015 г. 21:03:58
Комментарии

Заключительный слеш в пути блогов действительно решил мои проблемы

Edgar Edgar
4 февр. 2020 г. 20:26:43
0

Это мой первый ответ, так что прошу отнестись с пониманием! :)

У меня НЕ БЫЛО блога, который уже находился в поддоменах и требовал преобразования. Но мне пришлось побороться, потому что это был старый блог, и мне не разрешали создать блог в подкаталоге. Я боялся, что WordPress внесёт изменения в мою базу данных к тому моменту, когда мне дадут коды для вставки.

Вот что сработало для меня в апреле 2018 года, ребята... Я использовал wp-config от hot_barbara и .htaccess также от них.

Поэтому, пожалуйста, не выбирайте подкаталог — я этого не делал!

ОДНАКО в SQL-базе данных в моём случае всё уже было настроено следующим образом, поэтому я не вносил изменений:

  1. wp_site domain: xyzabc.com path: /

wp_blogs domain: xyzabc.com path: /

wp_sitemeta siteurl: h**ps://xyzabc.com/

Как я понимаю, вы бы использовали завершающий слэш, если бы он был указан в ваших настройках.

5 мая 2018 г. 22:16:33
0

Перезапишите ваш файл 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]

Всё готово.

Создайте новый сайт с подкаталогом

15 янв. 2019 г. 10:54:38