Что такое динамические шорткоды в WordPress и зачем они нужны
Шорткоды — это мощный инструмент WordPress, позволяющий вставлять функциональные элементы в контент страниц и записей. Стандартные шорткоды, например [gallery] или [audio], выводят статичный контент. Однако динамические шорткоды способны генерировать контент на лету, основываясь на параметрах, текущем состоянии сайта или данных из базы.
Динамические шорткоды позволяют создавать гибкие и интерактивные элементы: вывод последних записей, формы обратной связи с уникальными параметрами, кастомные списки товаров и многое другое. Они незаменимы, если необходимо минимизировать количество кода в шаблонах и дать возможность контент-менеджерам самостоятельно вставлять сложные блоки.
В этой статье мы подробно разберём, как создавать динамические шорткоды с нуля, какие параметры они могут принимать, а также рассмотрим примеры с использованием встроенных функций и плагинов.
Создание базового динамического шорткода: пошагово
Начнём с простого примера. Предположим, нужно вывести список последних 5 записей определённой категории. Для этого создадим шорткод [wpcatalog_latest_posts category="novosti" count="5"].
В functions.php вашей темы или в файле плагина добавьте следующий код:
function wpcatalog_latest_posts_shortcode($atts) {
$atts = shortcode_atts(
array(
'category' => '',
'count' => 5,
), $atts, 'wpcatalog_latest_posts'
);
$query_args = array(
'posts_per_page' => intval($atts['count']),
'category_name' => sanitize_text_field($atts['category']),
'post_status' => 'publish',
);
$query = new WP_Query($query_args);
if (!$query->have_posts()) {
return '<p>Нет записей для отображения.</p>';
}
$output = '<ul class="wpcatalog-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('wpcatalog_latest_posts', 'wpcatalog_latest_posts_shortcode');Этот код регистрирует шорткод wpcatalog_latest_posts, который принимает параметры category и count. Он выполняет WP_Query и выводит список ссылок на записи.
Расширение функционала: обработка дополнительных параметров и безопасность
Для гибкости можно добавить больше параметров, например, сортировку, вывод даты, обрезку заголовков и т.д. Также важно обезопасить вывод и обработку данных.
Добавим параметр show_date и ограничение длины заголовка через title_length:
function wpcatalog_latest_posts_shortcode($atts) {
$atts = shortcode_atts(
array(
'category' => '',
'count' => 5,
'show_date' => false,
'title_length' => 50,
), $atts, 'wpcatalog_latest_posts'
);
$query_args = array(
'posts_per_page' => intval($atts['count']),
'category_name' => sanitize_text_field($atts['category']),
'post_status' => 'publish',
);
$query = new WP_Query($query_args);
if (!$query->have_posts()) {
return '<p>Нет записей для отображения.</p>';
}
$output = '<ul class="wpcatalog-latest-posts">';
while ($query->have_posts()) {
$query->the_post();
$title = get_the_title();
if (mb_strlen($title) > intval($atts['title_length'])) {
$title = mb_substr($title, 0, intval($atts['title_length'])) . '...';
}
$output .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html($title) . '</a>';
if ($atts['show_date']) {
$output .= ' <small>' . get_the_date('d.m.Y') . '</small>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}Обратите внимание на функции esc_url и esc_html, которые защищают от XSS-уязвимостей. Всегда используйте такие функции при выводе данных, особенно если они поступают от пользователя.
Использование плагинов для создания динамических шорткодов
Если вы не хотите писать код вручную, существуют плагины, которые позволяют создавать шорткоды с динамическим содержимым через визуальный интерфейс или с минимальным кодингом:
- Shortcodes Ultimate — популярный плагин с набором готовых шорткодов и возможностью создавать свои.
- WP Shortcode Pro — расширенный плагин с возможностями кастомизации и динамическими параметрами.
- Dynamic Content for Elementor — если вы используете Elementor, этот плагин позволяет создавать динамические блоки с шорткодами.
Например, в Shortcodes Ultimate можно сделать кастомный шорткод, подключив PHP-функцию через add_shortcode, а потом использовать визуальный редактор для вставки и настройки параметров.
Пример использования Shortcodes Ultimate с динамическим PHP-кодом
Создайте свой плагин с функцией, как в примерах выше, зарегистрируйте шорткод, затем используйте его в контенте с параметрами. Это позволит вам комбинировать удобство визуального редактора и мощь PHP.
Советы по оптимизации и отладке динамических шорткодов
При создании динамических шорткодов обращайте внимание на производительность. WP_Query может быть тяжёлым, если запросы сложные и частые. Рекомендуется кешировать результаты, например, через Transients API:
function wpcatalog_latest_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'category' => '',
'count' => 5,
), $atts, 'wpcatalog_latest_posts');
$cache_key = 'wpcatalog_latest_posts_' . md5(serialize($atts));
$output = get_transient($cache_key);
if ($output !== false) {
return $output;
}
// ... здесь код запроса и формирования $output ...
set_transient($cache_key, $output, 3600); // кеш на час
return $output;
}Также при отладке можно использовать функции error_log или плагины типа Query Monitor, которые покажут детали запросов и ошибок.
Пример сложного динамического шорткода: вывод товаров по цене с фильтрацией
Допустим, у вас интернет-магазин на WooCommerce, и нужно вывести список товаров с ценой ниже заданного значения, передаваемого через параметр шорткода.
function wpcatalog_cheap_products_shortcode($atts) {
$atts = shortcode_atts(array(
'max_price' => 1000,
'count' => 10,
), $atts, 'wpcatalog_cheap_products');
$args = array(
'post_type' => 'product',
'posts_per_page' => intval($atts['count']),
'meta_query' => array(
array(
'key' => '_price',
'value' => floatval($atts['max_price']),
'compare' => '<=',
'type' => 'NUMERIC',
),
),
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Нет товаров по заданной цене.</p>';
}
$output = '<ul class="wpcatalog-cheap-products">';
while ($query->have_posts()) {
$query->the_post();
$price = get_post_meta(get_the_ID(), '_price', true);
$output .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a> — ' . wc_price($price) . '</li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}
add_shortcode('wpcatalog_cheap_products', 'wpcatalog_cheap_products_shortcode');Такой шорткод будет полезен для страницы акций или специальных предложений и позволит пользователям быстро находить выгодные товары.