Преобразование мультисайтовой установки 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. В остальном это был довольно хороший чек-лист. Спасибо.
Jake
Также, скорее всего, потребуется выполнить поиск и замену в базе данных для старого домена / нового домена, если происходит его изменение. И почти НАВЕРНЯКА потребуется выполнить поиск и замену для blogs.dir или uploads/sites, чтобы убедиться, что ссылки на изображения/файлы корректны. Однако будьте осторожны со всеми сериализованными данными в WP. Небезопасно выполнять открытый поиск и замену в MYSQL. Используйте что-то вроде: http://interconnectit.com/products/search-and-replace-for-wordpress-databases/
Jake
@Jake спасибо, я забыл о контексте изменения URL, и ты прав, я пропустил шаг поиска/замены для существующих URL, добавлю это для полноты картины
sanchothefat
@Jake Я не вдавался в детали, но шаг 7 в основном удаляет пользователей, которые не принадлежат сайту, который вы извлекаете, и убеждается, что у оставшихся пользователей по-прежнему правильные разрешения. Это, по сути, задача очистки.
sanchothefat
Я понял, что они сделали, просто первые пару раз возвращались ошибки, возможно, я что-то упустил, и не уверен, что у меня вообще были пользователи для очистки, так что это было легко пропустить. И не поймите меня неправильно, это было чрезвычайно полезно даже без этих дополнительных шагов, просто хорошо отметить для будущего использования. Спасибо!
Jake
Можно удалить мультисайтовую установку без переустановки нового блога. Выполните следующие шаги.
- Создайте резервную копию, дамп базы данных и резервную копию папки 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/