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

Source: https://support.kapsulehost.com/ru-ru/wordpress-search-replace

WordPress хранит абсолютные URL-адреса в десятках таблиц базы данных, поэтому после смены домена или перехода на SSL старые адреса остаются разбросанными по записям, параметрам и настройкам плагинов: поиск и замена позволяет безопасно их исправить. В этом руководстве описаны два поддерживаемых способа сделать это в KPanel, объясняется, почему один распространённый третий способ повреждает данные, и как проверить результат.

## Когда это нужно

- Переход с `http://` на `https://` после включения SSL.
- Смена домена, например с `old-brand.co.nz` на `new-brand.co.nz`.
- После публикации тестовой копии на рабочий сайт, когда имя хоста тестовой среды всё ещё записано в базе данных.
- Отказ от старого хоста для медиафайлов и перенаправление всех URL-адресов изображений сразу.
- Исправление массовой опечатки во многих записях, например старого номера телефона или названия снятого с продажи товара.

> **Warning:** Поиск и замена перезаписывает строки сразу во всех таблицах, и отменить изменение отдельной строки невозможно. Делайте резервную копию перед началом каждый раз, даже если изменение кажется пустяковым. KPanel создаёт её автоматически, когда вы используете встроенные инструменты, описанные ниже, но если вы запускаете команду сами, ответственность за резервную копию лежит на вас. См. [Создание резервной копии](https://support.kapsulehost.com/ru-ru/taking-a-backup).

## Почему нельзя просто выполнить SQL REPLACE

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

WordPress хранит настройки плагинов, параметры тем и данные виджетов в виде сериализованных строк PHP. Сериализованная строка записывает длину каждого значения внутри себя, например так:

```
a:1:{s:3:"url";s:26:"http://old-domain.co.nz/x";}
```

Здесь `s:26` означает, что длина URL составляет 26 символов. Замените `http://` на `https://` обычной SQL-функцией `REPLACE()`, и текст станет длиной 27 символов, а сохранённая длина по-прежнему будет указывать 26. После этого PHP отказывается десериализовать весь параметр целиком, и настройка незаметно сбрасывается в пустое значение. Настройки конфигуратора темы исчезают, слайдеры теряют слайды, лицензии плагинов сами отменяют свою регистрацию.

Команда WP-CLI search-replace, которую запускает KPanel, десериализует каждое значение, выполняет замену внутри него и сериализует его снова с исправленными длинами. Именно поэтому здесь описан только этот способ.

> **Important:** Никогда не выполняйте `UPDATE wp_options SET option_value = REPLACE(...)` или аналогичный запрос в phpMyAdmin для базы данных WordPress. Кажется, что всё сработало, сообщается о количестве затронутых строк, а на деле запрос незаметно уничтожает каждую сериализованную настройку, которой коснулся. Исправить это можно только восстановлением из резервной копии.

## Способ 1: карточка Search & Replace

Это правильный выбор почти для всех. Карточка доступна на каждом тарифе WordPress.

1. Войдите в [KPanel](https://kpanel.kapsulehost.com) и нажмите **Веб-сайты** в левой боковой панели.
2. Выберите сайт.
3. Откройте вкладку **WordPress**, затем раздел **Быстрые действия**.
4. Найдите карточку **Search & Replace** и нажмите **Configure**.
5. Введите существующий текст в поле **Find (old value)**.
6. Введите новый текст в поле **Replace with**.
7. Оставьте флажок **Dry run (preview only, no changes)** установленным и нажмите **Preview**.

![Карточка поиска и замены в разделе «Быстрые действия» в KPanel](https://support.kapsulehost.com/help/screenshots/wordpress-search-replace.d3d0a573.webp)

Пробный запуск сообщает, сколько замен будет выполнено, с разбивкой по таблицам и столбцам, поэтому вы точно видите, где произойдёт изменение, ещё до того, как его применить.

Когда предварительный просмотр выглядит правильно:

1. Снимите флажок **Dry run**.
2. Нажмите **Run**.
3. Подтвердите действие в диалоговом окне.

Перед началом замены автоматически создаётся полная резервная копия, а замена охватывает все таблицы, включая созданные плагинами.

> **Tip:** Ищите максимально конкретную строку. Замена `old-domain.co.nz` также перезапишет `mail.old-domain.co.nz` и `staging.old-domain.co.nz`, а это редко то, что вам нужно. Если включить схему, например `https://old-domain.co.nz`, совпадение будет точным.

## Способ 2: WP-CLI из консоли

Консоль даёт тот же механизм с большим контролем над флагами. Это один из разделов, которые доступны на управляемых тарифах; на других тарифах в строке вкладок вместо этого отображается ссылка **+8 on Managed**.

Откройте сайт, затем **WordPress**, затем **Консоль**. Приглашение командной строки уже начинается с `wp`, поэтому вводите только остальную часть команды.

Сначала предварительный просмотр:

```
search-replace 'http://old-domain.co.nz' 'https://old-domain.co.nz' --all-tables --dry-run
```

Затем настоящий запуск:

```
search-replace 'http://old-domain.co.nz' 'https://old-domain.co.nz' --all-tables
```

> **Warning:** Консоль не создаёт резервную копию за вас. Автоматическая резервная копия перед запуском создаётся только при использовании карточки Search & Replace из способа 1. Если вы запускаете команду здесь, сначала сами сделайте резервную копию на странице **Резервные копии** сайта.

Полезные флаги:

| Флаг | Что он делает |
|---|---|
| `--all-tables` | Включает пользовательские таблицы, созданные плагинами, а не только основные таблицы WordPress |
| `--dry-run` | Сообщает, что изменится, и ничего не записывает |
| `--precise` | Использует для замены PHP вместо SQL. Медленнее, но справляется со сложными сериализованными структурами |
| `--skip-columns=guid` | Не трогает GUID записей (см. ниже) |
| `--report-changed-only` | Сокращает вывод до таблиц, которые действительно изменились |

### Примечание о GUID

У каждой записи WordPress есть столбец `guid`. Несмотря на то что он выглядит как URL, это идентификатор, а не ссылка, и программы чтения лент используют его, чтобы определить, видели ли они уже этот элемент. Если его перезаписать, все записи в вашей ленте могут снова появиться как новые.

Перезаписывайте GUID, если вы окончательно меняете домен и начинаете с чистого листа. Пропускайте их с помощью `--skip-columns=guid`, если вы только переходите с HTTP на HTTPS на том же домене.

## Смена домена: используйте карточку Site URL

Если вся цель в том, чтобы перенести сайт на новый домен, не начинайте с поиска и замены. Карточка **Change Site URL** в том же разделе **Быстрые действия** обновляет параметры `siteurl` и `home` и выполняет замену во всех таблицах за одну операцию, в правильном порядке. Если сделать это в обратном порядке, WordPress может оказаться не в состоянии загрузить собственную панель администратора.

## После замены

Пройдите по этому списку, прежде чем считать работу завершённой.

1. **Очистите кеш.** В разделе **Быстрые действия** запустите **Flush Cache**. Если сайт использует полностраничный кеш, очистите его в разделе **WordPress**, затем **Кеширование**.
2. **Сбросьте правила перезаписи.** Запустите **Flush Rewrites** в том же разделе или откройте в wp-admin **Настройки**, затем **Постоянные ссылки** и нажмите **Сохранить изменения**, ничего не меняя.
3. **Очистите кеш CDN**, если сайт его использует, в разделе **Производительность**, затем **Kapsule CDN**. См. [Очистка кэша Kapsule CDN](https://support.kapsulehost.com/ru-ru/cdn-cache-purge).
4. **Откройте сайт в приватном окне**, чтобы кеш браузера не ввёл вас в заблуждение.
5. **Проверьте значок замка.** Если после перехода на SSL замок отсутствует или показывает предупреждение, значит, остались старые URL-адреса: [Исправление предупреждений о смешанном содержимом](https://support.kapsulehost.com/ru-ru/ssl-mixed-content).
6. **Пройдитесь по капризным страницам.** Слайдеры на главной странице, логотип в шапке, все страницы, созданные в конструкторе страниц, и оформление заказа в магазине. Именно в них хранятся URL-адреса, которые находятся в сериализованных параметрах.
7. **Очистите кеш любого плагина кеширования** на экране его собственных настроек.

## Устранение неполадок

**Пробный запуск сообщает о нуле замен.** Строки в точно такой форме в базе данных нет. Проверьте косую черту в конце, префикс `www.` или схему. Попробуйте сначала найти только имя хоста, чтобы убедиться, что оно вообще есть в базе.

**После смены домена не отображаются изображения.** URL-адреса медиафайлов хранятся в `wp_posts` и `wp_postmeta` и охватываются флагом `--all-tables`, но CDN или плагин оптимизации изображений может кешировать собственные переписанные копии. Очистите кеш CDN и кеш плагина, затем перезагрузите страницу.

**После замены пропали настройки.** Это проблема сериализации, и она означает, что изменение было внесено напрямую через SQL, а не с помощью описанных здесь инструментов. Восстановите резервную копию, созданную перед запуском: [Восстановление из резервной копии](https://support.kapsulehost.com/ru-ru/restoring-from-backup).

**URL-адреса тестовой среды появляются снова.** Что-то снова их записывает, обычно запланированная публикация или кешированный параметр. Проверьте рабочий процесс в статье [Рабочий процесс Staging для WordPress](https://support.kapsulehost.com/ru-ru/wordpress-staging-workflow) и убедитесь, что при публикации установлен флажок **Rewrite URLs**.
