Как создать шорткод для вывода случайного поста в WordPress

Вывод случайного поста на страницах 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');

Таким образом, вы снизите нагрузку на базу данных и повысите скорость загрузки страниц.

Как добавить дополнительное поле в форму регистрации WordPress
22.12.2025
Использование хука pre_get_posts для фильтрации постов в WordPress
18.01.2026
Как избежать конфликтов между WooCommerce и плагинами: как отслеживать и решать
06.05.2026
Оптимизация базы данных WordPress: практические советы от WPID
04.11.2025
Как отключить кэширование страницы корзины в WooCommerce для корректной работы
28.04.2026