Различное количество постов на первой странице

11

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

Например, это то, что мне нужно

  • Всего сообщений: 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]

Нужна небольшая помощь, чтобы исправить это.

norixxx
источник
Если бы я только мог сказать WP_pagenavi, сколько сообщений на 1-й странице, а остальные ...
norixxx
Почему именно вам нужно сделать это таким образом. Любая конкретная причина
Питер Гусен
Просто эгоизм моего клиента. Мне на самом деле все равно, использую ли я wp_pagenavi или нет. Любая другая техника, которую я могу использовать?
norixxx
2
Прежде всего 'caller_ get_ posts'содержит пробелы и не является действительным. Во-вторых, это устарело. Используйте ignore_sticky_postsвместо этого.
Кайзер
Ваша домашняя страница, обычная домашняя страница или первая страница
Pieter Goosen

Ответы:

21

РЕДАКТИРОВАТЬ - ОТВЕТ

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

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

ШАГ 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 );

ВСЕ ВМЕСТЕ

Вот так будет выглядеть ваш полный запрос, который должен идти в functions.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 );
Питер Гусен
источник
3

Я знаю, что это было 1000 лет назад, но другое решение для тех, кто ищет это решение при использовании пользовательского запроса, вот как это сделать. В этом примере первой странице нужно 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