SQL-запросы, необходимые для переноса сайта на WordPress на другой домен

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

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

Что касается меня, то каждую задачу я пытаюсь максимально упростить и максимально ускорить. Поэтому вы можете пропустить теоретическую часть описания SQL-запросов и сразу перейти к инструменту, который вам сгенерирует их автоматически.

Описание запросов SQL

Вообще основных запросов три (на скриншоте есть и четвертый запрос, но о нем чуть позже). Итак, http://test.truemisha.ru — старый домен, https://truemisha.ru — новый.

Названия таблиц базы данных WordPress имеют префиксы. По умолчанию это wp_, но на вашем сайте префикс может быть абсолютно каким угодно, например таблица wp_posts у вас может называться misha_posts или hjkpoiposts, учтите это.

UPDATE wp_options SET option_value = REPLACE(option_value, 'http://test.truemisha.ru', 'https://truemisha.ru') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://test.truemisha.ru', 'https://truemisha.ru');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'http://test.truemisha.ru','https://truemisha.ru');

Для того, чтобы выполнить эти запросы, вам нужно выбрать базу данных в phpMyAdmin, перейти на вкладку SQL, вставить запросы в поле и нажать ок.

Вставляем запросы во вкладке SQL в phpMyAdmin

Вкратце рассмотрим каждый из запросов по отдельности.

Замена site_url и home_url

WordPress хранит значения абсолютного URL сайта в базе данных в таблице wp_options. Если их не поменять, то при переходе по ссылкам внутри сайта вас будет постоянно перенаправлять на старый домен.

UPDATE wp_options SET option_value = REPLACE(option_value, 'http://test.truemisha.ru', 'https://truemisha.ru') WHERE option_name = 'home' OR option_name = 'siteurl';

Поиск и замена в содержимом постов

Тут всё понятно — все ссылки и изображения в содержимом постов WordPress имеют абсолютные URL, а значит — меняем.

UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://test.truemisha.ru', 'https://truemisha.ru');

Значения произвольных полей постов

Не всегда нужен, но если вы лишний раз запустите этот запрос, ничего плохого не случится.

UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'http://test.truemisha.ru','https://truemisha.ru');

Для чего нужны guid?

Используются для RSS как глобальный идентификатор (больше кстати не используются нигде).

колонка guid в таблице wp_posts

Так что же делать с guid? Тут есть два случая:

  • Если вы переносите сайт с локального сервера — меняем все значения guid:
    UPDATE wp_posts SET guid = REPLACE (guid, 'http://10.0.0.32', 'https://truemisha.ru');
  • Если же сайт уже находился в интернете, а вы просто решили поменять домен — меняем guid только для вложений:
    UPDATE wp_posts SET guid = REPLACE (guid, 'http://test.truemisha.ru', 'https://truemisha.ru') WHERE post_type = 'attachment';

Ссылки в комментариях

Вполне возможно, что в комментариях оставлялись внутренние ссылки на какие-либо посты или страницы сайта — значит для комментов тоже будет свой SQL-запрос.

UPDATE wp_comments SET comment_content = REPLACE (comment_content, 'http://test.truemisha.ru', 'https://truemisha.ru');
UPDATE wp_comments SET comment_author_url = REPLACE (comment_author_url, 'http://test.truemisha.ru', 'https://truemisha.ru');
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Ещё посты про базы данных в WordPress

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

  • Нонейм2 июня 2014 в 12:06 #

    Все правильно расписано – сам пользуюсь таким же кодом уже несколько лет и никаких проблем при переносах не возникает.

  • Жека15 ноября 2014 в 21:11 #

    спасибо, отличная статья прям то что искал с первого поста и нашел, что бы без вас делал даже и не знаю, очень помогло хоть и не с первого тыка, слеши то в конце нужно убирать :)

  • Стратегору15 января 2015 в 15:01 #

    Отлично. Всё помогло, спасибо. С локалки сайт переносили на хостинг

  • alx dh17 июня 2015 в 17:06 #

    Я бы добавил немного по опыту многократных клонирований базы данных продуктивного сайта на тестовую площадку.
    Иногда (причин уже не помню, возможно, из-за каких-то плагинов) после копирования таблиц и указанных вами апдейтов бывает невозможно зайти в админку.
    Выручает следующее:
    update db_name.table_prefix_usermeta
    set meta_key = replace(meta_key, "old_table_prefix", "new_table_prefix");

    Тоже самое нужно проделать и с table_prefix_options по полю option_name:
    update db_name.table_prefix_options
    set option_name = replace(option_name, "old_table_prefix", "new_table_prefix");

  • AlexZsoft13 августа 2015 в 00:08 #

    Супер! Спасибо!

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.