Отображение записей только из определенной категории на пользовательской странице?
Я пытаюсь сделать так, чтобы моя страница новостей отображала контент только из одной категории (номер 3), но у меня не получается. Вместо отображения записей только из категории 3, она показывает записи из всех категорий.
Вот мой код:
<?php get_header(); ?>
<div class="content news_page">
<h1>Последние новости</h1>
<?php $args = array(
'post_type' => 'post' ,
'orderby' => 'date' ,
'order' => 'DESC' ,
'posts_per_page' => 6,
'category' => '3',
'paged' => get_query_var('paged'),
'post_parent' => $parent
); ?>
<?php query_posts($args); ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="large-4 medium-4 small-12 columns">
<div class="latest_news_cont">
<a href="<?php the_permalink() ?>"><?php the_post_thumbnail(); ?></a>
<a href="<?php the_permalink() ?>"><h5><?php the_title(); ?></h5></a>
<?php the_excerpt(); ?>
<p style="text-align:center;"><a href="<?php the_permalink() ?>" class="readmore_news">Читать далее</a></p>
<br>
<div class="clear"></div>
</div>
</div>
<?php endwhile; ?>
<?php endif; ?>
<div class="clear"></div>
</div><!-- конец content -->
<div class="clear"></div>
<?php get_footer(); ?>

Получить первые пять записей из определенной категории
<?php
// запрос
$the_query = new WP_Query(array(
'category_name' => 'название_категории',
'post_status' => 'publish',
'posts_per_page' => 5,
));
?>
<?php if ($the_query->have_posts()) : ?>
<?php while ($the_query->have_posts()) : $the_query->the_post(); ?>
<?php the_category(); ?>
<?php the_title(); ?>
<?php the_excerpt(); ?>
<?php the_post_thumbnail(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<p><?php __('Новостей нет'); ?></p>
<?php endif; ?>

Аргумент называется не category
, а cat
. Ваш запрос не работает, потому что вы используете несуществующий аргумент.
$args = array(
'post_type' => 'post' ,
'orderby' => 'date' ,
'order' => 'DESC' ,
'posts_per_page' => 6,
'cat' => '3',
'paged' => get_query_var('paged'),
'post_parent' => $parent
);
$q = new WP_Query($args);
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// ваш цикл
}
}
Обратите внимание, что я заменил ваш query_posts()
на новый объект WP_Query
. Никогда не используйте query_posts()
. Об этом прямо говорится в Codex.
Примечание: Эта функция не предназначена для использования в плагинах или темах. Как объяснено далее, существуют более эффективные способы изменения основного запроса. query_posts() — это слишком упрощенный и проблемный способ изменить основной запрос страницы, заменяя его новым экземпляром запроса. Это неэффективно (повторно выполняет SQL-запросы) и в некоторых случаях полностью не работает (особенно часто при работе с пагинацией постов). Любой современный код WordPress должен использовать более надежные методы, такие как использование хука pre_get_posts.
Также обратите внимание, что я удалил ненужные открывающие и закрывающие теги PHP и отформатировал код для лучшей читаемости. Этот альтернативный синтаксис управляющих структур, по моему опыту, ведет к ошибкам.

Лично я бы сделал так.
Вместо:
'category' => '3',
Замените на это:
'category_name' => 'my-category-slug'
Естественно, найдите название slug вашей категории и замените 'my-category-slug'.
Как упомянул @s-ha-dum, лучше не использовать этот метод, а вместо него использовать метод WP_Query. Вы можете ознакомиться с ним в WordPress Codex здесь: http://codex.wordpress.org/Class_Reference/WP_Query#Parameters

Добавьте этот код в файл функций:
function wpsites_display_one_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '3' );
}
}
add_action( 'pre_get_posts', 'wpsites_display_one_category' );
Измените условный тег is_home() на условный тег, соответствующий вашей странице новостей или циклу страницы записей, если это необходимо. То, что вы установили в Настройки > Чтение.
