問題描述

在其他頁面的第一頁上,我需要每頁不同的帖子數量。

例如,這就是我需要的

  • 帖子總數: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]

需要一點幫助來解決這個問題。

最佳解決方案

編輯 – 解答

我正在處理另一個解決方案,這實際上是原來的答案。這不涉及任何自定義查詢,我認為為了所有目的,我的原始答案可以刪除,但為信息目的

我仍然相信你在主頁上,也會這樣對待。所以這是我的新解決方案

步驟 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,因為在第 1 頁和第 2 頁需要 3 個帖子

$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 );

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。