Шорткоды — мощный инструмент WordPress, позволяющий вставлять функционал и контент в записи и страницы. Однако со временем на сайте могут накопиться неиспользуемые или устаревшие шорткоды, которые остаются в базе данных, мета-полях, или в редакторе, но при этом не выполняют свою функцию. Это создает лишнюю нагрузку и может замедлять сайт, а также портить визуальное отображение контента.
Почему важно удалять неиспользуемые шорткоды в WordPress
Удаление неиспользуемых шорткодов — это не только вопрос чистоты кода, но и оптимизации производительности. Вот несколько причин, почему стоит это делать:
- Уменьшение нагрузки на сервер: обработка множества лишних шорткодов требует ресурсов;
- Чистота базы данных и контента: уменьшение хаоса повышает стабильность и упрощает поддержку;
- Избежание визуальных ошибок: нераспознанные шорткоды отображаются как текст, что портит внешний вид;
- Облегчение миграции и обновлений: меньше устаревших вызовов — проще обновлять темы и плагины.
Как найти неиспользуемые шорткоды в базе данных и контенте WordPress
Для поиска неиспользуемых шорткодов можно использовать несколько способов:
1. Поиск по базе данных через SQL-запросы
Шорткоды обычно находятся в таблице wp_posts в поле post_content. Чтобы найти все записи с определённым шорткодом, используйте запрос:
SELECT ID, post_title FROM wp_posts WHERE post_content LIKE '%[shortcode_name%';Если вы не знаете, какие шорткоды используются, можно сделать поиск по шаблону %[% — все шорткоды начинаются с [:
SELECT ID, post_title FROM wp_posts WHERE post_content REGEXP '\\[[a-zA-Z0-9_\-]+';Это позволит найти все записи с любыми шорткодами.
2. Программный поиск шорткодов через PHP
Чтобы проверить, какие шорткоды зарегистрированы в системе, можно использовать функцию shortcode_exists. Для поиска неиспользуемых шорткодов можно перебрать все зарегистрированные и проверить, где они встречаются в контенте.
Вот пример функции для поиска шорткодов в постах:
function wordpresses_find_unused_shortcodes() {
global $wpdb;
$registered_shortcodes = array_keys($GLOBALS['shortcode_tags']);
$unused = [];
foreach ($registered_shortcodes as $shortcode) {
$like = '%[' . $wpdb->esc_like($shortcode) . '%';
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_content LIKE %s",
$like
));
if (!$count) {
$unused[] = $shortcode;
}
}
return $unused;
}Эту функцию можно вызвать, например, в консоли WP-CLI или через админку для получения списка неиспользуемых шорткодов.
3. Использование WP_Query для поиска по постам
Пример запроса для поиска шорткода [example] в постах:
$query = new WP_Query([
's' => '[example',
'post_type' => 'any',
'posts_per_page' => -1
]);
foreach($query->posts as $post) {
echo 'Найдена запись: ' . esc_html($post->post_title) . '<br>';
}Как безопасно удалить неиспользуемые шорткоды из контента
Если вы определили, что шорткод больше не используется и его вызовы можно удалить, то достаточно сделать массовую замену.
Самый простой способ — выполнить SQL-запрос, который удалит все вхождения шорткода:
UPDATE wp_posts SET post_content = REPLACE(post_content, '[shortcode_name]', '') WHERE post_content LIKE '%[shortcode_name]%';<Если шорткод имеет атрибуты, лучше использовать PHP, чтобы корректно удалить все варианты:
function wordpresses_remove_shortcode_from_content($content, $shortcode) {
$pattern = get_shortcode_regex([$shortcode]);
return preg_replace('/' . $pattern . '/s', '', $content);
}
// Пример массового удаления в цикле
$posts = get_posts(['post_type' => 'any', 'numberposts' => -1]);
foreach ($posts as $post) {
$new_content = wordpresses_remove_shortcode_from_content($post->post_content, 'shortcode_name');
if ($new_content !== $post->post_content) {
wp_update_post(['ID' => $post->ID, 'post_content' => $new_content]);
}
}Этот скрипт удалит все вызовы шорткода, не затрагивая остальной контент.
Удаление неиспользуемых шорткодов из мета-полей и виджетов
Шорткоды могут храниться не только в постах, но и в пользовательских полях (мета), а также в виджетах. Для поиска и удаления их там нужно:
1. Поиск в meta_value таблицы wp_postmeta
SELECT post_id, meta_key FROM wp_postmeta WHERE meta_value LIKE '%[shortcode_name%';Для очистки можно использовать PHP:
$meta_items = $wpdb->get_results($wpdb->prepare(
"SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_value LIKE %s",
'%[shortcode_name%'
));
foreach ($meta_items as $item) {
$new_value = preg_replace('/\[' . preg_quote('shortcode_name') . '[^\]]*\]/', '', $item->meta_value);
if ($new_value !== $item->meta_value) {
$wpdb->update(
$wpdb->postmeta,
['meta_value' => $new_value],
['meta_id' => $item->meta_id]
);
}
}2. Очистка виджетов
Данные виджетов хранятся в опциях. Для поиска шорткодов в виджетах можно попробовать сериализованный поиск в таблице wp_options по ключу widget_*.
Для удаления шорткодов из виджетов можно экспортировать настройки, заменить в них шорткоды и импортировать обратно, либо написать скрипт с unserialize/serialize для очистки.
Практические советы для работы с шорткодами и оптимизацией
Чтобы в будущем избежать накопления неиспользуемых шорткодов, следуйте рекомендациям:
- Удаляйте шорткод из кода плагина или темы только после удаления всех вхождений в контенте.
- Используйте Clearfy Pro с функцией очистки неиспользуемых шорткодов — удобный инструмент для автоматизации.
- Регулярно проверяйте базу данных на наличие устаревших шорткодов с помощью SQL-запросов или скриптов.
- При переносе сайта или миграции данных внимательно следите за шорткодами, чтобы не потерять важный функционал и не оставить мусор.
Если вы хотите автоматизировать процесс поиска и удаления, можно создать небольшой плагин, который будет сканировать и очищать шорткоды по расписанию. Это поможет поддерживать сайт в чистоте без лишних усилий.
Для примера, вот базовый код плагина, который удаляет конкретный шорткод из всех постов при активации:
<?php
/**
* Plugin Name: WordPresses Remove Unused Shortcodes
* Description: Удаляет шорткод [example] из контента при активации.
* Version: 1.0
* Author: WordPresses
*/
register_activation_hook(__FILE__, 'wordpresses_remove_unused_shortcode_activation');
function wordpresses_remove_unused_shortcode_activation() {
$shortcode = 'example';
$posts = get_posts(['post_type' => 'any', 'numberposts' => -1]);
foreach ($posts as $post) {
$new_content = wordpresses_remove_shortcode_from_content($post->post_content, $shortcode);
if ($new_content !== $post->post_content) {
wp_update_post(['ID' => $post->ID, 'post_content' => $new_content]);
}
}
}
function wordpresses_remove_shortcode_from_content($content, $shortcode) {
$pattern = get_shortcode_regex([$shortcode]);
return preg_replace('/' . $pattern . '/s', '', $content);
}
Таким образом, вы можете адаптировать этот код под свои нужды и запускать удаление по расписанию или вручную.
Использование таких подходов позволит поддерживать WordPress-сайт в порядке, ускорит загрузку и улучшит пользовательский опыт.