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


21

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

читальных настройка-блог-страниц-шоу-на-самых-за страницу

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

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


Возможно, вы подумали о плагине @ chip-bennett «Разные посты на странице»: chipbennett.net/plugins/cbnet-different-posts-per-page, который делает то, что вы хотите в графическом виде.
Том Ожер

Ответы:


23

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

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');

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

0

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

простой оператор if вместе с query_posts


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

1
Это довольно плохая идея сделать это таким образом. WordPress уже запускает запрос. Если вы добавите query_postsсвою тему, вы проигнорируете исходный запрос и создадите другой, лишний.
Krzysiek Dróżdż

-1

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

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>

-1

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

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

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

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

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

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

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


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

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

На самом деле я неправильно прочитал ваш второй до последнего абзаца и подумал, что «большие» и «меньшие» списки постов были на одной странице, поэтому мое последнее предложение выше не имеет значения. И да, вполне законно, если хотите, поместить весь ваш код в index.php. И если это так, то ваш метод - это быстрый и простой способ сделать это, поэтому я уберу свое понижение после 20-часовой блокировки. Тем не менее, отправка нового запроса, а не изменение исходного запроса, как в ответе kevtrout, менее желательна по причинам, уже упомянутым (вами, мной и WP Codex).
Дуг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.