Как сделать замену в БД через phpmyadmin с переменной?

Ссылка скопирована
1 ответ

Приветствую!
Прошу помощи со следующим:
Необходимо заменить несколько тысяч записей через запрос к БД. Изменить строки вида так:

<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('&lt;p style="text-align: center;"&gt;123456&lt;/p&gt;', '[0-9]+')

= REGEXP_SUBSTR('&lt;p style="text-align: center;"&gt;123456&lt;/p&gt;', '[0-9]+')

можно без них

= REPLACE (REPLACE ('&lt;p style="text-align: center;"&gt;123456&lt;/p&gt;', '&lt;p style="text-align: center;"&gt;', ''), '&lt;/p&gt;', '')

= REPLACE (REPLACE ('&lt;p style="text-align: center;"&gt;123456&lt;/p&gt;', '&lt;p style="text-align: center;"&gt;', ''), '&lt;/p&gt;', '')

Ответы:

Не нужно лазить напрямую в БД - велики риски поломать сайт. И хотя в данном случае риски не большие, но тем не менее нужно привыкать делать правильно и осваивать правильные инструменты.

Для подобных задач можно воспользоваться скриптом Database Search and Replace или плагином типа https://wordpress.org/plugins/search-regex/

Замену производить приблизительно так.
Найти:
<p style="text-align: center;">(.*)</p>
Заменить на
$1

Конкретный синтаксис зависит от применяемого решения.

И не забываем делать бекап перед любыми действиями.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Анна SEO Ответ

Через phpMyAdmin такую замену сделать можно, но сначала нужен бэкап таблицы. Массовый UPDATE по контенту WordPress опасен: можно случайно испортить HTML, Gutenberg-блоки, shortcode или сериализованные данные. Если речь только о post_content, риск ниже, но всё равно сначала проверьте на копии.

Если нужно убрать точную обёртку вокруг числа, и формат всегда одинаковый, можно использовать REPLACE() только для конкретных фрагментов. Но если число каждый раз разное, обычный REPLACE не подойдёт, нужна регулярка.

В MySQL 8 доступен REGEXP_REPLACE:

UPDATE wp_posts
SET post_content = REGEXP_REPLACE(
  post_content,
  '&lt;p style="text-align: center;"&gt;([0-9]+)&lt;/p&gt;',
  '\1'
)
WHERE post_content REGEXP '&lt;p style="text-align: center;"&gt;[0-9]+&lt;/p&gt;';

UPDATE wp_posts SET post_content = REGEXP_REPLACE( post_content, '&lt;p style="text-align: center;"&gt;([0-9]+)&lt;/p&gt;', '\1' ) WHERE post_content REGEXP '&lt;p style="text-align: center;"&gt;[0-9]+&lt;/p&gt;';

Если MySQL старый и REGEXP_REPLACE нет, лучше не мучить phpMyAdmin, а сделать WP-CLI или PHP-скрипт: пройти по записям, применить preg_replace(), обновить только те записи, где реально было изменение.

$new = preg_replace(
    '~&lt;p style="text-align:s*center;"&gt;([0-9]+)&lt;/p&gt;~i',
    '$1',
    $old
);

$new = preg_replace( '~&lt;p style="text-align:s*center;"&gt;([0-9]+)&lt;/p&gt;~i', '$1', $old );

После замены проверьте 10-20 случайных страниц, поиск по старому фрагменту и логи PHP. Если данные лежат не в post_content, а в meta/option, сначала выясните, не сериализованы ли они. В сериализованных строках ручная SQL-замена может сломать длины строк.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно