В WordPress шорткоды — это мощный инструмент для вставки динамического контента в записи, страницы и виджеты. Однако стандартные шорткоды часто бывают статичными, и чтобы добавить интерактивность или получать данные из базы, нужны динамические шорткоды. В этой статье мы подробно разберём, как создавать такие шорткоды, почему они полезны и как их использовать на практике.
Что такое динамические шорткоды и зачем они нужны
Динамические шорткоды — это те, которые генерируют контент во время выполнения, основываясь на параметрах, контексте страницы или данных из базы. В отличие от статичных шорткодов, где вывод всегда одинаковый, динамические изменяются, что даёт гибкость и мощность.
Например, можно создать шорткод, который показывает последние 5 записей определённой категории, либо выводит форму с предзаполненными данными пользователя. Это экономит время и позволяет избежать ручного редактирования контента.
Использование динамических шорткодов особенно актуально для сайтов с большим количеством контента, интернет-магазинов, образовательных порталов и проектов, где контент должен обновляться автоматически.
Создание базового динамического шорткода в WordPress
Начнём с простого примера. Предположим, нужно создать шорткод [wptour_latest_posts category="news" count="3"], который выводит 3 последние записи из категории news.
Для этого в functions.php вашей темы или в собственном плагине добавим следующий код:
function wptour_get_latest_posts_shortcode($atts) {
$atts = shortcode_atts( array(
'category' => '',
'count' => 5,
), $atts, 'wptour_latest_posts' );
$query_args = array(
'posts_per_page' => intval($atts['count']),
'category_name' => sanitize_text_field($atts['category']),
'post_status' => 'publish',
);
$posts = get_posts($query_args);
if (empty($posts)) {
return '<p>Нет записей для отображения.</p>';
}
$output = '<ul>';
foreach ($posts as $post) {
$title = esc_html(get_the_title($post));
$link = esc_url(get_permalink($post));
$output .= "<li><a href=\"$link\">$title</a></li>";
}
$output .= '</ul>';
return $output;
}
add_shortcode('wptour_latest_posts', 'wptour_get_latest_posts_shortcode');Этот код регистрирует шорткод, принимает параметры, формирует запрос к базе и выводит список ссылок. Благодаря параметрам шорткод становится универсальным.
Передача параметров и безопасность данных
Очень важно всегда очищать входящие параметры, чтобы избежать XSS и других уязвимостей. В примере выше использованы функции sanitize_text_field и intval для обработки параметров.
Также не стоит забывать про экранирование вывода: для ссылок используем esc_url, для заголовков — esc_html.
Если шорткод принимает более сложные данные или формирует HTML с пользовательскими вводами, стоит дополнительно использовать функции WordPress для безопасности.
Динамические шорткоды с формами и обработкой данных
Рассмотрим пример шорткода с формой обратной связи, который обрабатывает отправку данных без перезагрузки страницы.
Для этого нам понадобится AJAX. Добавим шорткод [wptour_contact_form], который выводит форму:
function wptour_contact_form_shortcode() {
ob_start();
?>
<form id="wptour-contact-form" method="post">
<input type="text" name="wptour_name" placeholder="Ваше имя" required />
<input type="email" name="wptour_email" placeholder="Email" required />
<textarea name="wptour_message" placeholder="Сообщение" required></textarea>
<button type="submit">Отправить</button>
<div id="wptour-form-response"></div>
</form>
<script>
jQuery(document).ready(function($) {
$('#wptour-contact-form').on('submit', function(e) {
e.preventDefault();
var data = {
action: 'wptour_send_contact_form',
name: $('input[name=wptour_name]').val(),
email: $('input[name=wptour_email]').val(),
message: $('textarea[name=wptour_message]').val(),
security: wptour_ajax_obj.nonce
};
$.post(wptour_ajax_obj.ajax_url, data, function(response) {
$('#wptour-form-response').html(response.data);
});
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('wptour_contact_form', 'wptour_contact_form_shortcode');
function wptour_enqueue_scripts() {
wp_enqueue_script('jquery');
wp_localize_script('jquery', 'wptour_ajax_obj', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wptour_nonce')
));
}
add_action('wp_enqueue_scripts', 'wptour_enqueue_scripts');
function wptour_handle_contact_form() {
check_ajax_referer('wptour_nonce', 'security');
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$message = sanitize_textarea_field($_POST['message']);
if (empty($name) || empty($email) || empty($message)) {
wp_send_json_error('Пожалуйста, заполните все поля.');
}
// Здесь можно добавить отправку письма, сохранение в базу и т.п.
wp_send_json_success('Спасибо за ваше сообщение, мы свяжемся с вами в ближайшее время.');
}
add_action('wp_ajax_wptour_send_contact_form', 'wptour_handle_contact_form');
add_action('wp_ajax_nopriv_wptour_send_contact_form', 'wptour_handle_contact_form');Этот пример показывает, как создать интерактивную форму с помощью шорткода, отправлять данные через AJAX и обрабатывать их на сервере.
Полезные плагины для расширения функционала шорткодов
Если хочется не писать код с нуля, можно использовать популярные плагины для динамических шорткодов:
- Shortcodes Ultimate — набор готовых шорткодов с возможностью настройки и расширения;
- WP Shortcode by MyThemeShop — простой и удобный плагин с базовым набором;
- Dynamic Content for Elementor — для пользователей конструктора Elementor, позволяет создавать динамический контент;
- Advanced Custom Fields (ACF) — в сочетании с шорткодами позволяет выводить кастомные поля.
Эти инструменты существенно облегчают работу и позволяют быстро создавать разнообразный динамический контент без глубоких знаний PHP.
Как отлаживать и оптимизировать динамические шорткоды
Отладка шорткодов — важный этап. Используйте инструменты отладки WordPress, например, error_log и WP_DEBUG для выявления ошибок.
Для повышения производительности избегайте чрезмерных запросов к базе, кешируйте результаты, если это возможно. Можно использовать транзиенты WordPress для кеширования вывода шорткода:
function wptour_get_latest_posts_shortcode($atts) {
$atts = shortcode_atts( array(
'category' => '',
'count' => 5,
), $atts, 'wptour_latest_posts' );
$cache_key = 'wptour_latest_posts_' . md5(serialize($atts));
$output = get_transient($cache_key);
if ($output === false) {
// Генерация вывода как в предыдущем примере
// ...
set_transient($cache_key, $output, HOUR_IN_SECONDS);
}
return $output;
}Такой подход уменьшит нагрузку на сервер и ускорит загрузку страниц.
Заключение
Динамические шорткоды — это эффективный способ расширить возможности WordPress и сделать сайт более интерактивным и удобным для пользователей. С помощью приведённых примеров, рекомендаций по безопасности и оптимизации вы сможете создавать собственные шорткоды, адаптированные под задачи вашего проекта.