Проблема с настройкой количества постов на странице в WordPress
ОК, вот моя проблема. У меня есть статическая главная страница и отдельная страница постов на моем сайте WordPress. Я определил их в панели администратора. Также я установил максимальное количество отображаемых постов равным 5 (в Настройки → Чтение), но все посты (10+) все равно отображаются на странице блога.
Я также вывожу последние 3 поста на статической главной странице с помощью пользовательского запроса:
$wp_query = new WP_Query( array( 'posts_per_page' => 3 ));
<код цикла вывода результатов>
Но этот список также отображает больше 3 постов. Похоже, WordPress игнорирует ограничение posts_per_page, которое я устанавливаю как через админ-панель, так и через код. Что за чертовщина творится? Это мой первый опыт разработки сайта на WordPress. Это распространенная проблема для новичков?
РЕДАКТИРОВАНИЕ:
Я упростил код главной страницы до базового блока, который просто получает заголовки постов. Все равно возвращается больше 3 постов. Вот актуальный (и единственный) код на главной странице:
<div id="content">
<?php $wp_query = new WP_Query( array( 'posts_per_page' => 3 ) );?>
<?php if ( $wp_query->have_posts() ) : ?>
<ul>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<li>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
</li>
<?php endwhile;?>
</ul>
<?php endif; ?>
</div>

Хочу добавить свой случай в этот список, потому что у меня ушло уйма времени на отладку. Проблема была в том, что я изменил количество постов на странице архива, используя хук pre_get_posts:
add_filter('pre_get_posts', 'number_of_posts_on_archive');
function number_of_posts_on_archive($query)
{
if(is_post_type_archive(array('post_type1', 'post_type2')))
{
$query->set('posts_per_page', 20);
}
return $query;
}
А чтобы исправить проблему, когда запрос включал посты совершенно другого типа записи, я добавил в условие if следующее:
if( (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
....
}
Публикую это здесь, потому что данная страница была первой в результатах поиска Google по моему запросу. Возможно, это поможет кому-то, кто не может понять часами... или двумя, почему запрос просто не хочет вас слушаться.

Это может быть вызвано темой или плагином, переопределяющим настройки WordPress. Вы можете попробовать включить тему TwentyEleven или TwentyTen, а также отключить все плагины, чтобы проверить, будет ли это работать в таком случае.
Если это поможет, вы можете сообщить, какую тему используете (если это предустановленная тема) или какие плагины пришлось отключить для исправления работы - и мы посмотрим, что можно сделать для решения проблемы.

Спасибо. Отключил этот дурацкий шаблон, и всё заработало! Я скачал его с devpress.com (новостная тема). Её рекламируют как «продвинутую» родительскую тему, и пользователям запрещают что-либо «трогать». Думаю, под «продвинутой» они подразумевали плохо написанный код, ведь я всего лишь добавил код для получения записей после их модного слайд-шоу.

// Добавьте этот код непосредственно перед вызовом вашего кода и настройте его по своему усмотрению
function hwl_home_pagesize( $query ) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( is_home() ) {
// Отображать только 1 пост для основной архивной страницы блога
$query->set( 'posts_per_page', 1 );
return;
}
if ( is_post_type_archive( 'movie' ) ) {
// Отображать 50 записей для пользовательского типа записей 'movie'
$query->set( 'posts_per_page', 50 );
return;
}
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

N.Schipper правильно указал. Но в условии не хватает ещё одного условия
! is_admin()
Таким образом, количество записей на странице будет изменяться только в нужных циклах и не затронет админку.
if( (! is_admin()) && (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
{
$query->set( 'posts_per_page', 6 );
return;
}
}
