Вывод случайного поста на страницах WordPress — популярная задача, которая помогает разнообразить контент, повысить вовлечённость пользователей и увеличить время их пребывания на сайте. В этой статье мы подробно рассмотрим, как создать собственный шорткод для вывода случайного поста с помощью простого и эффективного кода, который легко интегрировать в тему или плагин.
Почему стоит использовать шорткод для случайного поста
Шорткоды в WordPress — это удобный способ вставлять динамический контент в посты, страницы и виджеты без необходимости менять тему или писать сложные запросы в шаблонах. Использование шорткода для случайного поста позволяет:
- Вставлять случайный пост в любое место сайта, где поддерживаются шорткоды.
- Легко настраивать вывод — например, количество отображаемых элементов, категории, типы записей и так далее.
- Избежать добавления тяжеловесных плагинов, которые могут замедлять сайт.
Рассмотрим пример создания такого шорткода на примере собственного префикса функций, соответствующего домену — wpid_.
Создание базового шорткода для вывода одного случайного поста
Для начала создадим функцию, которая будет формировать HTML-код с информацией о случайном посте, а затем зарегистрируем шорткод. Код добавьте в файл functions.php вашей темы или в отдельный плагин.
function wpid_random_post_shortcode() {
$args = array(
'post_type' => 'post',
'posts_per_page' => 1,
'orderby' => 'rand',
'post_status' => 'publish',
);
$random_post = new WP_Query($args);
if ($random_post->have_posts()) {
$random_post->the_post();
$output = '<div class="wpid-random-post">';
$output .= '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
$output .= '<p>' . get_the_excerpt() . '</p>';
$output .= '</div>';
wp_reset_postdata();
return $output;
} else {
return '<p>Посты не найдены.</p>';
}
}
add_shortcode('wpid_random_post', 'wpid_random_post_shortcode');Теперь используя шорткод [wpid_random_post] вы сможете вывести один случайный опубликованный пост с заголовком и отрывком текста.
Добавление параметров к шорткоду: категории, количество постов и тип записи
Чтобы сделать шорткод более универсальным, добавим поддержку параметров, позволяющих выбирать количество выводимых постов, категорию и тип записи. Это расширит возможности использования шорткода.
function wpid_random_post_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 1,
'category' => '',
'post_type' => 'post',
), $atts, 'wpid_random_post');
$args = array(
'post_type' => sanitize_text_field($atts['post_type']),
'posts_per_page' => intval($atts['count']),
'orderby' => 'rand',
'post_status' => 'publish',
);
if (!empty($atts['category'])) {
$args['category_name'] = sanitize_text_field($atts['category']);
}
$random_posts = new WP_Query($args);
if ($random_posts->have_posts()) {
$output = '<div class="wpid-random-post-list">';
while ($random_posts->have_posts()) {
$random_posts->the_post();
$output .= '<div class="wpid-random-post-item">';
$output .= '<h4><a href="' . get_permalink() . '">' . get_the_title() . '</a></h4>';
$output .= '<p>' . get_the_excerpt() . '</p>';
$output .= '</div>';
}
$output .= '</div>';
wp_reset_postdata();
return $output;
} else {
return '<p>Посты не найдены.</p>';
}
}
add_shortcode('wpid_random_post', 'wpid_random_post_shortcode');Пример использования шорткода с параметрами:
[wpid_random_post count="3"]— выведет 3 случайных поста.[wpid_random_post category="novosti"]— выведет 1 случайный пост из категории «novosti».[wpid_random_post post_type="product" count="2"]— выведет 2 случайных записи типа «product».
Настройка вывода: добавление миниатюры и стилей
Очень часто хочется выводить не только заголовок и отрывок, но и изображение записи. Для этого добавим проверку и вывод миниатюры в наш шорткод.
function wpid_random_post_shortcode($atts) {
$atts = shortcode_atts(array(
'count' => 1,
'category' => '',
'post_type' => 'post',
'show_thumbnail' => 'true',
), $atts, 'wpid_random_post');
$args = array(
'post_type' => sanitize_text_field($atts['post_type']),
'posts_per_page' => intval($atts['count']),
'orderby' => 'rand',
'post_status' => 'publish',
);
if (!empty($atts['category'])) {
$args['category_name'] = sanitize_text_field($atts['category']);
}
$random_posts = new WP_Query($args);
if ($random_posts->have_posts()) {
$output = '<div class="wpid-random-post-list">';
while ($random_posts->have_posts()) {
$random_posts->the_post();
$output .= '<div class="wpid-random-post-item">';
if ($atts['show_thumbnail'] === 'true' && has_post_thumbnail()) {
$output .= '<a href="' . get_permalink() . '">' . get_the_post_thumbnail(get_the_ID(), 'thumbnail') . '</a>';
}
$output .= '<h4><a href="' . get_permalink() . '">' . get_the_title() . '</a></h4>';
$output .= '<p>' . get_the_excerpt() . '</p>';
$output .= '</div>';
}
$output .= '</div>';
wp_reset_postdata();
return $output;
} else {
return '<p>Посты не найдены.</p>';
}
}
add_shortcode('wpid_random_post', 'wpid_random_post_shortcode');Вы можете использовать шорткод с параметром show_thumbnail для управления выводом миниатюр:
[wpid_random_post count="3" show_thumbnail="true"]— выведет 3 поста с миниатюрами.[wpid_random_post count="2" show_thumbnail="false"]— выведет 2 поста без миниатюр.
Для улучшения внешнего вида рекомендуем добавить стили в файл style.css вашей темы:
.wpid-random-post-list {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.wpid-random-post-item {
border: 1px solid #ddd;
padding: 15px;
width: 300px;
box-sizing: border-box;
background: #fff;
border-radius: 5px;
transition: box-shadow 0.3s ease;
}
.wpid-random-post-item:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.wpid-random-post-item img {
max-width: 100%;
height: auto;
margin-bottom: 10px;
border-radius: 3px;
}Использование популярных плагинов для вывода случайных постов
Если вы предпочитаете не писать код, существует несколько проверенных плагинов, которые позволяют выводить случайные записи с помощью шорткодов и виджетов:
- Random Posts Widget — простой плагин для вывода случайных постов в сайдбаре или через шорткод.
- Display Posts Shortcode — мощный плагин с множеством параметров для вывода записей, включая случайный порядок (
orderby="rand"). - Advanced Random Posts Widget — расширенный функционал вывода случайных записей с настройками фильтрации по категориям и типам постов.
Пример использования плагина Display Posts Shortcode для вывода 3 случайных постов из категории «news»:
[display-posts category="news" posts_per_page="3" orderby="rand"]Этот вариант хорош, если вы не хотите писать код, но при этом нуждаетесь в гибком контроле.
Оптимизация выборки случайных постов: советы и рекомендации
Выборка случайных постов с использованием orderby => 'rand' в WP_Query — простой способ, но при большом количестве записей может оказать нагрузку на базу данных. Вот как уменьшить влияние на производительность:
- Кэширование результата — применяйте Transients API для хранения результата выборки на определённое время, чтобы не выполнять запрос при каждом вызове шорткода.
- Ограничение количества постов — не выводите слишком много записей за один раз.
- Использование внешних сервисов или плагинов кэширования — например, WP Rocket, который может кэшировать HTML и снизить нагрузку.
Пример кэширования результата выборки с помощью Transients API:
function wpid_random_post_shortcode_with_cache($atts) {
$atts = shortcode_atts(array(
'count' => 1,
'category' => '',
'post_type' => 'post',
), $atts, 'wpid_random_post');
$cache_key = 'wpid_random_post_' . md5(serialize($atts));
$output = get_transient($cache_key);
if ($output !== false) {
return $output;
}
$args = array(
'post_type' => sanitize_text_field($atts['post_type']),
'posts_per_page' => intval($atts['count']),
'orderby' => 'rand',
'post_status' => 'publish',
);
if (!empty($atts['category'])) {
$args['category_name'] = sanitize_text_field($atts['category']);
}
$random_posts = new WP_Query($args);
if ($random_posts->have_posts()) {
$output = '<div class="wpid-random-post-list">';
while ($random_posts->have_posts()) {
$random_posts->the_post();
$output .= '<div class="wpid-random-post-item">';
$output .= '<h4><a href="' . get_permalink() . '">' . get_the_title() . '</a></h4>';
$output .= '<p>' . get_the_excerpt() . '</p>';
$output .= '</div>';
}
$output .= '</div>';
wp_reset_postdata();
} else {
$output = '<p>Посты не найдены.</p>';
}
set_transient($cache_key, $output, 3600); // Кэш на 1 час
return $output;
}
add_shortcode('wpid_random_post', 'wpid_random_post_shortcode_with_cache');Таким образом, вы снизите нагрузку на базу данных и повысите скорость загрузки страниц.