wp search-replace

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

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

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

Сериализованные данные

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

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

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

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

wp search-replace {old} {new} [{table}...] [--dry-run] [--network] [--all-tables-with-prefix] [--all-tables] [--skip-tables={tables}] [--include-columns={columns}] [--skip-columns={columns}] [--export[={file}]] [--export_insert_size={rows}] [--precise] [--recurse-objects] [--no-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.
[--skip-tables={tables}]
Не выполнять замену в указанных таблицах. Используйте запятые для указания нескольких таблиц.
[--include-columns={columns}]
Выполнять замену для определенных столбцов. Используйте запятые для указания нескольких столбцов.
[--skip-columns={columns}]
Не выполняйте замену в указанных колонках таблиц. Используйте запятые для указания нескольких столбцов.
[--export[={file}]]
Записать преобразованные данные в SQL файл, не сохранять изменения в БД. Если {file} не указан, выводится в стандартный вывод (STDOUT).
[--export_insert_size={rows}]
Определяет количество строк в одном операторе INSERT при выполнении экспорта SQL. Возможно этот параметр нужно изменить если того требует конфигурация базы данных (например, если вам нужно сделать меньше запросов).
По умолчанию: 50
[--precise]
Принудительное использование PHP варианта запроса (вместо SQL). PHP является более точным, но при этом более медленным.
[--recurse-objects]
Включить рекурсию в объекты для замены строк.
По умолчанию: true
[--no-recurse-objects]
Отключить рекурсию в объекты для замены строк.
По умолчанию: false
[--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) нужно использовать двойные кавычки (" а не ') для оформления поисковых фраз. Фразы также можно использовать без обрамления в кавычки, поэтому если в искомых фразах нет пробелов, то не используйте кавычки!

# Поиск и замена, но пропуск одного столбца
$ wp search-replace 'http://example.dev' 'http://example.com' --skip-columns=guid
# Выполнение операции поиска/замены, но не сохранение в базе данных
$ wp search-replace 'foo' 'bar' wp_posts wp_postmeta wp_terms --dry-run
# Выполнение операций поиска/замены без учета регистра (медленно)
$ wp search-replace '\[foo id="([0-9]+)"' '[bar id="\1"' --regex --regex-flags='i'
# Переделать базу данных вашего рабочего мультисайта в локальную базу данных для разработчиков.
$ wp search-replace --url=example.com example.com example.dev 'wp_*options' wp_blogs
# Поиск/замена в SQL-файл без изменения базы данных
$ 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 example.com newexample.com --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`.

Замена типа записи в Мультисайте

Имеется тип записи "Блог" (blog), который было решено переименовать в "Новости" (news). Помимо возможных исправлений в шаблонах, хотелось бы также поменять данные и в базе, так как при смене ключа ctp старые записи перестанут отображаться в админке и на сайте.

Не забудьте сделать бэкап базы данных (wp db export)!

Сделать это достаточно легко:

wp search-replace blog news wp_*posts --include-columns=guid,post_type --precise --network --dry-run

Данной командой мы:

  • Пробегаемся по таблицам с записями всех сайтов;
  • Ищем там фразу "blog" только в колонках guid и post_type;
  • Делаем это с помощью PHP (необязательно) - медленнее, но точнее;
  • Не заменяем blog на news, а лишь смотрим, где будет проведена замена при "боевом запуске".

В моем случае такой отчёт:

+-------------+-----------+--------------+------+
| Table       | Column    | Replacements | Type |
+-------------+-----------+--------------+------+
| wp_13_posts | guid      | 0            | PHP  |
| wp_13_posts | post_type | 0            | PHP  |
| wp_14_posts | guid      | 3            | PHP  |
| wp_14_posts | post_type | 3            | PHP  |
| wp_15_posts | guid      | 0            | PHP  |
| wp_15_posts | post_type | 0            | PHP  |
| wp_16_posts | guid      | 0            | PHP  |
| wp_16_posts | post_type | 0            | PHP  |
| wp_17_posts | guid      | 0            | PHP  |
| wp_17_posts | post_type | 0            | PHP  |
| wp_18_posts | guid      | 0            | PHP  |
| wp_18_posts | post_type | 0            | PHP  |
| wp_19_posts | guid      | 0            | PHP  |
| wp_19_posts | post_type | 0            | PHP  |
| wp_20_posts | guid      | 0            | PHP  |
| wp_20_posts | post_type | 0            | PHP  |
| wp_21_posts | guid      | 0            | PHP  |
| wp_21_posts | post_type | 0            | PHP  |
| wp_22_posts | guid      | 0            | PHP  |
| wp_22_posts | post_type | 0            | PHP  |
| wp_23_posts | guid      | 0            | PHP  |
| wp_23_posts | post_type | 0            | PHP  |
| wp_24_posts | guid      | 0            | PHP  |
| wp_24_posts | post_type | 0            | PHP  |
| wp_25_posts | guid      | 0            | PHP  |
| wp_25_posts | post_type | 0            | PHP  |
| wp_26_posts | guid      | 0            | PHP  |
| wp_26_posts | post_type | 0            | PHP  |
| wp_27_posts | guid      | 0            | PHP  |
| wp_27_posts | post_type | 0            | PHP  |
| wp_28_posts | guid      | 0            | PHP  |
| wp_28_posts | post_type | 0            | PHP  |
| wp_4_posts  | guid      | 0            | PHP  |
| wp_4_posts  | post_type | 0            | PHP  |
| wp_posts    | guid      | 0            | PHP  |
| wp_posts    | post_type | 0            | PHP  |
+-------------+-----------+--------------+------+
Success: 6 replacements to be made.

Если найденные потенциальные замены вас устраивают, то можно запустить команду в "боевом" режиме, убрав из команды опцию --dry-run.

Камена и экспорт в БД дамп

wp search-replace //old.com //new.com --export | gzip > ./db_backup-$(date +%Y-%m-%d-%H%M%S).sql.gz

Получим архив с содержимым:

DROP TABLE IF EXISTS `wp_commentmeta`;
CREATE TABLE `wp_commentmeta` (
	`meta_id` bigint unsigned NOT NULL AUTO_INCREMENT,
	`comment_id` bigint unsigned NOT NULL DEFAULT '0',
	`meta_key` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
	`meta_value` longtext COLLATE utf8mb4_general_ci,
	PRIMARY KEY (`meta_id`),
	KEY `comment_id` (`comment_id`),
	KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `wp_comments`;
CREATE TABLE `wp_comments` (
	`comment_ID` bigint unsigned NOT NULL AUTO_INCREMENT,
	`comment_post_ID` bigint unsigned NOT NULL DEFAULT '0',
	`comment_author` tinytext COLLATE utf8mb4_general_ci NOT NULL,
	`comment_author_email` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`comment_author_url` varchar(200) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`comment_author_IP` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	`comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	`comment_content` text COLLATE utf8mb4_general_ci NOT NULL,
	`comment_karma` int NOT NULL DEFAULT '0',
	`comment_approved` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1',
	`comment_agent` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`comment_type` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'comment',
	`comment_parent` bigint unsigned NOT NULL DEFAULT '0',
	`user_id` bigint unsigned NOT NULL DEFAULT '0',
	PRIMARY KEY (`comment_ID`),
	KEY `comment_post_ID` (`comment_post_ID`),
	KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`),
	KEY `comment_date_gmt` (`comment_date_gmt`),
	KEY `comment_parent` (`comment_parent`),
	KEY `comment_author_email` (`comment_author_email`(10))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `wp_links`;
CREATE TABLE `wp_links` (
	`link_id` bigint unsigned NOT NULL AUTO_INCREMENT,
	`link_url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_image` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_target` varchar(25) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_description` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_visible` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'Y',
	`link_owner` bigint unsigned NOT NULL DEFAULT '1',
	`link_rating` int NOT NULL DEFAULT '0',
	`link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
	`link_rel` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`link_notes` mediumtext COLLATE utf8mb4_general_ci NOT NULL,
	`link_rss` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	PRIMARY KEY (`link_id`),
							KEY `link_visible` (`link_visible`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `wp_options`;
CREATE TABLE `wp_options` (
	`option_id` bigint unsigned NOT NULL AUTO_INCREMENT,
	`option_name` varchar(191) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
	`option_value` longtext COLLATE utf8mb4_general_ci NOT NULL,
	`autoload` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yes',
	PRIMARY KEY (`option_id`),
	UNIQUE KEY `option_name` (`option_name`),
	KEY `autoload` (`autoload`)
) ENGINE=InnoDB AUTO_INCREMENT=4242 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES
('2', 'siteurl', 'http://nutrition-bacardilimited-com-gl-en.wpe-dev.bacardi.digital', 'on'),
('3', 'home', 'http://nutrition-bacardilimited-com-gl-en.wpe-dev.bacardi.digital', 'on'),
('4', 'blogname', 'Product Nutritional Page', 'on'),
('5', 'blogdescription', '', 'on'),
('6', 'users_can_register', '0', 'on'),
...
INSERT INTO `wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES
('101', 'initial_db_version', '57155', 'on'),

...
6 комментариев
    Войти