Вывод разных типов данных в один шорткод WordPress

Часто в WordPress возникает задача вывести на одной странице разные типы данных — например, посты стандартного типа, записи кастомных типов, таксономии и даже мета-поля пользователя или поста — при этом объединить всё в одном шорткоде. Такой подход позволяет гибко формировать контент без лишних запросов и с возможностью кастомизации вывода.

Почему нужен один шорткод для разных типов данных

Чаще всего разработчики создают отдельные шорткоды под каждый тип данных: один выводит новости, другой — отзывы, третий — категории и т.д. Но это не всегда удобно, особенно если на странице нужен смешанный вывод с фильтрами и пагинацией. Универсальный шорткод экономит время и упрощает поддержку.

Основные преимущества:

  • Управление выводом из одного места
  • Объединение данных с разной структурой
  • Удобство использования с атрибутами для гибкой настройки

Например, можно вывести в одном блоке последние 5 новостей, 3 отзыва и список категорий.

Создание универсального шорткода: структура и логика

Рассмотрим пример, где наш шорткод [wpfinder_data] будет принимать параметры для вывода постов, таксономий и мета-полей.

Основные шаги:

  1. Обработка атрибутов шорткода для выбора типа данных и параметров запроса
  2. Выполнение WP_Query или get_terms в зависимости от типа данных
  3. Формирование HTML вывода с кастомным шаблоном

Пример функции для регистрации шорткода:

function wpfinder_shortcode_data($atts) {
    $atts = shortcode_atts(array(
        'post_type' => 'post',
        'taxonomy' => '',
        'meta_key' => '',
        'meta_value' => '',
        'numberposts' => 5,
        'type' => 'posts', // posts, terms, meta
    ), $atts, 'wpfinder_data');

    ob_start();

    if ($atts['type'] === 'posts') {
        $args = array(
            'post_type' => $atts['post_type'],
            'posts_per_page' => intval($atts['numberposts']),
        );

        if (!empty($atts['meta_key']) && !empty($atts['meta_value'])) {
            $args['meta_query'] = array(
                array(
                    'key' => $atts['meta_key'],
                    'value' => $atts['meta_value'],
                    'compare' => '=',
                ),
            );
        }

        $query = new WP_Query($args);

        if ($query->have_posts()) {
            echo '<ul class="wpfinder-posts-list">';
            while ($query->have_posts()) {
                $query->the_post();
                echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
            }
            echo '</ul>';
            wp_reset_postdata();
        } else {
            echo '<p>Посты не найдены.</p>';
        }
    } elseif ($atts['type'] === 'terms' && !empty($atts['taxonomy'])) {
        $terms = get_terms(array(
            'taxonomy' => $atts['taxonomy'],
            'hide_empty' => false,
            'number' => intval($atts['numberposts']),
        ));

        if (!is_wp_error($terms) && !empty($terms)) {
            echo '<ul class="wpfinder-terms-list">';
            foreach ($terms as $term) {
                $term_link = get_term_link($term);
                echo '<li><a href="' . esc_url($term_link) . '">' . esc_html($term->name) . '</a></li>';
            }
            echo '</ul>';
        } else {
            echo '<p>Таксономии не найдены.</p>';
        }
    } elseif ($atts['type'] === 'meta' && !empty($atts['meta_key'])) {
        // Пример вывода мета-полей последних постов
        $args = array(
            'post_type' => $atts['post_type'],
            'posts_per_page' => intval($atts['numberposts']),
            'meta_key' => $atts['meta_key'],
        );
        $query = new WP_Query($args);

        if ($query->have_posts()) {
            echo '<ul class="wpfinder-meta-list">';
            while ($query->have_posts()) {
                $query->the_post();
                $value = get_post_meta(get_the_ID(), $atts['meta_key'], true);
                echo '<li>' . get_the_title() . ': ' . esc_html($value) . '</li>';
            }
            echo '</ul>';
            wp_reset_postdata();
        } else {
            echo '<p>Данные не найдены.</p>';
        }
    } else {
        echo '<p>Неверные параметры шорткода.</p>';
    }

    return ob_get_clean();
}
add_shortcode('wpfinder_data', 'wpfinder_shortcode_data');

Разбор параметров и их применение

Мы используем атрибут type, который определяет, что именно выводить: посты, термины таксономии или мета-поля. По умолчанию — посты.

Для постов можно указать post_type и количество numberposts. Если нужны фильтры по мета-полям — применяем параметры meta_key и meta_value.

Для терминов обязательно указываем taxonomy, например, category или product_cat.

Примеры использования шорткода на страницах

Вывод 5 последних постов типа «news»

[wpfinder_data post_type="news" numberposts="5" type="posts"]

Вывод 10 терминов таксономии «product_cat»

[wpfinder_data taxonomy="product_cat" numberposts="10" type="terms"]

Вывод постов с мета-полем «rating» равным 5

[wpfinder_data post_type="reviews" meta_key="rating" meta_value="5" numberposts="3" type="posts"]

Использование плагинов для расширения функционала

Для более сложных запросов и вывода данных можно использовать плагины, которые расширяют возможности кастомных шорткодов и запросов:

  • Clearfy Pro — оптимизация и расширение возможностей WordPress, включая работу с мета-данными и таксономиями.
  • WPRemark — создание отзывов с кастомными мета-полями, которые можно удобно вывести через шорткод.

Эти плагины позволят упростить работу с данными и дополнительно оптимизировать код.

Рекомендации по оптимизации и безопасности

При работе с универсальным шорткодом важно помнить о безопасности:

  • Обязательно проверяйте и очищайте входящие параметры — в нашем коде это сделано через shortcode_atts и intval.
  • Используйте esc_html и esc_url при выводе данных, чтобы избежать XSS-уязвимостей.
  • Для кеширования результатов можно использовать Transients API, если данные не меняются часто.

Это позволит сохранить производительность сайта и избежать потенциальных проблем.

Заключение

Универсальный шорткод для вывода разных типов данных в WordPress — мощный инструмент для гибкой организации контента. Используя описанный подход и примеры кода, вы сможете быстро внедрить подобный функционал на сайте, адаптируя под любые задачи.

Как использовать REST API WordPress для автоматического управления контентом
19.03.2026
Как удалить или отключить WooCommerce Gutenberg-блоки в WordPress
30.04.2026
Автоматическое отключение неиспользуемых плагинов WordPress
20.01.2026
Автозаполняемая форма поиска по меткам в WordPress: практическое руководство
09.03.2026
Как создать автоматическую фильтрацию товаров WooCommerce по атрибутам
15.04.2026