Шорткоды — это мощный инструмент WordPress, который позволяет легко добавлять динамический контент прямо в записи и страницы без необходимости писать сложный код каждый раз. В этой статье мы рассмотрим, как создать собственный шорткод в WordPress, который решает конкретные задачи, а также приведём практические примеры с разбором кода и рекомендациями по безопасности.
Что такое шорткоды в WordPress и зачем их создавать
Шорткод — это специальный тег в квадратных скобках, который WordPress преобразует в определённый контент при выводе страницы. Это может быть как простой текст, так и сложный HTML, вызов функций или даже интеграция с внешними API.
Создавать собственные шорткоды полезно, когда нужно повторно использовать один и тот же функционал в разных местах сайта, но без дублирования кода. Это упрощает управление сайтом и ускоряет разработку.
Например, можно создавать шорткоды для вывода контактной информации, отображения последних записей блога, вставки кастомных форм и т.д.
Как зарегистрировать собственный шорткод в WordPress
Для создания собственного шорткода нужно использовать функцию add_shortcode(). Она принимает два аргумента: имя шорткода и callback-функцию, которая возвращает HTML для вывода.
Рассмотрим простой пример — шорткод, который выводит приветствие с именем пользователя, переданным в параметре.
function wpsource_hello_shortcode($atts) {
$atts = shortcode_atts(array(
'name' => 'Гость'
), $atts, 'hello');
return '<p>Привет, ' . esc_html($atts['name']) . '! Добро пожаловать на сайт.</p>';
}
add_shortcode('hello', 'wpsource_hello_shortcode');Теперь в любом месте записи можно вставить [hello name="Алексей"] и отобразится текст «Привет, Алексей! Добро пожаловать на сайт.»
Обработка атрибутов и безопасность шорткодов
Очень важно правильно обрабатывать входящие данные в шорткодах, чтобы избежать XSS-уязвимостей. Для этого используйте функции esc_html(), esc_attr() или wp_kses_post() в зависимости от контекста вывода.
В нашем примере имя пользователя мы обрабатываем функцией esc_html(), чтобы убрать потенциально опасный HTML.
Также стоит ограничить доступ к определённым шорткодам, если они должны работать только для авторизованных пользователей. Например, можно проверить статус пользователя через is_user_logged_in().
Пример продвинутого шорткода: вывод последних записей с кастомными параметрами
Создадим шорткод, который выводит список последних записей блога с возможностью указать количество и категорию.
function wpsource_recent_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 5,
'category' => ''
), $atts, 'recent_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>';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>';
}
wp_reset_postdata();
$output .= '</ul>';
return $output;
}
add_shortcode('recent_posts', 'wpsource_recent_posts_shortcode');Пример использования в записи: [recent_posts count="3" category="wordpress"] — выведет 3 последних записи из категории WordPress.
Использование плагинов для расширенного управления шорткодами
Если не хочется писать шорткоды вручную, можно использовать плагины для управления ими. Например:
- Shortcodes Ultimate — мощный плагин с множеством готовых шорткодов и удобным визуальным редактором.
- WP Shortcode by MyThemeShop — простой набор полезных шорткодов для оформления контента.
- Custom Content Shortcode — позволяет создавать свои шорткоды без программирования с помощью визуального интерфейса.
Однако собственные шорткоды дают больше гибкости и позволяют реализовывать уникальный функционал под задачи проекта.
Отладка и тестирование собственных шорткодов
Для отладки шорткодов рекомендуется выводить ошибки и предупреждения в лог (например, с помощью error_log()) и тестировать работу с разными параметрами.
Не забывайте проверять совместимость с другими плагинами и темой, чтобы избежать конфликтов.
Если шорткод работает с запросами к базе или внешними сервисами, обязательно реализуйте кеширование результата, чтобы не создавать лишнюю нагрузку.
Пример кеширования результата в шорткоде через Transient API
function wpsource_cached_recent_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 5
), $atts, 'cached_recent_posts');
$cache_key = 'wpsource_recent_posts_' . intval($atts['count']);
$output = get_transient($cache_key);
if ($output === false) {
$query = new WP_Query(array('posts_per_page' => intval($atts['count']), 'post_status' => 'publish'));
if (!$query->have_posts()) {
return '<p>Записей не найдено.</p>';
}
$output = '<ul>';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>';
}
wp_reset_postdata();
$output .= '</ul>';
set_transient($cache_key, $output, HOUR_IN_SECONDS);
}
return $output;
}
add_shortcode('cached_recent_posts', 'wpsource_cached_recent_posts_shortcode');Такой подход значительно снижает количество запросов к базе данных при частом использовании шорткода.