Майте різну кількість публікацій на першій сторінці


12

Мені потрібно мати іншу кількість публікацій на сторінці на першій сторінці, ніж на інших.

Наприклад, це те, що мені потрібно

  • Всього повідомлень: 6
  • Перша сторінка: показ 3 повідомлень
  • Наступна сторінка: показ 2 повідомлень на сторінці

Ось мій код:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

if( $paged == 1 ) {
    $limit = $fp_limit;
} else {
    $offset = $fp_limit + ( ($paged - 2) * $limit );
}

$args = array(
    'post_type' => 'my_post_type',
    'post_status' => 'publish',
    'offset' => $offset,
    'posts_per_page' => $limit,
    'caller_ get_ posts' => -1, // remove sticky post
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    )
);
$my_query = null;
$my_query = new WP_Query($args);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

На першій сторінці в архіві цей код передбачає:

Ну, 6 публікацій і 3 повідомлення на сторінці. Тому мені потрібні 2 архівні сторінки, і я вам представляю:

[1] [2]

Однак будь-яка інша сторінка в архіві код передбачає:

Ну, 6 публікацій і 2 повідомлення на сторінці. Отже, мені потрібні 3 сторінки архіву, і я вам представляю:

[1] [2] [3]

Вам потрібно трохи допомогти, щоб виправити це.


Якби тільки я міг сказати WP_pagenavi, скільки публікацій на 1-й сторінці, а решта ...
norixxx

Чому саме це потрібно робити саме так. Будь-яка конкретна причина
Пітер Гусен

Просто егоїзм мого клієнта. Мені насправді байдуже, використовую чи wp_pagenavi чи ні. Будь-яку іншу техніку я можу використовувати?
norixxx

2
По-перше, це 'caller_ get_ posts'пробіли і недійсне. По-друге, це застаріло. Використовуйте ignore_sticky_postsзамість цього.
кайзер

Ваша домашня сторінка, це звичайна домашня сторінка чи вказана як головна сторінка
Пітер Гусен

Відповіді:


22

РЕДАКТУЙТЕ - ВІДПОВІДЬ ОГЛЯДЕНО

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

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

КРОК 1

Видаліть спеціальний запит із домашньої сторінки та замініть його на циклі за замовчуванням

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

КРОК 2

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

КРОК 3

Тепер posts_per_pageзнайдіть набір опцій із заднього кінця (який я вважаю 2), а також встановіть свій, offsetякий ми збираємось використовувати. Це буде так, 1як вам знадобиться 3 публікації на першій сторінці та 2 на решті

$ppg = get_option('posts_per_page');
$offset = 1;

КРОК 4

На першій сторінці, вам необхідно додати offsetдо posts_per_pageбуде додати до 3 , щоб отримати свої три повідомлення на першій сторінці.

$query->set('posts_per_page', $offset + $ppp);

КРОК 5

Ви повинні застосувати свої сторінки offsetдо всіх наступних сторінок, інакше ви отримаєте повторення останнього повідомлення на наступній сторінці

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

КРОК 6

Нарешті, вам потрібно відняти компенсацію, found_postsінакше ваша сторінка на останній сторінці буде помилковою, і ви отримаєте 404помилку, оскільки остання публікація буде відсутня через неправильний підпис

ПРИМІТКА. Цей фрагмент коду порушив сторінку на сторінці пошуку. Це тепер виправлено, див. Оновлений код

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

ВСІ РАЗОМ

Ось так виглядатиме ваш повний запит, який повинен перейти в function.php

function tax_and_offset_homepage( $query ) {
  if ($query->is_home() && $query->is_main_query() && !is_admin()) {
    $query->set( 'post_type', 'my_post_type' );
    $query->set( 'post_status', 'publish' );
    $query->set( 'ignore_sticky_posts', '-1' );
    $tax_query = array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    );
    $query->set( 'tax_query', $tax_query );
    $ppp = get_option('posts_per_page');
    $offset = 1;
    if (!$query->is_paged()) {
      $query->set('posts_per_page',$offset + $ppp);
    } else {
      $offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
      $query->set('posts_per_page',$ppp);
      $query->set('offset',$offset);
    }
  }
}
add_action('pre_get_posts','tax_and_offset_homepage');

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

4

Я знаю, що це вже 1000 років тому, але ще одне рішення для тих, хто шукає це рішення, використовуючи користувацький запит, ось як це зробити. У цьому прикладі 1-й сторінці потрібно 10 публікацій, а кожній наступній сторінці потрібно 9.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

а потім у масиві використовуйте це:

'posts_per_page' => $limit,

Тепер вам добре піти.


2
Це не спрацює. З цим у вас буде повідомлення №10 відображатися двічі. Оскільки під час переходу на другу сторінку буде "думати", що на першій сторінці також було відображено 9 повідомлень, і тому він почне показувати пост №10, хоча він вже відображався на першій сторінці.
leymannx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.