Шорткоды — один из самых удобных способов добавить функциональность в страницы и записи WordPress без необходимости писать сложный код в шаблонах. Но часто стандартные статичные шорткоды не удовлетворяют потребности, и возникает необходимость создавать динамические шорткоды. В этой статье мы подробно разберём, как сделать динамические шорткоды в WordPress, которые будут принимать параметры и генерировать контент на лету.
Что такое динамические шорткоды и зачем они нужны
Стандартный шорткод — это такая конструкция в виде [example], которая при выводе на странице заменяется на определённый HTML или другой контент. Однако часто нужно, чтобы шорткод принимал параметры, например, [example id="123" color="red"], и генерировал уникальный контент в зависимости от этих параметров.
Динамические шорткоды позволяют:
- Выводить данные из базы или API по заданным параметрам;
- Генерировать уникальный HTML с учётом атрибутов;
- Создавать многофункциональные компоненты, которые можно переиспользовать;
- Улучшать удобство контент-менеджмента без необходимости писать PHP в шаблонах.
Рассмотрим, как реализовать такие шорткоды на примерах.
Как создать динамический шорткод: базовая структура
Для начала нам нужно зарегистрировать шорткод в WordPress с помощью функции add_shortcode. В обработчике шорткода мы принимаем атрибуты и возвращаем строку с нужным контентом.
Пример базового динамического шорткода:
function wppremium_dynamic_shortcode($atts) {
// Задаём параметры по умолчанию
$atts = shortcode_atts(array(
'text' => 'Привет, мир!',
'color' => 'black'
), $atts, 'wppremium_dynamic');
// Формируем HTML с учётом параметров
return '<span style="color:' . esc_attr($atts['color']) . '">' . esc_html($atts['text']) . '</span>';
}
add_shortcode('wppremium_dynamic', 'wppremium_dynamic_shortcode');Теперь в редакторе можно вставить [wppremium_dynamic text="Текст" color="red"] и получить цветной текст.
Практический пример: шорткод для вывода последних постов с фильтрацией
Представим, что нам нужно вывести список последних записей с возможностью задавать количество и категорию через параметры шорткода.
Реализуем шорткод [wppremium_latest_posts count=5 category="novosti"].
function wppremium_latest_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 3,
'category' => ''
), $atts, 'wppremium_latest_posts');
$args = array(
'posts_per_page' => intval($atts['count']),
'post_status' => 'publish'
);
if (!empty($atts['category'])) {
$args['category_name'] = sanitize_text_field($atts['category']);
}
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Посты не найдены.</p>';
}
$output = '<ul class="wppremium-latest-posts">';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}
add_shortcode('wppremium_latest_posts', 'wppremium_latest_posts_shortcode');Такой шорткод очень универсален и может быть использован в любом месте сайта без редактирования шаблонов.
Использование параметров и безопасность данных
Очень важно правильно обрабатывать входящие параметры. Используйте shortcode_atts для задания значений по умолчанию и фильтры esc_html, esc_attr и sanitize_text_field для очистки данных. Это защитит сайт от XSS-атак и других уязвимостей.
Например, в нашем шорткоде с последними постами мы очистили параметр category с помощью sanitize_text_field, а число постов преобразовали в целое через intval.
Расширение динамических шорткодов: добавляем кэширование результата
Если шорткод выполняет тяжелые запросы, стоит добавить кэширование результата с помощью Transients API. Это ускорит загрузку и снизит нагрузку на сервер.
function wppremium_cached_latest_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 3,
'category' => ''
), $atts, 'wppremium_cached_latest_posts');
$cache_key = 'wppremium_latest_posts_' . md5(serialize($atts));
$output = get_transient($cache_key);
if ($output === false) {
$args = array(
'posts_per_page' => intval($atts['count']),
'post_status' => 'publish'
);
if (!empty($atts['category'])) {
$args['category_name'] = sanitize_text_field($atts['category']);
}
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Посты не найдены.</p>';
}
$output = '<ul class="wppremium-latest-posts">';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
$output .= '</ul>';
wp_reset_postdata();
set_transient($cache_key, $output, 3600); // Кэш на час
}
return $output;
}
add_shortcode('wppremium_cached_latest_posts', 'wppremium_cached_latest_posts_shortcode');Такой подход существенно улучшает производительность сайта при большом трафике.
Плагины для работы с динамическими шорткодами
Если хочется упростить создание сложных шорткодов без программирования, можно воспользоваться проверенными плагинами:
- Shortcodes Ultimate — мощный набор визуальных шорткодов с возможностью кастомизации;
- WP Shortcode by MyThemeShop — лёгкий плагин с базовым функционалом;
- Custom Content Shortcode — для создания собственных шорткодов с HTML и PHP;
- Shortcoder — позволяет создавать шорткоды из HTML, JavaScript и PHP прямо из админки.
Однако для профессиональных сайтов часто требуется писать собственные динамические шорткоды, чтобы точно реализовать нужный функционал.
Выводы и рекомендации
Динамические шорткоды — это мощный инструмент расширения возможностей WordPress без изменения шаблонов. Они позволяют создавать гибкие и многофункциональные блоки контента, управляемые из редактора. Главное — правильно обрабатывать параметры и заботиться о безопасности.
Начинайте с простых примеров и постепенно усложняйте шорткоды, добавляя кэширование, обработку ошибок и дополнительные функции. Такой подход сделает ваш сайт более функциональным и удобным для администраторов и пользователей.