WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

wp search-replace

Поиск/замена строк в базе данных.

Выполняет поиск по всем строкам в выбранных таблицах и заменяет вхождение первой строки на вторую строку.

По умолчанию команда использует таблицы, зарегистрированные в объекте $wpdb. На multisite это будут только таблицы для текущего сайта, если не указан параметр --network.

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

Смотрите также команды для работы с БД wp db.

Использование

wp search-replace {old} {new} [{table}...] [--dry-run] [--network] [--all-tables-with-prefix] [--all-tables] [--export[={file}]] [--export_insert_size={rows}] [--skip-tables={tables}] [--skip-columns={columns}] [--include-columns={columns}] [--precise] [--recurse-objects] [--verbose] [--regex] [--regex-flags={regex-flags}] [--regex-delimiter={regex-delimiter}] [--regex-limit={regex-limit}] [--format={format}] [--report] [--report-changed-only] [--log[={file}]] [--before_context={num}] [--after_context={num}]

Можно указать Глобальные параметры и следующие:

{old}
Строка для поиска в базе данных.
{new}
Строка на которую нужно заменить найденную строку.
[{table}...]
Список таблиц базы данных в которых нужно проводить поиск. Поддерживаются подстановочные знаки, например 'wp_*options' или 'wp_post*'.
[--dry-run]
Выполнить всю операцию поиска/замены и показать отчет, но реально не производить замену в базе данных.
[--network]
Поиск/замена по всем таблицам, зарегистрированным в $wpdb в multisite установке.
[--all-tables-with-prefix]
Включите замену для любых таблиц, соответствующих префиксу таблиц, даже если они не зарегистрированы в $wpdb.
[--all-tables]
Включите замену для всех таблиц в базе данных, независимо от префикса, и их регистрации в $wpdb. Переписывает опции --network и --all-tables-with-prefix.
[--export[={file}]]
Записать преобразованные данные в SQL файл, не сохранять изменения в БД. Если {file} не указан, выводится в стандартный вывод (STDOUT).
[--export_insert_size={rows}]
Определяет количество строк в одном операторе INSERT при выполнении экспорта SQL. Возможно этот параметр нужно изменить если того требует конфигурация базы данных (например, если вам нужно сделать меньше запросов).
По умолчанию: 50
[--skip-tables={tables}]
Не выполнять замену в указанных таблицах. Используйте запятые для указания нескольких таблиц.
[--skip-columns={columns}]
Не выполняйте замену в указанных колонках таблиц. Используйте запятые для указания нескольких столбцов.
[--include-columns={columns}]
Выполнять замену для определенных столбцов. Используйте запятые для указания нескольких столбцов.
[--precise]
Принудительное использование PHP варианта запроса (вместо SQL). PHP является более точным, но при этом более медленным.
[--recurse-objects]
Включить рекурсию в объекты для замены строк. Укажите --no-recurse-objects для отключения.
По умолчанию: true
[--verbose]
Выводит строки в консоль по мере их обновления.
[--regex]
Выполняет поиск с помощью регулярного выражения (без разделителей).
Заметка: с --regex работает в 15-20 раз медленее.
[--regex-flags={regex-flags}]
Модификаторы PCRE для --regex (например, 'i' для нечувствительности к регистру).
[--regex-delimiter={regex-delimiter}]
Разделитель, используемый для регулярного выражения. Он должен быть экранирован, если он появляется в строке regex.
По умолчанию: результат chr(1)
[--regex-limit={regex-limit}]
Максимальное количество возможных замен для регулярного выражения. При десириализации влияет на каждое значение строки массива.
По умолчанию: -1 (без ограничений)
[--format={format}]
Формат вывода результата. Может быть: table, count.
По умолчанию: table
[--report]
Составить отчет.
По умолчанию: true
[--report-changed-only]
Отчитаться только по измененным полям.
По умолчанию: false (есил включено логирование то true)
[--log[={file}]]
Файл для записи логов. Если {file} не указан или в нем указано -, то выводится в STDOUT.
Заметка: замедляет работу, аналогично или хуже включению --precise или `--regex'.
[--before_context={num}]
Сколкьо символов выводить перед старым совпадением и новой заменой. Игнорируется, если лог отключен.
По умолчанию: 40
[--after_context={num}]
Сколкьо символов выводить после старого совпадения и новой заменой. Игнорируется, если лог отключен.
По умолчанию: 40

Примеры

ВАЖНО! На некоторых серверах (в частности на windows) нужно использовать двойные кавычки (" а не ') для оформления поисковых фраз. Фразы также можно использовать без обрамления в кавычки, поэтому если в искомых фразах нет пробелов, то не используйте кавычки!

# Search and replace but skip one column
$ wp search-replace 'http://example.dev' 'http://example.com' --skip-columns=guid
# Run search/replace operation but dont save in database
$ wp search-replace 'foo' 'bar' wp_posts wp_postmeta wp_terms --dry-run
# Run case-insensitive regex search/replace operation (slow)
$ wp search-replace '\[foo id="([0-9]+)"' '[bar id="\1"' --regex --regex-flags='i'
# Turn your production multisite database into a local dev database
$ wp search-replace --url=example.com example.com example.dev 'wp_*options' wp_blogs
# Search/replace to a SQL file without transforming the database
$ wp search-replace foo bar --export=database.sql
# Bash script: Search/replace production to development url (multisite compatible)
#!/bin/bash
if $(wp --url=http://example.com core is-installed --network); then
	wp search-replace --url=http://example.com 'http://example.com' 'http://example.dev' --recurse-objects --network --skip-columns=guid --skip-tables=wp_users
else
	wp search-replace 'http://example.com' 'http://example.dev' --recurse-objects --skip-columns=guid --skip-tables=wp_users
fi

WP CLI поиск и замена URL для WordPress multisite

wp search-replace site.ru newsite.ru --precise --network

Отобразим только замененные данные — параметр --report-changed-only=true

$ wp search-replace 'заменить с' 'заменить на' --report-changed-only=true

+--------------------+-----------------+--------------+------+
| Table              | Column          | Replacements | Type |
+--------------------+-----------------+--------------+------+
| wp_comments        | comment_content | 3            | SQL  |
| wp_posts           | post_content    | 5            | SQL  |
| wp_posts_revisions | post_content    | 30           | SQL  |
+--------------------+-----------------+--------------+------+
Success: Made 38 replacements. Please remember to flush your persistent object cache with `wp cache flush`.

Исходный код команды

6 комментов
  • Александр

    А как быть с сериализованными данными? Для переноса на другой домен.

    Ответить4 мес назад #
    • @ campusboy3413 www.youtube.com/c/wpplus

      Это предусмотрено. Они будут обработаны корректно.

      1
      Ответить4 мес назад #
      • Александр

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

        Ответить4 мес назад #
        • @ campusboy3413 www.youtube.com/c/wpplus

          То есть ломались сериализованные данные? Такого быть не может. Я и мои коллеги почти всегда используем WP CLI для экспорта и импорта базы, а затем поиска/замены при переносе домена и горя не знаем, так сказать. Работает чётко и без багов.

          1
          Ответить4 мес назад #
          • Александр

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

            Ответить4 мес назад #
            • @ campusboy3413 www.youtube.com/c/wpplus

              Нет, не обычная, в том-то и дело. К примеру, делаю в коде так:

              $arr = [ 'example.com' ];
              
              update_option( 'test', $arr );

              В базу записывается сериализованный массив в виде строки:

              a:1:{i:0;s:11:"example.com";}

              Заметьте, что указана длина значения ячейки массива в 11 символов.

              Теперь выполняю команду:

              wp search-replace example.com example.ru wp_*options

              Консоль сообщает о проделанной работе:

              +------------+--------------+--------------+------+
              | Table      | Column       | Replacements | Type |
              +------------+--------------+--------------+------+
              | wp_options | option_name  | 0            | SQL  |
              | wp_options | option_value | 3            | PHP  |
              | wp_options | autoload     | 0            | SQL  |
              +------------+--------------+--------------+------+

              Прошу заметить, что для замены в колонках option_name и autoload был задействован функционал SQL, а для option_value - функционал PHP. То есть бралась строка оттуда и с помощью PHP определялось, это сериализованный массив или нет.

              Если строка является сериализованным массивом, то она десериализуется, проводится замена, обратно сериализуется и записывался обратно в БД.

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

              a:1:{i:0;s:10:"example.ru";}

              Длина значения ячейки массива стоит правильная - 10 символов, то есть сериализованный массив валидный, ничего не сломалось.

              1
              Ответить4 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться