Как ограничить get_posts()?
Я исследую этот вопрос последние 3 дня. Я пытаюсь ограничить максимальное количество записей, получаемых функцией get_posts()
.
У меня есть такой фрагмент кода:
// все фильтры должны быть применены здесь
$args = array(
'nopaging' => true,
'post_type' => get_option('ip_slug'),
'posts_per_page' => $ip_ipp,
'limit' => 100,
'orderby' => $ip_order,
'order' => $ip_order_asc_desc,
'author' => $author,
'suppress_filters' => false,
'meta_key' => $ip_meta,
'meta_query' => array(
array(
'key' => $ip_key,
)
),
'cache_results' => false,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'no_found_rows' => true,
);
$posts = get_posts($args);
//
Параметр limit
не работает.
ОБНОВЛЕНИЕ #1: Я хочу использовать, скажем, 5
записей на страницу и использовать несколько запросов на одной странице с помощью get_posts()
(не query_posts
, не WP_Query
) и хочу ограничить запрос к базе данных до 100
записей. Я не могу использовать параметр paged
из-за множества динамически создаваемых циклов.

Вы можете использовать posts_per_page
или numberposts
.
http://codex.wordpress.org/Template_Tags/get_posts#Parameters
РЕДАКТИРОВАНИЕ: Относительно вашего изменения. Вы не можете иметь posts_per_page
отличный от LIMIT
в SQL-запросе. get_posts()
создает экземпляр WP_Query
и возвращает его, используя posts_per_page
в качестве LIMIT.

posts_per_page
не ограничивает фактический запрос get_posts()
. Также numberposts
не работает.

Тогда почему в вашем комментарии вы говорите, что использовали posts_per_page
? Если вы делаете пагинацию, вы устанавливаете параметр paged
для номера страницы, а posts_per_page
будет ограничивать количество записей. В WP_Query нет параметра limit
.

Мое решение не является истинно WordPress-овским. Я отображаю 100 записей и использую технику пагинации на jQuery. Так что вопрос пока остается без ответа. Мне нужно решение с параметром posts_per_page
в сочетании с параметром limit
. Мне нужно, чтобы get_posts()
получал только 100 записей, чтобы я мог их разбить на страницы, скажем, по 5 или 10 на страницу. Нет способа ограничить запрос get_posts()
без использования параметра posts_per_page
.

Также я не могу использовать параметр paged
, так как использую несколько запросов на одной странице.

Вы можете использовать offset
вместе с posts_per_page
, чтобы обойти невозможность использования paged
. Или, поскольку у вас несколько запросов на странице, вероятно, лучше создать новый объект WP_Query для дополнительных запросов.

Запросы создаются динамически, поэтому нет основного или дополнительного. Я не хочу использовать offset
, я хочу использовать get_posts()
с posts_per_page
установленным в 99999
и ограничить запрос к базе данных до 100
.

Невозможно установить posts_per_page
= 99999 и при этом ограничить запрос к базе данных до 100, потому что posts_per_page
как раз и задает лимит в запросе. Я не вижу причины для такого поведения, возможно, обновите свой вопрос с дополнительными деталями о том, чего вы хотите достичь.

Я обновил свой вопрос. Мне нужен параметр limit
, который можно передать в SQL-запрос с LIMIT
.

posts_per_page
— это именно то, что устанавливает LIMIT
в SQL. Так что ваше требование не имеет смысла — posts_per_page
и SQL LIMIT
это одно и то же. Их нельзя разделить.

Спасибо, @Otto. Я обычно использую параметр posts_per_page
для определения количества записей на странице. У меня есть 10 страниц, по 5 записей на каждой, что в сумме составляет 50 записей. В этом случае я не могу установить posts_per_page
в значение 50, верно? Мне нужно установить его на 5.

Параметр "limit" не работает, потому что такого параметра нет в get_posts или любом другом запросе в WordPress.
Вы можете использовать posts_per_page
для установки количества получаемых записей и offset
для пропуска определенного количества записей. Это единственные параметры, которые можно использовать, и вместе они изменяют LIMIT в выполняемом SQL-запросе.

Можете привести пример запроса get_posts()
для 100
записей и 5
записей на страницу?

Вы путаете две разные вещи. Число "100" здесь вообще не имеет значения. У вас есть 100 записей. Вы хотите показать пять из них. Вы устанавливаете posts_per_page в 5. На этом всё. Сколько всего записей или страниц у вас есть, не имеет никакого значения.

Что если у меня 10000 записей? Как ограничить запрос? Разве нет параметра, хука или фильтра для изменения запроса?

Существует множество способов изменить запрос, но суть в том, что вы не извлекаете 10000 записей, а получаете их только по 5 за раз. Таким образом, единственное значение, которое вас интересует, — это "5". Сколько всего записей — не имеет значения, ведь вы не получаете все записи одним запросом.

У вас включен следующий параметр, который отключает пагинацию, из-за чего любое ограничение теряет смысл:
'nopaging' => true
Переключите его в "disabled" или удалите. Кстати, функция get_posts() в последних версиях WordPress по умолчанию ограничивает количество записей до 5. Или вы можете использовать атрибут posts_per_page для явного задания ограничения, либо сделать это через админ-панель (Настройки → Чтение).

Я решил эту проблему, используя параметр posts_per_page
со значением 100
и применил jPages для jQuery-пагинации.
Объяснение: Поскольку мне нужно было вывести ограниченное количество записей — в моём случае 210
— я хотел использовать одновременно пагинацию и ограничение выборки. Поскольку это невозможно сделать с помощью get_posts()
, я использовал параметр posts_per_page
со значением 210
и реализовал пагинацию через jPages. Не самое элегантное решение, но оно работает.
