Показати різну кількість публікацій на сторінці залежно від контексту (наприклад, домашня сторінка, пошук, архів)


21

У Налаштуваннях читання є місце для встановлення кількості показаних публікацій, що впливає на кількість повідомлень, показаних у всіх контекстах. Я хотів би показати натомість певну кількість публікацій на домашній сторінці та іншу кількість публікацій на таких сторінках, як архів, результати пошуку тощо.

читання-налаштування-блог-сторінки-показ-найбільше на сторінку

Я розумію, що міг би це зробити, відредагувавши файли тем і змінивши параметри запитів там, але я вважаю за краще простіший доступ до сторінки простих налаштувань. Давно я натрапив на плагін, який це робив, але зараз не можу його знайти.

Хтось знає плагін, щоб це зробити, або навіть функцію, яку я міг би поставити в function.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 разом із запитом_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(у моїй темі немає категорії.php) ...

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

Звичайно, що ми тут робимо, - це змінити внутрішній рядок запиту циклу, замінивши за замовчуванням кількість публікацій на сторінці .

Це працює як про надання меншого списку публікацій на домашній сторінці, де я показую повний допис, і набагато більшого списку публікацій скрізь у інших місцях (категорії, за датою тощо), де я показую лише підсумки публікацій.

Однак зауважте, що на відміну від прийнятої відповіді, цей запит буде виконуватися двічі , тому це не настільки приємне рішення.


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

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

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