Шорткоды в WordPress — мощный инструмент для вставки динамического контента в страницы и записи. Но стандартные шорткоды зачастую используют статические параметры, которые приходится прописывать вручную. В этой статье мы разберём, как создать шорткод с динамическими атрибутами, которые позволят гибко изменять вывод в зависимости от контекста, пользователя или других условий.
Что такое динамические атрибуты в шорткодах WordPress
Динамические атрибуты — это параметры, значения которых не фиксированы, а формируются в момент выполнения кода. Это позволяет, например, передавать в шорткод не только статические значения, но и вычислять их программно, либо подставлять значения из запроса, пользовательских полей, метаданных и других источников.
Такой подход открывает дополнительные возможности для кастомизации и расширения функционала без необходимости создавать множество похожих шорткодов.
Рассмотрим пример: стандартный шорткод [wpexperts_user_info user="123"] выводит данные пользователя с ID 123. Что если сделать атрибут user динамическим — чтобы он подставлялся автоматически из текущей сессии или запроса?
Как создать шорткод с динамическими атрибутами: базовый пример
Начнём с простого примера, который демонстрирует, как в обработчике шорткода можно проверить наличие атрибута и подставить значение по умолчанию или вычисленное динамически.
function wpexperts_dynamic_shortcode($atts) {
// Разбор атрибутов с указанием дефолтных значений
$atts = shortcode_atts(array(
'user' => null,
'show_email' => 'no',
), $atts, 'wpexperts_user_info');
// Если user не передан, берём ID текущего пользователя
if (empty($atts['user'])) {
$current_user = wp_get_current_user();
if ($current_user->ID === 0) {
return 'Пользователь не авторизован';
}
$atts['user'] = $current_user->ID;
}
$user_info = get_userdata($atts['user']);
if (!$user_info) {
return 'Пользователь не найден';
}
$output = '<div class="wpexperts-user-info">';
$output .= '<p>Имя: ' . esc_html($user_info->display_name) . '</p>';
if ($atts['show_email'] === 'yes') {
$output .= '<p>Email: ' . esc_html($user_info->user_email) . '</p>';
}
$output .= '</div>';
return $output;
}
add_shortcode('wpexperts_user_info', 'wpexperts_dynamic_shortcode');В этом коде атрибут user можно передать явно, например [wpexperts_user_info user="5"], а можно не передавать — тогда будет использован ID текущего авторизованного пользователя. Так мы сделали динамическую подстановку параметра.
Динамические атрибуты из URL и других источников
Часто бывает нужно, чтобы шорткод брал параметры из URL или других глобальных источников, например, из $_GET или пользовательских полей.
Рассмотрим пример, когда в URL передаётся параметр ?product_id=42, и наш шорткод подставляет его автоматически, если атрибут не указан.
function wpexperts_product_info_shortcode($atts) {
$atts = shortcode_atts(array(
'id' => null,
), $atts, 'wpexperts_product_info');
if (empty($atts['id']) && !empty($_GET['product_id'])) {
$atts['id'] = intval($_GET['product_id']);
}
if (empty($atts['id'])) {
return 'ID продукта не указан';
}
// Предположим, у вас есть кастомный тип записи 'product'
$product = get_post($atts['id']);
if (!$product || $product->post_type !== 'product') {
return 'Продукт не найден';
}
$output = '<div class="wpexperts-product-info">';
$output .= '<h2>' . esc_html($product->post_title) . '</h2>';
$output .= '<p>' . esc_html($product->post_excerpt) . '</p>';
$output .= '</div>';
return $output;
}
add_shortcode('wpexperts_product_info', 'wpexperts_product_info_shortcode');Такой подход удобен, если шорткод используется на разных страницах и должен автоматически подставлять контекстные данные.
Использование динамических атрибутов с плагином Clearfy Pro
Если на сайте установлен плагин Clearfy Pro, он поможет оптимизировать выполнение шорткодов и убрать лишние запросы. Например, Clearfy Pro позволяет кэшировать вывод шорткодов и ускорять загрузку страниц.
Вы можете обернуть шорткод в кэш с помощью функции Clearfy, что особенно полезно при динамических атрибутах, которые меняются нечасто:
function wpexperts_cached_shortcode($atts) {
$cache_key = 'wpexerts_user_info_' . md5(serialize($atts));
$cached = clearfy_get_cache($cache_key);
if ($cached) {
return $cached;
}
$output = wpexperts_dynamic_shortcode($atts);
clearfy_set_cache($cache_key, $output, 3600); // кэш на 1 час
return $output;
}
add_shortcode('wpexperts_user_info_cached', 'wpexerts_cached_shortcode');<Это пример, как расширить функциональность шорткода с динамическими атрибутами, сохраняя производительность.
Советы по безопасности при работе с динамическими атрибутами
При работе с динамическими атрибутами важно обезопасить сайт от XSS и SQL-инъекций. Всегда используйте функции экранирования, такие как esc_html(), esc_attr(), а для числовых значений — intval() или floatval().
Также не доверяйте напрямую данным из $_GET или $_POST — обязательно проверяйте и фильтруйте входящие данные.
Вот пример безопасной обработки:
function wpexperts_safe_shortcode($atts) {
$atts = shortcode_atts(array('id' => 0), $atts);
$id = intval($atts['id']);
if ($id <= 0) {
return 'Неверный ID';
}
// Вывод безопасных данных ...
}Заключение
Использование динамических атрибутов в шорткодах позволяет создавать максимально гибкие и удобные инструменты для вывода контента в WordPress. Вы научились подставлять значения из текущего пользователя, URL или других источников, а также обеспечивать безопасность и производительность.
Для расширения возможностей рекомендуем ознакомиться с плагинами Clearfy Pro и WPGPT, которые помогут автоматизировать и ускорить работу с динамическими данными на сайте.