Как сделать замену в БД через phpmyadmin с переменной?
Приветствую!
Прошу помощи со следующим:
Необходимо заменить несколько тысяч записей через запрос к БД. Изменить строки вида так:
<p style="text-align: center;">123456</p>
чтобы осталось только 123456. При этом 123456 - переменная.
Как прописать запрос чтобы изменялось "оболочка" заменяемой строки, а сама она осталась?
Простыми запросами вида:
UPDATE wp_termmeta SET meta_value = REPLACE (meta_value, '123456', '654321') where meta_key = 'title'; |
UPDATE wp_termmeta SET meta_value = REPLACE (meta_value, '123456', '654321') where meta_key = 'title';
я пользуюсь, а вот как такой сложный построить не могу додумать. Там, как я понял еще и проблема с точкой с запятой может быть после center.
Дополнительно:
в mysql 8 есть регулярки.
= REGEXP_SUBSTR('<p style="text-align: center;">123456</p>', '[0-9]+') |
= REGEXP_SUBSTR('<p style="text-align: center;">123456</p>', '[0-9]+')
можно без них
= REPLACE (REPLACE ('<p style="text-align: center;">123456</p>', '<p style="text-align: center;">', ''), '</p>', '') |
= REPLACE (REPLACE ('<p style="text-align: center;">123456</p>', '<p style="text-align: center;">', ''), '</p>', '')
Ответы:
Не нужно лазить напрямую в БД - велики риски поломать сайт. И хотя в данном случае риски не большие, но тем не менее нужно привыкать делать правильно и осваивать правильные инструменты.
Для подобных задач можно воспользоваться скриптом Database Search and Replace или плагином типа https://wordpress.org/plugins/search-regex/
Замену производить приблизительно так.
Найти:
<p style="text-align: center;">(.*)</p>
Заменить на
$1
Конкретный синтаксис зависит от применяемого решения.
И не забываем делать бекап перед любыми действиями.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Через phpMyAdmin такую замену сделать можно, но сначала нужен бэкап таблицы. Массовый
UPDATEпо контенту WordPress опасен: можно случайно испортить HTML, Gutenberg-блоки, shortcode или сериализованные данные. Если речь только оpost_content, риск ниже, но всё равно сначала проверьте на копии.Если нужно убрать точную обёртку вокруг числа, и формат всегда одинаковый, можно использовать
REPLACE()только для конкретных фрагментов. Но если число каждый раз разное, обычныйREPLACEне подойдёт, нужна регулярка.В MySQL 8 доступен
REGEXP_REPLACE:UPDATE wp_posts SET post_content = REGEXP_REPLACE( post_content, '<p style="text-align: center;">([0-9]+)</p>', '\1' ) WHERE post_content REGEXP '<p style="text-align: center;">[0-9]+</p>';
Если MySQL старый и
REGEXP_REPLACEнет, лучше не мучить phpMyAdmin, а сделать WP-CLI или PHP-скрипт: пройти по записям, применитьpreg_replace(), обновить только те записи, где реально было изменение.$new = preg_replace( '~<p style="text-align:s*center;">([0-9]+)</p>~i', '$1', $old );
После замены проверьте 10-20 случайных страниц, поиск по старому фрагменту и логи PHP. Если данные лежат не в
post_content, а в meta/option, сначала выясните, не сериализованы ли они. В сериализованных строках ручная SQL-замена может сломать длины строк.