Как ограничить 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 не работает.
Ciprian
Тогда почему в вашем комментарии вы говорите, что использовали posts_per_page? Если вы делаете пагинацию, вы устанавливаете параметр paged для номера страницы, а posts_per_page будет ограничивать количество записей. В WP_Query нет параметра limit.
Jonathan
Мое решение не является истинно WordPress-овским. Я отображаю 100 записей и использую технику пагинации на jQuery. Так что вопрос пока остается без ответа. Мне нужно решение с параметром posts_per_page в сочетании с параметром limit. Мне нужно, чтобы get_posts() получал только 100 записей, чтобы я мог их разбить на страницы, скажем, по 5 или 10 на страницу. Нет способа ограничить запрос get_posts() без использования параметра posts_per_page.
Ciprian
Также я не могу использовать параметр paged, так как использую несколько запросов на одной странице.
Ciprian
Вы можете использовать offset вместе с posts_per_page, чтобы обойти невозможность использования paged. Или, поскольку у вас несколько запросов на странице, вероятно, лучше создать новый объект WP_Query для дополнительных запросов.
Jonathan
Запросы создаются динамически, поэтому нет основного или дополнительного. Я не хочу использовать offset, я хочу использовать get_posts() с posts_per_page установленным в 99999 и ограничить запрос к базе данных до 100.
Ciprian
Невозможно установить posts_per_page = 99999 и при этом ограничить запрос к базе данных до 100, потому что posts_per_page как раз и задает лимит в запросе. Я не вижу причины для такого поведения, возможно, обновите свой вопрос с дополнительными деталями о том, чего вы хотите достичь.
Jonathan
Я обновил свой вопрос. Мне нужен параметр limit, который можно передать в SQL-запрос с LIMIT.
Ciprian
posts_per_page — это именно то, что устанавливает LIMIT в SQL. Так что ваше требование не имеет смысла — posts_per_page и SQL LIMIT это одно и то же. Их нельзя разделить.
Otto
Спасибо, @Otto. Я обычно использую параметр posts_per_page для определения количества записей на странице. У меня есть 10 страниц, по 5 записей на каждой, что в сумме составляет 50 записей. В этом случае я не могу установить posts_per_page в значение 50, верно? Мне нужно установить его на 5.
Ciprian
Параметр "limit" не работает, потому что такого параметра нет в get_posts или любом другом запросе в WordPress.
Вы можете использовать posts_per_page для установки количества получаемых записей и offset для пропуска определенного количества записей. Это единственные параметры, которые можно использовать, и вместе они изменяют LIMIT в выполняемом SQL-запросе.
Можете привести пример запроса get_posts() для 100 записей и 5 записей на страницу?
Ciprian
Вы путаете две разные вещи. Число "100" здесь вообще не имеет значения. У вас есть 100 записей. Вы хотите показать пять из них. Вы устанавливаете posts_per_page в 5. На этом всё. Сколько всего записей или страниц у вас есть, не имеет никакого значения.
Otto
Что если у меня 10000 записей? Как ограничить запрос? Разве нет параметра, хука или фильтра для изменения запроса?
Ciprian
Существует множество способов изменить запрос, но суть в том, что вы не извлекаете 10000 записей, а получаете их только по 5 за раз. Таким образом, единственное значение, которое вас интересует, — это "5". Сколько всего записей — не имеет значения, ведь вы не получаете все записи одним запросом.
Otto
У вас включен следующий параметр, который отключает пагинацию, из-за чего любое ограничение теряет смысл:
'nopaging' => true
Переключите его в "disabled" или удалите. Кстати, функция get_posts() в последних версиях WordPress по умолчанию ограничивает количество записей до 5. Или вы можете использовать атрибут posts_per_page для явного задания ограничения, либо сделать это через админ-панель (Настройки → Чтение).
Я решил эту проблему, используя параметр posts_per_page со значением 100 и применил jPages для jQuery-пагинации.
Объяснение: Поскольку мне нужно было вывести ограниченное количество записей — в моём случае 210 — я хотел использовать одновременно пагинацию и ограничение выборки. Поскольку это невозможно сделать с помощью get_posts(), я использовал параметр posts_per_page со значением 210 и реализовал пагинацию через jPages. Не самое элегантное решение, но оно работает.