Удаление встроенной рекламы из постов WordPress через один SQL-запрос

Задача и контекст
Ведение блога на WordPress часто приводит к необходимости массовых правок старых записей: смена темы, изменение видимости содержимого или замена рекламных блоков. В моём случае на нескольких сотнях постов был вручную вставлен рекламный скрипт Google. Вручную править ~1000 записей — долго и ошибочно, поэтому удобнее удалить старый скрипт из базы.
Ключевой принцип: вы должны иметь чёткий маркер начала и конца блока, который хотите удалить. Например, для рекламного блока это могут быть теги после найденного начала).
Отладка и случаи, когда метод не сработает
- Различное форматирование старых вставок. Если у вас есть несколько вариантов кода рекламы (разные атрибуты, разные URL или дополнительные комментарии), простая строковая замена не удалит все варианты.
- Блоки без чёткого конечного маркера. Если реклама вставлена в середине и нет уникального конечного тега, придётся подбирать более сложные маркеры или использовать регулярные выражения на стороне PHP.
- Один и тот же скрипт в других частях поста (например, в виджетах) — применяя глобальную замену, можно нечаянно удалить нужные в других местах скрипты. Ограничьте WHERE по post_type или по ID.
Пример непойманного старого варианта
Если блоки различаются, повторите процесс с модифицированными маркерами для каждого формата.
Альтернативные подходы
- WP-CLI search-replace — удобен для поиска/замены по всему сайту из командной строки и поддерживает dry-run: wp search-replace ‘старыйфрагмент’ ‘новыйфрагмент’ –dry-run.
- Плагины типа Better Search Replace — визуальный интерфейс, тестовый прогон и откат.
- Экспорт базы в файл, правка в текстовом редакторе с поддержкой регулярных выражений и повторный импорт — полезно при массовых сложных заменах.
- Написать короткий PHP-скрипт, который загрузит посты, применит preg_replace с корректными регулярными выражениями и сохранит обновлённые записи через WP API.
Безопасность и бэкап SOP
- Всегда делайте полную резервную копию базы перед изменениями.
- Тестируйте запросы сначала на ограниченном наборе записей (WHERE ID IN (…)) или используйте транзакции (если таблицы InnoDB).
- Снимите дамп перед запуском UPDATE и сохраните на отдельном носителе.
Пример простого отката (если у вас есть дамп):
- Удалите текущую базу/таблицу (или переименуйте её).
- Восстановите дамп стандартными средствами phpMyAdmin или mysql client.
Шаблоны и полезные вариации SQL
- Вариант для финального тега, если вы хотите искать ближайший закрывающий после начала блока (более надёжно):
UPDATE wp_posts
SET post_content = REPLACE(post_content,
SUBSTR(post_content,
LOCATE('', post_content, LOCATE('’, post_content, start_pos) ищет первое закрывающee после начала блока; +9 — длина строки “”.- Вариант для нескольких маркеров: запускайте серию UPDATE с разными парами маркеров или объединяйте условия в WHERE через OR.
Рольовые чек-листы перед запуском
Для разработчика:
- Проверить SQL-синтаксис и экранирование строк.
- Запустить SELECT с SUBSTR для 5 тестовых записей.
- Убедиться, что WHERE ограничивает запрос только нужными постами.
Для администратора сервера:
- Сделать бэкап базы и файлов.
- Убедиться, что хватает места для дампа.
- Проверить права доступа к базе.
Для редактора контента:
- Просмотреть несколько постов до и после правки.
- Проверить, что форматирование и изображения не пострадали.
Критерии приёмки
- Рекламные блоки удалены из всех целевых постов.
- Страница поста корректно рендерится, HTML валиден и не содержит обрывков скрипта.
- Файловая и базовая копии доступны для отката.
Мини-методология для повторяемых задач
- Инвентаризация: найти все варианты блока.
- Тестирование: подготовить SELECT/SUBSTR и проверить на примерах.
- Резервирование: сделать бэкап.
- Выполнение: выполнить UPDATE по ограниченному набору.
- Верификация: проверить результаты и запустить на всех записях.
Тест-кейсы и приёмочные проверки
- Тест 1: Выполнить SELECT SUBSTR для 5 постов; убедиться, что извлекается полный блок.
- Тест 2: Выполнить UPDATE на 1-5 записях и вручную проверить корректность вывода на сайте.
- Тест 3: Проверить логи веб-сервера на предмет ошибок JavaScript после удаления.
Что ещё учесть
- Если реклама подгружается динамически через виджет или плагин — лучше отключить плагин, чем править базу.
- В сложных случаях используйте регулярные выражения на уровне PHP, а не чистый SQL.
Важно: перед запуском любых глобальных UPDATE сделайте резервную копию. Откат без дампа может быть невозможен.
Image credits: Shutterstock
Итог
Удаление повторяющихся HTML/JS-блоков из поля post_content таблицы wp_posts — мощный способ быстро почистить сайт от устаревшей рекламы. Метод основывается на LOCATE, SUBSTR и REPLACE и подходит, когда у блока есть чёткие начальный и конечный маркеры. Альтернативы включают WP-CLI, плагины и правку через PHP. Всегда делайте бэкап, тестируйте на выборке и проверяйте результат на нескольких постах.
Похожие материалы
Блокировка обновлений драйверов в Windows 10
Геометрический логотип в Photoshop — пошагово
Снизить пинг в Roblox — быстрое руководство
Настройка боковой панели Finder в macOS
Шифрование файлов в Vim — защита текстов