Как вывести записи WordPress по рубрике через WP_Query
Практический пример WP_Query для вывода опубликованных записей из одной рубрики: куда вставить код, как его проверить и что делать при ошибке.

Чтобы вывести записи только из одной рубрики, создайте отдельный WP_Query и передайте ему параметр category_name. WP_Query — это встроенный класс WordPress, который получает записи из базы по заданным правилам.
Ниже — безопасный пример для шаблона темы: он выводит последние шесть опубликованных записей из рубрики и корректно завершает дополнительный запрос. Этот способ не требует правки ядра WordPress или плагинов.
Когда нужен отдельный WP_Query
На главной странице, в архиве или в шаблоне услуги иногда нужно показать не все материалы, а только статьи конкретной рубрики: например, «WordPress». Основной запрос страницы WordPress уже существует. Новый WP_Query создаёт второй, независимый запрос только для нужного блока.
Не меняйте основной запрос прямо в шаблоне через query_posts(). Эта устаревшая функция может нарушить пагинацию, заголовок архива и другие части страницы. Для отдельного блока используйте WP_Query, а затем вызовите wp_reset_postdata().
Что подготовить перед вставкой
- В админке откройте «Записи → Рубрики» и скопируйте ярлык нужной рубрики. Ярлык — латинская часть адреса рубрики, например
wordpress. - Найдите шаблон, где должен появиться блок. Обычно это файл дочерней темы, например
front-page.php,page.phpили template part в папкеtemplate-parts. - Сделайте резервную копию файла и проверяйте правку сначала на тестовой копии сайта.
Готовый запрос: последние записи из рубрики
Куда вставить: в PHP-шаблон дочерней темы или в файл template part, в то место HTML-разметки, где должен появиться список. Не вставляйте этот код в редактор записи и не добавляйте второй открывающий тег <?php, если он уже есть выше в файле.
<?php
$category_posts = new WP_Query(
array(
'category_name' => 'wordpress',
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 6,
'no_found_rows' => true,
)
);
?>
<?php if ( $category_posts->have_posts() ) : ?>
<section class="category-posts" aria-labelledby="category-posts-title">
<h2 id="category-posts-title">Новые статьи WordPress</h2>
<ul class="category-posts__list">
<?php while ( $category_posts->have_posts() ) : ?>
<?php $category_posts->the_post(); ?>
<li class="category-posts__item">
<a href="<?php echo esc_url( get_permalink() ); ?>">
<?php echo esc_html( get_the_title() ); ?>
</a>
</li>
<?php endwhile; ?>
</ul>
</section>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
Разбор кода
category_name => 'wordpress'выбирает рубрику по её ярлыку. Заменитеwordpressна свой ярлык, а не на русское название из меню.post_type => 'post'оставляет только обычные записи блога. Страницы и товары WooCommerce в такой выборке не появятся.post_status => 'publish'не даёт попасть в блок черновикам и запланированным публикациям.posts_per_page => 6ограничивает список шестью материалами. Поставьте своё число, если в дизайне карточек больше или меньше.no_found_rows => trueотключает расчёт количества страниц. Для короткого блока без пагинации это уменьшает лишнюю работу базы данных.esc_url()иesc_html()безопасно выводят ссылку и заголовок. Не убирайте их, даже если заголовки добавляют только редакторы сайта.wp_reset_postdata()возвращает данные текущей страницы после цикла. Без него ниже на странице могут неожиданно измениться заголовок, дата или ссылка.
Вариант: выбрать рубрику по ID
Если ярлык рубрики меняется или содержит нестандартные символы, можно передать её числовой ID. Его видно в адресной строке браузера после открытия рубрики в админке: параметр выглядит как tag_ID=71.
Куда вставить: замените только массив параметров из предыдущего примера. Сам HTML-цикл и wp_reset_postdata() оставьте без изменений.
$category_posts = new WP_Query(
array(
'cat' => 71,
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 6,
'no_found_rows' => true,
)
);
Разбор: параметр cat принимает ID рубрики. В этом варианте не используйте одновременно cat и category_name: два условия могут сузить выборку сильнее, чем вы ожидаете.
Что должно получиться
На нужной странице появится семантический блок с заголовком и списком ссылок. В нём будут только опубликованные записи выбранной рубрики, максимум шесть штук. При отсутствии записей секция не выведется и на странице не останется пустой заголовок.
Как проверить результат
- Создайте или выберите две опубликованные записи нужной рубрики и одну запись из другой рубрики.
- Откройте страницу с блоком в приватном окне или после очистки кэша. В списке должны быть только две нужные записи.
- Нажмите на каждую ссылку: адрес должен открываться, а заголовок на странице должен совпадать с названием записи.
- Проверьте элементы ниже блока. Если это шаблон записи, её заголовок и дата должны остаться от текущей записи, а не от последней карточки списка.
- Откройте страницу на телефоне. Если карточки выводятся сеткой, убедитесь, что длинный заголовок не создаёт горизонтальную прокрутку.
Если не работает
- Список пустой. Проверьте ярлык рубрики: название «WordPress» и ярлык
wordpress— разные значения. Также убедитесь, что записи опубликованы и назначены именно этой рубрике. - После блока сломался заголовок страницы. Скорее всего, пропущен
wp_reset_postdata(). Добавьте его сразу после условия и цикла, как в примере. - Выводятся не те материалы. Проверьте ID или ярлык и не используйте одновременно параметры
catиcategory_name. Временно выведите меньше записей, чтобы легче увидеть результат. - Появились черновики. Убедитесь, что в параметрах есть
'post_status' => 'publish'; также не заменяйтеWP_Queryна собственный SQL-запрос. - Страница выдаёт критическую ошибку. Проверьте, что PHP-код вставлен в PHP-шаблон, скобки и точки с запятой не потерялись. На тестовой копии можно проверить синтаксис командой
php -l путь/к/файлу.php. Порядок поиска причины разобран в статье о критической ошибке WordPress. - После обновления темы правка исчезла. Перенесите шаблон в дочернюю тему: она сохраняет ваши изменения при обновлении родительской темы. Пошаговый старт есть в руководстве по дочерней теме WordPress.
Когда лучше использовать основной запрос
Если вся страница — это архив одной рубрики с пагинацией, не создавайте второй WP_Query в шаблоне. Настройте основной запрос через хук pre_get_posts в functions.php дочерней темы или кастомном плагине. Для отдельной секции на произвольной странице вариант из этой статьи проще и безопаснее.
Если в блоке нужны картинки, даты или своя сетка, оставьте тот же запрос и добавьте нужную разметку внутри цикла. CSS и JavaScript для компонента подключайте через wp_enqueue_style() и wp_enqueue_script(), а не тегами в шаблоне. Пример правильного подключения есть в статье о wp_enqueue для CSS и JavaScript.
Официальная документация
Полный список параметров и примеры доступны в справочнике класса WP_Query. Перед добавлением пагинации, сортировки или мета-фильтров сверяйте названия параметров с этой документацией: это защитит от устаревших примеров из случайных источников.
Нужен блок записей, который совпадёт с вашей темой? В рамках технической поддержки сайта можно настроить выборку, шаблон карточек и адаптивную вёрстку без правки ядра и плагинов.


