Как ограничить get_posts()?

24 сент. 2014 г., 15:36:50
Просмотры: 39K
Голосов: 2

Я исследую этот вопрос последние 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 из-за множества динамически создаваемых циклов.

0
Все ответы на вопрос 5
11

Вы можете использовать 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.

24 сент. 2014 г. 16:02:07
Комментарии

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

Ciprian Ciprian
24 сент. 2014 г. 16:05:07

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

Jonathan Jonathan
24 сент. 2014 г. 16:09:24

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

Ciprian Ciprian
24 сент. 2014 г. 16:13:12

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

Ciprian Ciprian
24 сент. 2014 г. 16:13:43

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

Jonathan Jonathan
24 сент. 2014 г. 16:17:10

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

Ciprian Ciprian
24 сент. 2014 г. 16:23:09

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

Jonathan Jonathan
24 сент. 2014 г. 16:30:26

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

Ciprian Ciprian
24 сент. 2014 г. 17:04:02

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

Otto Otto
24 сент. 2014 г. 17:25:33

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

Ciprian Ciprian
24 сент. 2014 г. 17:29:43

Да, вам нужно установить значение 5, потому что вы хотите получать 5 записей, а не 50. Название переменной говорит само за себя: posts per page (записей на странице).

Otto Otto
24 сент. 2014 г. 17:30:53
Показать остальные 6 комментариев
5

Параметр "limit" не работает, потому что такого параметра нет в get_posts или любом другом запросе в WordPress.

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

24 сент. 2014 г. 17:28:44
Комментарии

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

Ciprian Ciprian
24 сент. 2014 г. 17:30:57

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

Otto Otto
24 сент. 2014 г. 17:33:18

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

Ciprian Ciprian
24 сент. 2014 г. 17:46:08

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

Otto Otto
24 сент. 2014 г. 21:47:20

Спасибо, Otto, я решил проблему, используя другой подход. Смотрите мой обновленный ответ.

Ciprian Ciprian
25 сент. 2014 г. 11:23:19
1

У вас включен следующий параметр, который отключает пагинацию, из-за чего любое ограничение теряет смысл:

'nopaging' => true

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

24 окт. 2017 г. 13:46:06
Комментарии

Это то, что помогло мне.

newpoison newpoison
24 мар. 2021 г. 21:01:34
0

Я решил эту проблему, используя параметр posts_per_page со значением 100 и применил jPages для jQuery-пагинации.

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

24 сент. 2014 г. 16:03:51
1
-4

Вы можете использовать хук pre_get_post для получения количества записей, которые хотите отобразить:

add_action( 'pre_get_posts', 'your_function_name' );
25 сент. 2014 г. 12:47:11
Комментарии

И как автор вопроса должен использовать этот хук?

kaiser kaiser
25 сент. 2014 г. 13:37:14