Переопределить количество постов для отдельного цикла в WordPress?
Аргумент, который контролирует количество отображаемых записей в запросе, называется posts_per_page
<?php query_posts( array(
'post_type' => 'post',
'posts_per_page' => -1 )
);
?>
Также стоит отметить, что в ветке 3.0 существует ошибка, которая мешает отображению всех записей при использовании значения -1. Ошибка исправлена в версии 3.1, но временным решением может быть использование очень большого числа вместо -1.
Смотрите:

В вашем параметре posts_per_page есть опечатка. Вы написали post_per_page вместо posts_per_page. (Я попытался отредактировать ваш пост, но у меня нет прав на редактирование). Большое спасибо!

Избегайте эту функцию, она очень плохо влияет на производительность, вызывает множество проблем с пагинацией и т.д. Используйте pre_get_posts
для изменения отображаемого контента на странице и WP_Query
, если вам нужно получить записи для других целей. Никогда не используйте query_posts

У меня была такая же проблема... Я решил добавить пользовательскую переменную, а затем перехватывать эту переменную во время pre_get_posts
, чтобы установить параметр запроса post_per_page
:
function custom_query_vars_filter($vars) {
$vars[] = 'post_per_page_override';
return $vars;
}
add_filter( 'query_vars', 'custom_query_vars_filter' );
add_action( 'pre_get_posts', 'rc_modify_query_get_design_projects' );
function rc_modify_query_get_design_projects( $query ) {
if( $query->query_vars['post_per_page_override'] == '3') {
$query->set('posts_per_page', '3');
}
}
Затем я пошел еще дальше и сделал так, чтобы можно было получить точное количество записей, которое нужно отобразить, через пользовательскую переменную запроса:
function custom_query_vars_filter($vars) {
$vars[] = 'post_per_page_override';
return $vars;
}
add_filter( 'query_vars', 'custom_query_vars_filter' );
add_action( 'pre_get_posts', 'rc_modify_query_get_design_projects' );
function rc_modify_query_get_design_projects( $query ) {
if( $query->query_vars['post_per_page_override']) {
$customPPPlimit = $query->query_vars['post_per_page_override'];
$query->set('posts_per_page', $customPPPlimit);
}
}
У меня сработало...

Если вы используете пользовательский цикл, просто укажите параметр posts_per_page
, например:
$query = new \WP_Query( [ 'posts_per_page' => 100 ] );
if ( $query->have_posts() ) {
......и т.д.
Вы можете установить posts_per_page
в значение -1
для неограниченного количества записей, но это очень плохая практика. Вместо этого установите столько записей, сколько, по вашему мнению, ваш сервер сможет обработать без сбоев, чтобы ваш сайт не упал при создании слишком большого количества записей. 200 - хороший верхний предел.
В противном случае используйте фильтр pre_get_posts
для изменения параметров, передаваемых в запросы:
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() ) {
return;
}
$query->set( 'posts_per_page', 100 );
}
Обратите внимание, что это установит лимит в 100 записей для всех запросов, включая RSS-ленты, REST API, XMLRPC и т.д.
Кроме того, некоторые могут рекомендовать использовать query_posts
, но это плохая практика, которая может вызвать множество других проблем.
