posts_per_page без ограничений
Я хочу вернуть ВСЕ записи с query_posts
. Я пытался установить posts_per_page
на очень большое число, но query_posts
глючит и не возвращает никаких записей. Какой правильный способ запросить записи без ограничений?
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => ?
);

-1 - вот ваш ответ! Ищите posts_per_page
здесь.
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => -1
);
Важное предостережение: Это может привести к очень большому запросу, который способен вызвать падение сайта. Делайте это только если вы уверены, что ваша база данных справится с нагрузкой. Не используйте в публичных темах или плагинах.

Важное предупреждение: Это может привести к созданию очень большого запроса, который может положить сайт. Делайте это только если вы уверены, что ваша база данных справится с нагрузкой. Не используйте в публичных темах или плагинах.

@toscho Добавляю ваш комментарий как обновление к ответу.

Или, в качестве альтернативы, вы можете передать WP_Query
(который используется в query_posts
) аргумент nopaging
, который по сути делает то же самое.
$args = array(
'nopaging' => true
// Ваши другие аргументы и т.д.
);
Это будет делать точно то же самое, но если вам придется вернуться к коду позже и вы не сможете вспомнить, что делали, лично я считаю, что вам будет яснее, что вы намеревались делать с этим параметром внутри массива аргументов.
Как я уже упоминал, оба подхода фактически дают одинаковый результат.
Не помешает иметь более одного подхода, и всегда приятно делиться тем, что вы знаете. Достаточно сказать, что это и есть причина моего ответа, несмотря на то, что у вас уже есть достаточный ответ... ;)

Из файла функций вашей дочерней темы:
add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );
function wpsites_no_limit_posts( $query ) {
if( $query->is_main_query() && !is_admin() && is_home() ) {
$query->set( 'posts_per_page', '-1' ); // установить бесконечное количество записей на странице
$query->set( 'order', 'ASC' ); // установить порядок сортировки по возрастанию
$query->set( 'post_type', 'post' ); // установить тип записи как 'post'
$query->set( 'cat', '22,47,67' ); // установить категории с ID 22, 47 и 67
$query->set( 'orderby', 'name' ); // сортировать по имени
$query->set( 'order', 'ASC' ); // повторная установка сортировки по возрастанию
$query->set( 'hide_empty', '1' ); // скрыть пустые категории
$query->set( 'depth', '1' ); // установить глубину вложенности 1
}
}

Используя решение Рикардо с некоторыми модификациями:
static $paged;
$post_ids = [];
do {
$paged++;
$defaults = [
'fields' => 'ids', // Возвращаем только поле ID, чтобы ускорить запрос.
'post_type' => 'post',
'posts_per_page' => 100,
'no_found_rows' => false, // Нам нужна пагинация и общее количество найденных записей.
'paged' => $paged,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
];
$query = new WP_Query($defaults);
if ($query->have_posts()) {
foreach ($query->posts as $id) {
$post_ids[] = $id;
}
}
} while ($query->max_num_pages > $paged);
return $post_ids;
Это значительно уменьшит время выполнения запроса, так как будет запрашиваться только поле ID и не будет обновляться кэш терминов и метаданных.

Правильный ответ на ваш вопрос - это 'posts_per_page' => -1
, потому что -1
вернет неограниченное количество записей на странице, как указали другие пользователи.
Я хочу добавить дополнение к этому вопросу и ответу,
Если вы хотите получить количество записей на странице из настроек чтения в панели администрирования WordPress, вам нужно вызвать функцию get_option()
и передать ей строку posts_per_page
.
$args = array(
'post_type' => 'post',
'cat' => '22,47,67',
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'depth' => 1,
'posts_per_page' => get_option('posts_per_page')
);
Надеюсь, этот ответ поможет кому-нибудь, как он помог мне. Счастливого кодинга, пользователи Stackexchange

Или...
function getAll($arg, $posts_per_page = 50)
{
$data = array();
$page = 1;
do{
$arg['paged'] = $page;
$arg['posts_per_page'] = $posts_per_page;
$query = new WP_Query($arg);
foreach ($query->posts as $post){
$data[] = $post;
}
$page++;
}while(count($query->posts) === $posts_per_page);
return $data;
}
