Часто в WordPress возникает задача вывести на одной странице разные типы данных — например, посты стандартного типа, записи кастомных типов, таксономии и даже мета-поля пользователя или поста — при этом объединить всё в одном шорткоде. Такой подход позволяет гибко формировать контент без лишних запросов и с возможностью кастомизации вывода.
Почему нужен один шорткод для разных типов данных
Чаще всего разработчики создают отдельные шорткоды под каждый тип данных: один выводит новости, другой — отзывы, третий — категории и т.д. Но это не всегда удобно, особенно если на странице нужен смешанный вывод с фильтрами и пагинацией. Универсальный шорткод экономит время и упрощает поддержку.
Основные преимущества:
- Управление выводом из одного места
- Объединение данных с разной структурой
- Удобство использования с атрибутами для гибкой настройки
Например, можно вывести в одном блоке последние 5 новостей, 3 отзыва и список категорий.
Создание универсального шорткода: структура и логика
Рассмотрим пример, где наш шорткод [wpfinder_data] будет принимать параметры для вывода постов, таксономий и мета-полей.
Основные шаги:
- Обработка атрибутов шорткода для выбора типа данных и параметров запроса
- Выполнение WP_Query или get_terms в зависимости от типа данных
- Формирование 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 — мощный инструмент для гибкой организации контента. Используя описанный подход и примеры кода, вы сможете быстро внедрить подобный функционал на сайте, адаптируя под любые задачи.