После переноса WordPress на новый домен адрес сайта может остаться не только в основных настройках, но и в контенте, метаданных, виджетах, параметрах темы и плагинов. Поэтому часть изображений, внутренних ссылок или API-запросов может продолжать обращаться к старому домену.
Безопаснее всего выполнять массовую замену через WP-CLI. Команда <code>wp search-replace</code> учитывает сериализованные данные WordPress и корректно пересчитывает длину строк. Это значительно надежнее, чем непосредственная замена текста через SQL.
Что подготовить перед сменой домена
Запускайте команды из корневой директории WordPress — там, где расположен файл <code>wp-config.php</code>. Пользователь, от имени которого выполняется WP-CLI, должен иметь доступ к файлам сайта и базе данных.
Перед операцией определите точные старый и новый адреса. Например, <code>https://old.example</code> и <code>https://new.example</code>. Не смешивайте в одной операции разные варианты протокола, наличие или отсутствие <code>www</code> и путь к подкаталогу.
- Убедитесь, что новый домен уже направлен на нужный сервер или окружение.
- Проверьте, что для нового домена выпущен SSL-сертификат, если используется HTTPS.
- Подготовьте резервную копию базы данных и убедитесь, что ее можно восстановить.
- Временно ограничьте доступ к сайту для редакторов и посетителей.
- Заранее проверьте настройки DNS, веб-сервера, CDN, почты и внешних интеграций.
wp db export backup-before-domain-change-$(date +%F-%H%M).sql
wp maintenance-mode activate
Почему не стоит выполнять массовую замену обычным SQL
В базе данных WordPress хранятся сериализованные структуры PHP. Вместе со значением в них записывается длина строки. Если заменить домен обычной функцией <code>REPLACE()</code>, длина может стать неправильной, и WordPress или плагин не сможет разобрать такие данные.
Проблема часто проявляется не сразу: сайт может открываться, но перестают работать виджеты, настройки темы, конструкторы страниц или отдельные плагины. WP-CLI распознает сериализованные значения и корректно обновляет их.
- Не выполняйте глобальный SQL-запрос без полной резервной копии.
- Не заменяйте домен простым поиском и заменой в дампе с помощью текстового редактора.
- Не редактируйте сериализованные значения в таблицах базы вручную.
- Помните, что WP-CLI изменяет базу данных, но не исправляет жестко заданные URL в PHP, JavaScript, CSS или конфигурациях веб-сервера.
Тестовый запуск через WP-CLI
Сначала выполните команду с параметром <code>--dry-run</code>. Она не изменяет базу данных, а только показывает, сколько совпадений будет найдено. Параметр <code>--all-tables-with-prefix</code> охватывает все таблицы с префиксом WordPress, включая таблицы плагинов, если они используют тот же префикс.
- В приведенной ниже команде замените домены на фактические адреса сайта.
- Не добавляйте завершающий слеш к одному домену, если у другого его нет.
- Запускайте команду с правами, обеспечивающими доступ к базе данных и файлам WordPress.
wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid \
--dry-run
Как оценить результат dry-run
Проверьте количество таблиц, столбцов и строк с совпадениями. Результат должен быть логичным для конкретного сайта: на небольшом проекте необычно большое количество совпадений может указывать на ошибку в адресе или слишком широкий шаблон поиска.
Если команда ничего не находит, проверьте протокол, поддомен, <code>www</code>, путь к подкаталогу и то, подключен ли WP-CLI к нужной базе данных. Для диагностики можно отдельно просмотреть значения основных URL.
- Сравните старый адрес с фактическим значением в настройках WordPress.
- Не запускайте замену только потому, что новый сайт открывается в браузере.
- Если сайт использует несколько вариантов старого адреса, например HTTP и HTTPS, запланируйте отдельные контролируемые операции.
wp option get home
wp option get siteurl
Выполнение замены домена
Если результат тестового запуска ожидаемый, повторите команду без <code>--dry-run</code>. Параметр <code>--skip-columns=guid</code> обычно оставляют намеренно: поле <code>guid</code> является стабильным идентификатором записи, а не обычным URL для навигации или SEO-редиректов.
Изменение GUID может создать лишние побочные эффекты для RSS и систем, которые используют это поле для идентификации записей. При этом решение зависит от сценария миграции, поэтому для нестандартных интеграций его стоит согласовать с разработчиком.
wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid
Если сайт работает в подкаталоге или использует multisite
Для WordPress в подкаталоге указывайте полный старый и новый адрес вместе с путем, если именно такая строка хранится в базе данных. Для multisite требуется дополнительная проверка: в базе могут находиться сетевые настройки, таблицы отдельных сайтов, домены блогов и правила веб-сервера.
Не ограничивайтесь проверкой только главной страницы. После операции проверьте каждый сайт сети, административную часть и URL, которые формируются для отдельных блогов.
- Создайте отдельную резервную копию перед изменением домена сети.
- Проверьте значения домена и пути в сетевых настройках.
- Убедитесь, что DNS и правила перенаправления охватывают все нужные поддомены или пути.
Очистка кэша и обновление зависимых настроек
После замены база данных уже будет содержать новый домен, но посетители могут получать старые страницы из кэша. Очистите кэш WordPress, кэш страниц, объектный кэш, кэш CDN и кэш на уровне веб-сервера, если он используется.
WP-CLI может очистить стандартный объектный кэш, но кэш конкретного плагина или CDN часто требует отдельной команды или действия в панели соответствующего сервиса.
- Очистите объектный кэш: <code>wp cache flush</code>.
- Перегенерируйте или очистите кэш страниц способом, который используется на сайте.
- Проверьте правила редиректов со старого домена на новый.
- Обновите URL в конфигурациях CDN, SMTP, платежных систем, вебхуков, OAuth и внешних API.
- Проверьте переменные окружения, конфигурационные файлы и код темы, где домен мог быть записан вручную.
wp cache flush
wp maintenance-mode deactivate
Проверка сайта после миграции
Проводите проверку не только в браузере, но и через HTTP-запросы и WP-CLI. Важно убедиться, что новый адрес используется в canonical, sitemap, REST API, медиафайлах и внутренних ссылках.
- Откройте главную страницу, несколько записей, страниц, категорий и страницу поиска.
- Проверьте, что изображения, файлы и шрифты загружаются с нового домена без mixed content.
- Проверьте canonical, hreflang, Open Graph и структурированные данные, если их формирует тема или SEO-плагин.
- Выполните запрос к REST API, например <code>/wp-json/</code>, и проверьте ответы на отсутствие ошибок авторизации и неожиданных перенаправлений.
- Проверьте XML-карту сайта, robots.txt, внутренние ссылки и редиректы со старых URL.
- Просмотрите журналы ошибок PHP и веб-сервера после открытия сайта.
- Убедитесь, что в админке работают редактор, загрузка медиафайлов, формы, кэширование и ключевые интеграции.
wp option get home
wp option get siteurl
curl -I https://new.example/
curl -I https://new.example/wp-json/
Типичные ошибки при смене домена
Чаще всего проблемы возникают не из-за самой команды, а из-за неполного плана миграции. Замена в базе данных не изменяет DNS, SSL, правила перенаправлений и файлы с жестко заданными адресами.
- Резервное копирование было пропущено или возможность восстановления не была проверена.
- Команда была запущена для неправильной базы данных или не из той директории WordPress.
- В поиске был указан HTTP вместо HTTPS, старый поддомен или неправильный путь.
- После операции остался кэш со старыми ответами и HTML старого домена.
- Старый домен отключили сразу, хотя он должен еще длительное время возвращать постоянный редирект на соответствующие новые URL.
- Некоторые URL остались в файлах темы, JavaScript, CSS, конфигурациях или настройках внешних сервисов.
- GUID изменили без необходимости или выполнили опасную SQL-замену сериализованных данных.
Частые вопросы
Нужно ли менять поле guid в WordPress?
Обычно нет. GUID предназначен для стабильной идентификации записи, в том числе в RSS, а не для пользовательской навигации. Поэтому при стандартной миграции его часто исключают с помощью --skip-columns=guid.
Можно ли запускать wp search-replace без dry-run?
Можно, но безопаснее сначала выполнить тестовый запуск, проверить количество совпадений и только затем повторить команду без --dry-run. Перед реальной заменой обязательно создайте резервную копию базы данных.
Исправит ли WP-CLI домен в файлах темы и плагинов?
Нет. wp search-replace работает с базой данных. Жестко заданные адреса в PHP, JavaScript, CSS, конфигурациях веб-сервера или переменных окружения нужно проверять отдельно.
Что делать, если после замены появились ошибки сериализации?
Не выполняйте случайные SQL-запросы. Восстановите базу данных из резервной копии, проверьте версию WP-CLI и подключение к правильной базе, а затем повторите операцию через wp search-replace. Для сложных сайтов привлеките разработчика.
Нужно ли оставлять старый домен после миграции?
Да, обычно старый домен стоит сохранить и настроить постоянные редиректы на соответствующие новые URL. Это помогает пользователям и поисковым системам корректно перейти со старых адресов на новые.
Вывод
Безопасная смена домена WordPress состоит не только из одного запроса поиска и замены. Надежный порядок действий таков: резервная копия, режим обслуживания, dry-run, замена через WP-CLI, очистка кэша и проверка всех ключевых типов URL.
Не используйте прямой SQL для сериализованных данных и не отключайте старый домен сразу после миграции. Контролируемая замена и последовательная проверка помогут избежать повреждения настроек и незаметных ошибок в контенте.