Шорткоды в WordPress — мощный инструмент для вставки динамического контента, однако со временем в базе данных и контенте сайта может накопиться множество неиспользуемых или устаревших шорткодов. Они не только «засоряют» контент, но и могут замедлять работу сайта или приводить к ошибкам отображения. В этой статье мы подробно разберем, как найти и удалить неиспользуемые шорткоды в WordPress, как автоматизировать этот процесс и какие плагины могут помочь.
Почему важно удалять неиспользуемые шорткоды в WordPress
Со временем на сайте появляются шорткоды, которые перестали работать из-за удаления плагинов или изменения структуры сайта. Они остаются в записях, страницах или виджетах и выводятся как текст вида [old_shortcode], что портит внешний вид страниц и снижает качество контента. Кроме того, такие шорткоды:
- Увеличивают объем базы данных и контента.
- Могут вызывать конфликты с новыми плагинами.
- Усложняют поддержку сайта.
Регулярная очистка контента от неиспользуемых шорткодов улучшает производительность и упрощает дальнейшую разработку.
Как найти неиспользуемые шорткоды вручную
Для начала полезно узнать, какие шорткоды зарегистрированы на текущем сайте, и какие из них реально используются в контенте. Вот как это сделать:
Получение списка зарегистрированных шорткодов
WordPress хранит зарегистрированные шорткоды в глобальном массиве $shortcode_tags. Вы можете получить список всех шорткодов с помощью следующей функции:
function wpacademy_get_registered_shortcodes() {
global $shortcode_tags;
return array_keys($shortcode_tags);
}
// Выводим список в лог для отладки
error_log(print_r(wpacademy_get_registered_shortcodes(), true));
Это поможет понять, какие шорткоды активны сейчас.
Поиск шорткодов в содержимом базы данных
Чтобы найти шорткоды, которые реально используются, можно выполнить SQL-запросы по таблице wp_posts (или с вашим префиксом) с поиском по содержимому постов и страниц:
SELECT ID, post_title, post_content
FROM wp_posts
WHERE post_content LIKE '%[shortcode_name%'
AND post_status = 'publish';
Замените shortcode_name на интересующий шорткод. Для массового поиска можно написать скрипт, который переберет все зарегистрированные шорткоды и покажет, где они встречаются.
Автоматическое удаление неиспользуемых шорткодов из контента
Если шорткод не зарегистрирован, но встречается в содержимом, WordPress выводит его как текст. Чтобы избавиться от таких шорткодов, можно использовать фильтр the_content и регулярные выражения для удаления всех неизвестных шорткодов.
Пример функции для удаления неиспользуемых шорткодов
function wpacademy_remove_unused_shortcodes($content) {
global $shortcode_tags;
// Получаем все зарегистрированные шорткоды
$registered = array_keys($shortcode_tags);
// Шорткоды, которые мы хотим удалить (не зарегистрированные)
preg_match_all('/\[(\w+)[^\]]*\]/', $content, $matches);
$all_shortcodes_in_content = $matches[1];
foreach ($all_shortcodes_in_content as $shortcode) {
if (!in_array($shortcode, $registered)) {
// Удаляем все вхождения шорткода
$pattern = '/\[' . preg_quote($shortcode, '/') . '(\s[^\]]*)?\](?:.*?\[\/'. preg_quote($shortcode, '/') .'\])?/s';
$content = preg_replace($pattern, '', $content);
}
}
return $content;
}
add_filter('the_content', 'wpacademy_remove_unused_shortcodes', 20);
Эта функция удалит нераспознанные шорткоды из выводимого контента без изменения записей в базе данных.
Полное удаление шорткодов из базы данных
Для более радикального решения можно заменить или удалить шорткоды непосредственно в базе данных. Для этого рекомендуется сначала сделать бэкап базы. Затем можно использовать WP-CLI или написать PHP-скрипт:
PHP-скрипт для удаления шорткодов из постов
function wpacademy_purge_unused_shortcodes_from_db() {
global $wpdb, $shortcode_tags;
$registered = array_keys($shortcode_tags);
// Получаем все посты с шорткодами
$posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_content LIKE '%[%]%' AND post_status = 'publish'");
foreach ($posts as $post) {
$content = $post->post_content;
preg_match_all('/\[(\w+)[^\]]*\]/', $content, $matches);
$shortcodes_in_post = $matches[1];
$changed = false;
foreach ($shortcodes_in_post as $shortcode) {
if (!in_array($shortcode, $registered)) {
$pattern = '/\[' . preg_quote($shortcode, '/') . '(\s[^\]]*)?\](?:.*?\[\/'. preg_quote($shortcode, '/') .'\])?/s';
$content = preg_replace($pattern, '', $content);
$changed = true;
}
}
if ($changed) {
$wpdb->update(
$wpdb->posts,
array('post_content' => $content),
array('ID' => $post->ID)
);
}
}
}
// Запустите функцию один раз через WP-CLI или в админке
// wpacademy_purge_unused_shortcodes_from_db();
После выполнения этого скрипта в базе не останется неиспользуемых шорткодов.
Полезные плагины для поиска и удаления неиспользуемых шорткодов
Если вы предпочитаете готовые решения, рекомендуем обратить внимание на следующие плагины:
- Clearfy Pro — плагин для оптимизации WordPress, который включает модуль очистки неиспользуемых шорткодов и удаление скрытых мусорных данных. Подробнее — Clearfy Pro на wpshop.ru.
- Shortcode Cleaner — бесплатный плагин в репозитории WordPress, который помогает находить и удалять неработающие шорткоды.
- Better Search Replace — плагин для массовой замены текста в базе данных, который можно использовать для удаления шорткодов через поиск и замену.
Рекомендации по предотвращению накопления неиспользуемых шорткодов
Чтобы в будущем не сталкиваться с проблемой, придерживайтесь следующих практик:
- При удалении плагинов, которые добавляли шорткоды, сначала удаляйте шорткоды из контента.
- Используйте кастомные шорткоды с префиксом, например
wpacademy_, чтобы избежать конфликтов и легче идентифицировать. - Регулярно проверяйте контент на наличие неработающих шорткодов с помощью SQL-запросов или плагинов.
- Для динамического контента используйте блоки Gutenberg или виджеты вместо шорткодов, если это возможно.