☰
WORDPRESS / PRACTICE

Безопасная замена адреса в WordPress через WP-CLI

Безопасная замена адреса в WordPress через WP-CLI

При переносе WordPress на новый домен или протокол необходимо заменить старый адрес сайта в базе данных. На первый взгляд, для этого достаточно SQL-запроса или sed. Однако такой подход может повредить сериализованные данные, которые WordPress и плагины хранят в настройках, метаполях и других таблицах.

Более безопасный вариант — команда WP-CLI search-replace. Она находит и заменяет значения в таблицах WordPress, а также корректно обновляет длину строк в serialized data. Перед внесением изменений следует выполнить dry-run, проверить резервную копию и убедиться, что команда работает с нужной установкой.

Почему прямой SQL или sed могут повредить WordPress

WordPress часто хранит настройки в формате PHP serialization. В такой структуре вместе с текстом записывается его длина. Например, строка может выглядеть так: a:1:{s:3:"url";s:18:"https://old.example";}. Если заменить адрес на более длинный или короткий без пересчета длины, PHP не сможет корректно прочитать значение.

Такие данные встречаются в wp_options, wp_postmeta, wp_usermeta, таблицах плагинов и полях конструкторов страниц. Возможные последствия — исчезновение настроек, ошибки плагинов, пустые виджеты или сообщения о поврежденных serialized data.

Обычный SQL UPDATE или массовая замена через sed не понимают структуру сериализованных массивов. Они меняют символы, но не знают, какие длины нужно обновить. WP-CLI search-replace создан именно для такого сценария.

  • Не редактируйте дамп базы обычным поиском и заменой, если не проверяете все форматы данных.
  • Не заменяйте значения только в wp_options: адреса могут находиться в контенте, метаполях и таблицах плагинов.
  • Учитывайте точный вариант адреса: http или https, www или без www, а также наличие завершающего слеша.

Подготовка к замене домена

Перед запуском команды определите корневую директорию нужной установки WordPress. Обычно в ней находится wp-config.php. Это особенно важно на сервере с несколькими сайтами: ошибка в пути может привести к работе с другой базой данных.

Создайте резервную копию базы данных и убедитесь, что ее можно восстановить. Backup должен быть доступен до начала операции, а не создаваться после неудачного search-replace. Если сайт критически важен, сначала протестируйте миграцию на staging-копии.

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

  • Подготовьте дамп базы и, при необходимости, резервную копию файлов.
  • Проверьте, что старый и новый URL указаны без ошибок.
  • Уточните, есть ли в базе таблицы плагинов с тем же префиксом, что и у таблиц WordPress.
  • Не выполняйте операцию на production без проверенной резервной копии.
  • Если доступно несколько сайтов, явно укажите правильный путь к WordPress.
cd /var/www/example.com
wp core is-installed
wp option get home
wp option get siteurl

Какие варианты URL нужно учитывать

Одна миграция не всегда охватывает все варианты адреса. Например, в базе могут остаться http://old.example, https://old.example, http://www.old.example или URL с завершающим слешем. Сначала определите, какие значения действительно используются, а затем выполняйте отдельные контролируемые замены.

Не следует бездумно заменять только имя домена в любом тексте. Домен может встречаться в email-адресах, настройках webhook, ключах API или внешних интеграциях. Перед операцией оцените контекст найденных совпадений.

Базовая команда WP-CLI search-replace

Для типичной миграции домена начните с dry-run и исключите поле guid. Параметр --all-tables-with-prefix охватывает все таблицы, имена которых начинаются с префикса WordPress, а не только стандартные wp_posts или wp_options.

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

  • --dry-run показывает ожидаемые изменения, но не записывает их в базу.
  • --all-tables-with-prefix позволяет проверить таблицы многих плагинов с соответствующим префиксом.
  • --skip-columns=guid исключает колонку guid из замены.
  • После анализа результата dry-run ту же команду можно выполнить без --dry-run.
wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid \
--dry-run

Выполнение после проверки

Если отчет соответствует ожиданиям, резервная копия создана, а сайт работает с правильной базой, повторите команду без флага --dry-run. Не изменяйте строку поиска или параметры между проверкой и фактическим запуском без новой проверки.

wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid

Как проверить результат dry-run

Отчет WP-CLI показывает таблицы, колонки и количество найденных совпадений. Не оценивайте результат только по общей цифре: важно увидеть, в каких именно таблицах и полях будет выполнена замена.

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

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

  • Проверьте названия таблиц и колонок в отчете.
  • Сопоставьте количество совпадений с ожидаемым объемом контента и настроек.
  • Выясните причину, если замена не находит ни одного значения.
  • Не запускайте операцию повторно без необходимости: повторная замена может быть лишней или изменить данные, если строки поиска пересекаются.
wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid \
--dry-run \
--report-changed-only

Что делать с GUID и пользовательскими таблицами

Колонка guid в wp_posts имеет специальное назначение. Это глобальный идентификатор записи, а не обычное поле для отображения текущего URL страницы. Поэтому при типичной миграции ее часто пропускают с помощью --skip-columns=guid.

Если есть конкретная причина изменить GUID, это нужно делать осознанно после оценки последствий. Не включайте это поле только потому, что в нем остался старый адрес. Изменение GUID не является стандартным способом исправления canonical URL, внутренних ссылок или адреса сайта.

Параметр --all-tables-with-prefix охватывает таблицы с префиксом, указанным в wp-config.php. Если плагин создал таблицу с другим префиксом или без стандартного префикса, она может не попасть в операцию. Такие таблицы нужно проверять отдельно и обрабатывать только согласно документации плагина либо после анализа их структуры.

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

Проверка сайта после search-replace

После фактической замены проверьте значения home и siteurl, откройте главную страницу, несколько записей, страницы с медиафайлами и формы. Отдельно протестируйте авторизацию, админ-панель, поиск, корзину и checkout, если сайт использует электронную коммерцию.

Проверьте, не остались ли ссылки на старый домен в контенте, виджетах, меню и настройках плагинов. Для этого можно повторно запустить search-replace в режиме dry-run со старым адресом. Ожидаемый результат — отсутствие совпадений или понятные остатки в полях, которые намеренно не изменялись.

После миграции очистите кеш WordPress, серверный кеш, CDN и кеш плагинов, если они используются. Также проверьте robots.txt, XML-карту сайта, SSL-сертификат, редиректы со старого домена и настройки внешних интеграций.

  • Проверьте home и siteurl через WP-CLI.
  • Выполните повторный dry-run для старого URL.
  • Просмотрите страницы с разными типами контента и изображениями.
  • Проверьте отправку email, API, webhook и платежные интеграции.
  • Зафиксируйте ошибки PHP и ответы HTTP 4xx/5xx после миграции.
wp option get home
wp option get siteurl
wp search-replace \
'https://old.example' 'https://new.example' \
--all-tables-with-prefix \
--skip-columns=guid \
--dry-run

Типичные ошибки и безопасная стратегия восстановления

Самая частая ошибка — запуск команды без резервной копии или с неправильным путем к WordPress. Другие риски: перепутанный протокол, замена только в стандартных таблицах, ненужное изменение GUID и попытка обработать с помощью WP-CLI зашифрованные или нестандартно сжатые данные.

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

После восстановления повторите процесс на staging: сначала проверьте точные URL, затем выполните dry-run, просмотрите таблицы и только после этого запустите замену. Такой подход обычно быстрее ручного исправления поврежденных serialized data.

  • Не редактируйте вручную поврежденные сериализованные строки без понимания их структуры.
  • Храните резервную копию до и после миграции.
  • После крупной миграции проверяйте не только фронтенд, но и админ-панель и фоновые задачи.
  • Если данные плагина зашифрованы или имеют собственный формат, используйте штатный инструмент этого плагина.

Частые вопросы

Безопасно ли запускать WP-CLI search-replace на production?

Операцию можно выполнять на production, но только после создания и проверки резервной копии и запуска dry-run. Для критически важных сайтов лучше сначала протестировать команду на staging-копии и запланировать короткое окно обслуживания.

Изменяет ли WP-CLI сериализованные данные без повреждения?

WP-CLI search-replace умеет корректно обновлять стандартные PHP serialized values, в том числе пересчитывать длину строк. Это не гарантирует обработку произвольных JSON, зашифрованных, сжатых или специальных форматов.

Почему в команде используется --skip-columns=guid?

GUID — это идентификатор записи, а не обычный текущий URL. При миграции его обычно оставляют без изменений, если нет отдельной технической причины обновлять это поле.

Охватывает ли --all-tables-with-prefix таблицы всех плагинов?

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

Что делать, если после замены остались старые URL?

Повторно выполните dry-run со старым адресом, определите таблицы и колонки с остаточными значениями и проверьте, не отличается ли URL протоколом, наличием www или завершающим слешем. Если значения хранятся в специальном формате, используйте инструмент соответствующего плагина.

Вывод

WP-CLI search-replace — практичный инструмент для миграции WordPress, когда нужно заменить домен без повреждения serialized data. Безопасный процесс включает резервное копирование, запуск из корня правильной установки, dry-run, проверку таблиц и контрольное тестирование после изменений.

Параметры --all-tables-with-prefix и --skip-columns=guid помогают охватить данные плагинов и избежать необдуманного изменения GUID. При этом нестандартные, зашифрованные или имеющие отдельный префикс таблицы требуют дополнительного анализа.

← Все материалы WordPress