Показывать разное количество записей на странице в зависимости от контекста (главная, поиск, архив)

11 авг. 2010 г., 19:52:23
Просмотры: 12.5K
Голосов: 22

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

Настройки чтения WordPress - количество записей на странице блога

Я понимаю, что это можно сделать, редактируя файлы темы и изменяя параметры запроса, но предпочел бы более простой доступ через страницу настроек. Раньше я встречал плагин, который это делал, но сейчас не могу его найти.

Кто-нибудь знает подходящий плагин для этой задачи или, возможно, функцию для файла functions.php, которая позволит реализовать это?

1
Комментарии

Вы, вероятно, имели в виду плагин @chip-bennett 'Different Posts Per Page': http://www.chipbennett.net/plugins/cbnet-different-posts-per-page/, который делает то, что вам нужно, в графическом виде.

Tom Auger Tom Auger
28 окт. 2011 г. 18:09:39
Все ответы на вопрос 4
1
25

Я считаю, что лучший способ реализовать это в плагине — запустить следующую примерную функцию при срабатывании хука pre_get_posts. Объект $wp_query доступен, что означает, что условные теги также доступны, но до того, как WordPress получит записи. Это позволяет изменять параметры запроса перед его первым выполнением, вместо добавления второго запроса, как в случае использования query_posts() в файле темы.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8); // Устанавливаем 8 записей на главной странице
    }
    if (is_search()) {
        $query->set('posts_per_page', -1); // Показываем все результаты поиска
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25); // Устанавливаем 25 записей в архивах
    } //endif
} //function

// Добавляем функцию выше к действию 'pre_get_posts'     
add_action('pre_get_posts', 'custom_posts_per_page');
11 авг. 2010 г. 21:08:21
Комментарии

Я использую эту функцию на своем собственном сайте. Было легко вырезать и вставить её здесь для вас.

kevtrout kevtrout
12 авг. 2010 г. 19:11:04
2

вы можете создать пользовательский цикл с помощью query_posts и указать количество записей в зависимости от is_home, is_archive и т.д.

простое условие if вместе с query_posts

11 авг. 2010 г. 20:07:58
Комментарии

Да, я упомянул об этом в своем вопросе. Я ищу способ сделать это, чтобы мне не приходилось редактировать несколько файлов темы для изменения настроек. Спасибо.

Doug Doug
12 авг. 2010 г. 18:21:07

Это довольно плохая идея делать таким образом. WordPress уже выполняет запрос. Если вы поместите query_posts в свою тему, вы проигнорируете оригинальный запрос и создадите еще один, избыточный.

Krzysiek Dróżdż Krzysiek Dróżdż
11 дек. 2013 г. 20:45:07
0
-1

Дополнение к этому вопросу. Кто-нибудь знает, как определить post_per_page для этой функции function custom_posts_per_page($query), если добавить новую страницу в index.php следующим образом:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
20 янв. 2011 г. 08:56:50
3
-1

Я понимаю, что могу сделать это, редактируя файлы темы и изменяя параметры запроса там, но я бы предпочел иметь более простой доступ к странице настроек.

Для полноты картины я обнаружил, что комбинация query_posts с конкатенацией $query_string работает хорошо.

Я разместил этот код в index.php (в моей теме нет category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Конечно, здесь мы изменяем внутреннюю строку запроса цикла, переопределяя стандартное количество записей на страницу.

Это отлично работает для отображения меньшего списка записей на главной странице, где я показываю полные записи, и гораздо большего списка записей везде остальных местах (категории, по дате и т.д.), где я отображаю только краткие описания.

Однако, обратите внимание, что в отличие от принятого ответа, этот код запускает запрос дважды, поэтому это не самое оптимальное решение.

6 июл. 2011 г. 23:25:12
Комментарии

Джефф, я искал централизованное место для управления количеством постов, возвращаемых в разных контекстах. Твой ответ работает только если использовать index.php для обработки ВСЕХ контекстов, что делают не все темы. Помимо увеличения количества запросов к базе данных (что влияет на производительность), твой метод может также неожиданно изменить поведение условных тегов (например, is_home() или is_front_page). Наконец, если ты хочешь добавить дополнительные циклы на страницу, тебе НЕ следует использовать query_posts, а лучше использовать "new WP_Query" (или get_posts).

Doug Doug
7 июл. 2011 г. 19:26:45

@doug это не дополнительный цикл, а переопределение основного — и да, эта конкретная тема использует index.php для рендеринга всего, она довольно минималистичная. Я посчитал, что мой ответ здесь более уместен, но если хочешь, я могу задать отдельный вопрос и ответить на него, если этот ответ тебя чем-то задел.

Jeff Atwood Jeff Atwood
7 июл. 2011 г. 21:51:10

Вообще-то я неверно прочитал твой предпоследний абзац и подумал, что списки постов "больше" и "меньше" находятся на одной странице, так что моё последнее предложение было неуместным. И да, совершенно нормально размещать весь код в index.php, если ты этого хочешь. И если это так, то твой метод — быстрый и простой способ сделать это, так что я уберу свой минус после истечения 20-часовой блокировки. Тем не менее, отправка нового запроса вместо изменения исходного, как в ответе kevtrout, менее желательна по причинам, уже упомянутым (и тобой, и мной, и в WP Codex).

Doug Doug
8 июл. 2011 г. 16:24:40