Диагностика: как определить наличие неиспользуемых шорткодов в базе WordPress
Частая проблема при длительной эксплуатации сайта — наличие в базе данных записей с устаревшими шорткодами, которые больше не подключены или не используются в теме или плагинах. Они создают «мусор» в post_content и замедляют работу редактора, а иногда и фронтенда.
Для диагностики используйте поиск по базе данных через phpMyAdmin или аналогичный инструмент. Запрос для поиска шорткодов по паттерну [shortcode] или [shortcode attr=] выглядит так:
SELECT ID, post_title, post_type FROM wp_posts WHERE post_content LIKE '%[your_shortcode%';
Если вы не уверены, какие шорткоды используются в вашем проекте, проверьте список зарегистрированных шорткодов с помощью PHP-кода:
global $shortcode_tags;
print_r(array_keys($shortcode_tags));
Сопоставив найденные шорткоды в контенте и зарегистрированные, вы выявите неиспользуемые.
Пошаговое решение: удаление неиспользуемых шорткодов из базы через SQL
Внимание: перед выполнением любых операций с базой сделайте полный бэкап.
- Определите точное имя неиспользуемого шорткода, например
old_shortcode. - Подготовьте SQL-запрос, который удалит все вхождения шорткода из
post_content. Пример для простого шорткода без вложенных атрибутов:
UPDATE wp_posts
SET post_content = REGEXP_REPLACE(post_content, '\[old_shortcode[^\]]*\]', '', 'g')
WHERE post_content LIKE '%[old_shortcode%';
Если сервер MySQL версии ниже 8.0 и не поддерживает REGEXP_REPLACE, используйте PHP-скрипт для массовой очистки.
- Для сложных случаев, когда шорткод имеет закрывающий тег
[old_shortcode]...[/old_shortcode], используйте регулярное выражение с захватом содержимого:
UPDATE wp_posts
SET post_content = REGEXP_REPLACE(post_content, '\[old_shortcode[^\]]*\].*?\[/old_shortcode\]', '', 'gs')
WHERE post_content LIKE '%[old_shortcode%';
Обратите внимание на флаги g (глобальный) и s (многострочный режим) для корректной работы с многострочным контентом.
Пример PHP-скрипта для удаления шорткодов при отсутствии поддержки REGEXP_REPLACE
?php
$shortcode = 'old_shortcode';
$args = [
'post_type' => 'any',
's' => "[{$shortcode}",
'posts_per_page' => -1,
];
$posts = get_posts($args);
foreach ($posts as $post) {
$content = $post->post_content;
$pattern = get_shortcode_regex();
$content = preg_replace_callback('/' . $pattern . '/', function($matches) use ($shortcode) {
return $matches[2] === $shortcode ? '' : $matches[0];
}, $content);
wp_update_post(['ID' => $post->ID, 'post_content' => $content]);
}
?>
Проверка результата после очистки
- Запустите SQL-запрос для поиска остатков шорткода:
SELECT ID FROM wp_posts WHERE post_content LIKE '%[old_shortcode%';. Должен вернуть 0 записей. - Проверьте несколько отредактированных постов в админке — шорткод должен исчезнуть из контента.
- Тестируйте фронтенд на предмет ошибок и корректного отображения страниц, где был удалён шорткод.
Частые ошибки и как их исправить
- Отсутствие бэкапа: при ошибках восстановления данных не будет. Всегда делайте копию базы.
- Неправильное регулярное выражение: удаляет лишний контент или не удаляет шорткод. Тестируйте на копии БД.
- Игнорирование вложенных шорткодов: если шорткод содержит вложенные, простое удаление может повредить структуру. Используйте PHP-скрипт с
get_shortcode_regex(). - Удаление активных шорткодов: проверьте, что шорткод действительно не используется в коде темы или плагина.
Практические советы по безопасности и производительности
- Перед массовой заменой отключите на время кэширование и плагины, которые могут кешировать содержимое.
- Выполняйте операции на копии базы, если сайт большой, чтобы избежать блокировок и долгой работы запроса.
- Для регулярного удаления неиспользуемых шорткодов используйте WP-CLI с кастомным скриптом для автоматизации.
- Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpclean.ru&utm_medium=article&utm_campaign=kak-udalit-neispolzuemye-shortkody-iz-bazy-dannyh-wordpress-s-pomoshhyu-sql) для комплексной оптимизации и чистки сайта — он поможет выявлять и удалять мусор, в том числе шорткоды.
Сравнение способов удаления неиспользуемых шорткодов
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| SQL-запрос с REGEXP_REPLACE | Быстро, без загрузки WordPress | Требуется MySQL 8+, риск ошибки в regexp | Большие сайты с поддержкой MySQL 8+ |
| PHP-скрипт с get_shortcode_regex() | Точно, учитывает вложенные шорткоды | Долго на больших сайтах, требует запуска в WP | Средние и маленькие сайты |
| Плагины для очистки | Простота использования | Не всегда гибко, могут быть платными | Быстрая уборка без кода |