Преобразование мультисайтовой установки WordPress в одиночный сайт
Имея сеть WordPress Multisite с основным блогом и предполагая, что весь контент уже перенесен на этот блог, как можно преобразовать сеть обратно в стандартную установку WordPress без сети и мультисайтовости?

Я прошел шаги по извлечению сайта из мультисайтовой установки в отдельный экземпляр:
- Настройте чистую копию WordPress, но не устанавливайте её
- Найдите ID сайта
- Скопируйте файлы из blogs.dir/ID/files в новую папку uploads WordPress
- Скопируйте тему, которую использует сайт, и все необходимые плагины в соответствующие папки в новой папке wp-content
- Сделайте резервную копию базы данных мультисайта, но только таблиц для целевого сайта, а также таблиц users и usermeta, используя MySQL Workbench или аналог
- Восстановите резервную копию в новую базу данных и измените префиксы таблиц, чтобы они были одинаковыми, например, 'wp_SITEID_' на 'wp_'
- С помощью MySQL Workbench или Query Browser приведите в порядок таблицы users и usermeta следующим образом:
DELETE FROM wp_usermeta WHERE user_id NOT IN( SELECT distinct(user_id) FROM wp_usermeta where meta_key LIKE 'wp_SITEID_%' );
DELETE FROM wp_users WHERE ID NOT IN( SELECT distinct(user_id) FROM wp_usermeta where meta_key LIKE 'wp_SITEID_%' );
UPDATE wp_usermeta SET meta_key = REPLACE( meta_key, 'wp_SITEID_', 'wp_' ) WHERE meta_key LIKE 'wp_SITEID_%';
UPDATE wp_options SET option_name = REPLACE( option_name, 'wp_SITEID_', 'wp_' ) WHERE option_name LIKE 'wp_SITEID_%';
- Начните процесс установки WordPress, чтобы создать
wp-config.php
, но не нажимайте «Запустить установку» - Создайте стандартный файл .htaccess, если использовались постоянные ссылки, или просто посетите страницу постоянных ссылок в wp-admin
- Далее вам нужно обновить старые URL в вашей базе данных. В идеале используйте безопасный инструмент поиска/замены, такой как в wp-cli или его универсальный предшественник search/replace db от interconnect/it. В частности, замените
blogs.dir/SITE_ID/files
наuploads
, а если вы меняете URL сайта, заменитеoldsite.com
наnewsite.com
.
Довольно трудоемкий процесс, и нужно быть осторожным с правками базы данных, но это единственный способ, который я вижу, чтобы извлечь отдельный сайт из существующего мультисайта со всеми его настройками и т.д.
РЕДАКТИРОВАНО:
Как заметил @Jake, я забыл упомянуть финальные шаги, которые могут понадобиться, например, поиск/замена старых URL. Я обновил список соответствующим образом.

Ни один из шагов в пункте 7 не сработал и не дал никакого эффекта, когда я изменил SITEID
на правильный идентификатор сайта. Вместо этого следует упомянуть, что, скорее всего, потребуется обновить опции siteurl
и home
в таблице wp_options
. В остальном это был довольно хороший чек-лист. Спасибо.

Также, скорее всего, потребуется выполнить поиск и замену в базе данных для старого домена / нового домена, если происходит его изменение. И почти НАВЕРНЯКА потребуется выполнить поиск и замену для blogs.dir или uploads/sites, чтобы убедиться, что ссылки на изображения/файлы корректны. Однако будьте осторожны со всеми сериализованными данными в WP. Небезопасно выполнять открытый поиск и замену в MYSQL. Используйте что-то вроде: http://interconnectit.com/products/search-and-replace-for-wordpress-databases/

@Jake спасибо, я забыл о контексте изменения URL, и ты прав, я пропустил шаг поиска/замены для существующих URL, добавлю это для полноты картины

@Jake Я не вдавался в детали, но шаг 7 в основном удаляет пользователей, которые не принадлежат сайту, который вы извлекаете, и убеждается, что у оставшихся пользователей по-прежнему правильные разрешения. Это, по сути, задача очистки.

Я понял, что они сделали, просто первые пару раз возвращались ошибки, возможно, я что-то упустил, и не уверен, что у меня вообще были пользователи для очистки, так что это было легко пропустить. И не поймите меня неправильно, это было чрезвычайно полезно даже без этих дополнительных шагов, просто хорошо отметить для будущего использования. Спасибо!

Можно удалить мультисайтовую установку без переустановки нового блога. Выполните следующие шаги.
- Создайте резервную копию, дамп базы данных и резервную копию папки wp-content
- Установите константу
WP_ALLOW_MULTISITE
в вашем wp-config.php в значениеFALSE
Удалите или закомментируйте настройки MU в
wp-config.php
, как показано ниже:/** define( 'MULTISITE', true ); define( 'SUBDOMAIN_INSTALL', false ); $base = '/wordpress/'; define( 'DOMAIN_CURRENT_SITE', 'localhost' ); define( 'PATH_CURRENT_SITE', '/wordpress/' ); define( 'SITE_ID_CURRENT_SITE', 1 ); define( 'BLOG_ID_CURRENT_SITE', 1 ); */
Удалите настройки MU из
.htaccess
, как в исходном коде ниже:# BEGIN WordPress RewriteEngine On RewriteBase /wordpress/ 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).*) $2 [L] RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] RewriteRule . index.php [L] # END WordPress
Создайте новые постоянные ссылки в админке
wp-admin/options-permalink.php
и, возможно, скопируйте результат в.htaccess
, если WordPress не может записать в этот файл из-за прав доступа.Удалите ненужные записи в таблице
users
; используйте следующий SQL-запрос в инструменте, таком как phpMyAdmin или Adminer`ALTER TABLE `wp_users` DROP `spam`, DROP `deleted`;`
Следующие таблицы можно удалить:
- wp_blogs
- wp_blog_versions
- wp_registration_log
- wp_signups
- wp_site
- wp_sitemeta
- wp_sitecategories (только если существует)
(замените
wp_
на ваш префикс базы данных)Теперь у вас остались только таблицы других блогов сети. Если вы хотите использовать и этот контент, экспортируйте его заранее через WordPress в формате XML и импортируйте в чистую одиночную установку.

На самом деле это возможно и довольно легко сделать; я делал это сам несколько раз.
Есть три вещи, которые нужно учесть.
- wp-config.php, который определяет, мультисайт это или одиночный сайт
- .htaccess, который содержит правила перезаписи для поддержки мультисайта
- дополнительные таблицы в базе данных, созданные для поддержки мультисайта
Если закомментировать определение мультисайта (define) в wp-config и обновить постоянные ссылки, сайт вернется в режим одиночного сайта/по умолчанию. Затем останется только почистить базу данных.
Если по какой-то причине у вас нет доступа к wp-admin для обновления постоянных ссылок, просто удалите файл .htaccess. WordPress создаст его заново в режиме одиночного сайта.
Я постараюсь найти ссылку на код/статью поддержки и обновлю ответ.
Вот ссылка на один из вопросов на форуме поддержки: http://wordpress.org/support/topic/revert-to-single-site (англ.)

Основные процессы здесь работают хорошо даже в WP 3.5.1 Одно уточнение: Если вы назвали свой подсайт как-то, вам придется изменить ссылки в базе данных, чтобы удалить это имя. Например, если мой подсайт назывался... mysite.com/comics, то после выполнения вышеуказанных процедур ваш WP будет искать mysite.com/comics и выдавать ошибки в постоянных ссылках. Отредактируйте таблицу WP-OPTIONS, найдите расширение /comics и удалите его. Также проверьте, что каталог загрузок указывает на правильное местоположение - он может все еще содержать запись blogs.dir, а теперь должен указывать на wp-content/uploads/
