ГлавнаяНовостиКак изменить адрес WordPress-сайта

Как изменить адрес WordPress-сайта

Решив изменить адрес сайта, следует помнить, что помимо изменения домена в настройках хостинга, необходимо изменить и несколько настроек в самом WordPress. Если этого не сделать, сайт или часть его функционала перестанет работать.

При переносе сайта с локального сервера на рабочий также важно не забыть о смене домена, если адреса отличаются. Наша статья поможет разобраться в чем дело и правильно изменить адрес сайта, чтобы он смог работать должным образом.

Почему WordPress не работает с новым доменом

Для построения всех ссылок внутри WordPress используются несколько настроек, которые хранят в себе адрес сайта (его домен). Задаются они единожды в момент установки WordPress после чего сохраняются в таблице wp_options базы данных и требуют ручного обновления, если вы решили изменить адрес сайта.

О чем следует помнить перед сменой домена

Помимо обновления настроек доменов на странице Общие настройки (Настройки → Общие), стоит вспомнить и еще о некоторых вещах, которые имеют место быть.

  1. Ссылки в статьях и страницах.
  2. Ссылки в настройках тем и плагинов.
  3. Картинки в статьях, страницах и других местах сайта.
  4. Колонка guid в таблице wp_posts и т. п.

Иногда домен может храниться в виде сериализованного значения внутри базы данных. На практике это происходит, если в одну «ячейку» базы данных записывается целый массив значений. И если количество символов в новом и старом домене будет различаться, то осечку дадут большинство способов с простой заменой через поиск, о которых «рассказывает интернет».

На иллюстрации ниже в «ячейке» 1 хранится обычное значение, а в 225 сериализованное, где помимо самого значения указывается и его размер.

Сериализованные значения

Сериализованные значения

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

«Трудности» с кириллическими доменами .рф

Система доменных имен (DNS) создана так, что адреса сайтов могут содержать лишь буквы английского алфавита, цифры и символ «-». Все прочие символы должны быть записаны в качестве комбинаций из этих допустимых символов. Для доменов вида мой-сайт.рф это означает, что запись домена в настройках WordPress необходимо производить в формате Punycode. Например, домен мой-сайт.рф в Punycode будет выглядеть как xn----8sbzclmxk.xn--p1ai.

Сконвертировать домен .рф из кириллицы в Punycode можно автоматически на сайте mothereff.in/punycode.

Конвертация доменов в punycode

Конвертация доменов в punycode

Изменяем домен сайта с помощью WP-CLI

Утилита WP-CLI — универсальный инструмент среди множества возможностей которого есть и грамотный поиск с заменой любых строк внутри базы данных. Мы подразумеваем, что WP-CLI уже установлен на хостинге. Если это не так, можно попросить поддержку провайдера установить утилиту, или выполнить процедуру смены домена на своем локальном сервере.

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

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

ssh user666@old-domain.ru -p 7777
# По умолчанию при подключении используется порт 22,
# но на многих хостингах порт специально изменяют
# на другой, например, в примере выше это порт 7777.
# Вводим пароль ?
cd /home/user666/old-domain.ru/public_html/
# Путь до сайта может быть другим

С помощью команды search-replace «попросим» WP-CLI заменить old-domain.ru на new-domain.com.

wp search-replace 'old-domain.ru' 'new-domain.com'

Команда в таком виде заменит old-domain.ru на new-domain.com лишь в таблицах, которые имеют отношение к текущей установке WordPress. После выполнения выведется таблица с небольшой статистикой.

Поиск и замена в WP-CLI

Поиск и замена в WP-CLI

Используя дополнительные атрибуты, можно указать конкретные таблицы и колонки в таблицах, где необходимо производить замену. Будьте осторожны, если в одной базе данных расположены таблицы нескольких сайтов. Также в WP-CLI есть команда wp option update для обновления отдельных опций.

Изменяем домен сайта с помощью PHP-скрипта

В случае, если по каким-то причинам WP-CLI недоступен, вы можете воспользоваться PHP-скриптом от компании Interconnect IT из Ливерпуля. Для его использования достаточно лишь FTP-доступа. Как и WP-CLI, скрипт заботится обо всех форматах данных и не сломает сериализованные значения.

Снова замечу, что на всякий случай лучше сделать резервную копию базы перед началом.

1. Итак, скачиваем ZIP-архив последней версии с Github.

2. Зайдем в корневую папку сайта на сервере через FTP. Прямо в корне установки WordPress создаем «секретную» папку с любым именем. Обязательно сделайте имя как можно более сложным из букв разного регистра, цифр и символа «-».  Такое имя необходимо для того, чтобы никто кроме вас не смог найти ее и воспользоваться скриптом — он не требует авторизации и любой пользователь, зашедший на страницу, сможет взаимодействовать с вашей базой данных.

3. Распакуем содержимое архива, скаченного на первом шаге, и загрузим в «секретную» директорию.

Файлы утилиты Interconnect/it

Файлы утилиты Interconnect/it

4. Откроем скрипт, который мы только что загрузили. Для этого откройте в браузере страницу example.org/replacer-x36D891EHY-/. Как можно догадаться, «replacer-x36D891EHY-» — это название секретной директории.

Поиск с заменой в базе данных WordPress

Поиск с заменой в базе данных WordPress

5. На открывшейся странице в поле «replace» необходимо указать свой старый домен (например, old-domain.ru), а в поле «with» новый домен (например, new-domain.com).

Галочку «use regex» снимаем. Данные в секции «database» должны автоматически заполниться при открытии страницы. В секции «tables» выбираем «all tables».

6. Секция «actions» содержит несколько кнопок для действий. Нас интересует кнопка «live run». Нажав на нее откроется диалоговое окно, в котором необходимо подтвердить запуск, нажав кнопку «Ок».

7. Начнется процесс поиска и замены домена. Не закрывайте страницу! Во время выполнения будут появляться результаты операции.

Результат поиска с заменой по базе данных WordPress

Результат поиска с заменой по базе данных WordPress

8. После успешной замены необходимо удалить «секретную» директорию со всем содержимым. Это можно сделать через FTP-клиент. Через кнопку «delete me» внизу страницы скрипт может не удалиться, поэтому надежнее сделать это через FTP-клиент.

Вместо заключения

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

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

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • Ghost

    Большое спасибо за классный и детальный материал. Сохранил в Evernote ;-)

  • Hasperbox

    Спасибо за скрипт.

  • А что на счёт безопасного и обычного пути (http и https). Пробовал прописать в админке безопасный для бэкенда и обычный для сайта — сохраняло и показывало белый экран (приходилось лезть и менять обратно в БД), так же пробовал и наоборот, и везде прописывать https, чтот работало, чтот нет. Но вот у меня стоит другой вопрос, как сделать, чтобы сайт был доступен по двум адресам и нормально функционировал как для юзеров, так и для поисковиков или, например, на фронте был обычный url, а когда залогинишься становится безопасным, тоже и с админкой?

    Спасибо.

    • В wp-config.php:

      define(‘FORCE_SSL_ADMIN’, true);

      • Спасибо, но к сожалению, никакого эффекта.. После подставления https в адрес, сайт загружается, но криво, в один столб с поломанными стилями, а если же сохраню url в https в «Настройка > Общие» после долгого сохранения и загрузки в итоге показывает Циклическую Переадресацию..:/

  • Wal

    Отличная статья. Полезно, доступно и просто. Про такие плагины/скрипты не знал, всегда руками делал. Теперь буду автоматизировать процесс. Спасибо!

  • Ivan Panfilov

    я начал добавлять в wp-config.php

    define(‘WP_SITEURL’, ‘http://’ . $_SERVER[‘HTTP_HOST’] . ‘/’);
    define(‘WP_HOME’, ‘http://’ . $_SERVER[‘HTTP_HOST’] . ‘/’);

    т.о. автоматически подставляется текущий домен.
    этого не достаточно?

    • Как было отмечено в статье, домен сайта может присутствовать еще много где внутри базы данных, поэтому надежнее воспользоваться заменой. В Кодексе WordPress указанный способ с $_SERVER['HTTP_HOST'] помечен как небезопасный, потому что эта переменная автоматически генерируется (она не статическая). Думаю, примеры того, как можно сломать сайт, имея такую конструкцию, сможет подсказать Константин :)

      • Ivan Panfilov

        — заменяем на статическую константу ‘http://my-site-host/’ — проблема решена.

        — в контенте я никогда не указываю абсолютные ссылки c хостом — только для шаблонов писем или подобных вещей отображающихся вне сайта. в некоторых случаях и там можно использовать подстановку значения из константы.

        — то что гдето хранится урл в сайте БД — это огорчает, но скорее всего это стороннее расширение, есть же константа WP_SITEURL WP_HOME — зачем хранить еще чтото отдельно.

        • Если объявлены константы, то они просто фильтруют те же самые опции, поэтому особой разницы нет, кроме мультисайта, где эти константы не имеют никакого эффекта.

          При установке ядра WordPress, устанавливаются опции home и siteurl, но не константы в wp-config.php, поэтому константы и являются «сторонним расширением» о котором вы говорите. А опции позволяют изменять значения в случае необходимости, фильтровать их для каких-нибудь мультиязычных сайтов и т.д., такой механизм намного гибче.

          • Ivan Panfilov

            Понятно. Мультисайт не использую — т.к. нужные расширения не адекватно работают с ним или вообще не работают. Вообще настройка с ним какая-то геморная.
            Да и не знаю насколько актуален мультисайт сейчас. Вот сейчас есть wp-cli — с ним проще развернуть новую копию вордпресса установить нужных плагинов, обновлять, а дальше делай че хочешь.

          • Мультисайт нужен для того, чтобы была общая таблица с пользователями, например. Проблем не должно быть с плагинами, правда некоторые плагины несколько иначе начинают себя вести при включенном мультисайте (например Seo by Yoast позволяет задать общие настройки для всех сайтов).

  • Женча Балюков

    Спасибо! отличная статья!

  • Сергій

    ставил wp-cli но ничего не получилось, а с помощью php скрипта всё вроде бы прошло отлично.
    получил конечно
    2: set_time_limit() has been disabled for security reasons in /home/u823083289/public_html/newssk/srdb.class.php on line 306

    но вроде как все работает без проблем) спасибо)

    • set_time_limit() функция, которая пытается увеличить максимально возможное время исполнение PHP-скрипта. Обычно это где-то секунд 30. На шеред хостингах, да и вообще на многих хостингах, возможность снять это ограничение или увеличить лимит отключена, поэтому и ошибка :)

      В принципе, на маленьких сайтах, скорее всего, ничего плохого от этого не будет. А вот если база данных достаточно большая есть риск того, что скрипт не успеет сделать все, что он хотел.

  • Здравствуйте, а я пользуюсь плагином All-in-One WP Migration. За 5 минут переносится с локального сервера, с хостинга на хостинг, с одного домена на другой.

  • Ми Хын Пак

    А-грАмАднейшее спасибо!!! С помощью скрипта спас очень большой сайт на WP. Начитался советов, как править базу данных WP с помощью текстового редактора и чуть сайт не загубил при смене домена — почему-то копия БД не скачалась. А здесь — красота! Всё просто и надёжно. В двух таблицах скрипт не заменил домен — предложил сделать вручную. Зашёл в БД — одна таблица не редактируется, другая — пустая. Так что к скрипту — никаких вопросов. Автору поста — всяческих удач!