มีจำนวนโพสต์ต่างกันในหน้าแรก


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

ทำไมคุณต้องทำอย่างนี้ ไม่ว่าจะด้วยเหตุผลใดก็ตาม
Pieter Goosen

แค่เห็นแก่ตัวลูกค้าของฉัน ฉันไม่สนใจว่าฉันจะใช้ wp_pagenavi จริงหรือไม่ เทคนิคอื่น ๆ ที่ฉันสามารถใช้ได้?
norixxx

2
ก่อนปิด'caller_ get_ posts'มีช่องว่างและไม่ถูกต้อง ประการที่สองมันเลิกใช้แล้ว ใช้ignore_sticky_postsแทน
ไกเซอร์

หน้าแรกของคุณเป็นหน้าแรกปกติหรือตั้งเป็นหน้าแรก
Pieter Goosen

คำตอบ:


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เพื่อปรับเปลี่ยนเคียวรีหลักเพื่อเพิ่ม taxonomy ที่กำหนดเองของคุณไปยังเคียวรีหลักเพื่อแสดงบนโฮมเพจ

ขั้นตอนที่ 3

ตอนนี้รับposts_per_pageชุดตัวเลือกจาก back end (ซึ่งฉันถือว่าเป็น 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 );

4

ฉันรู้ว่านี่เป็นเมื่อ 1,000 ปีที่แล้ว แต่อีกวิธีหนึ่งสำหรับคนอื่นที่กำลังมองหาโซลูชันนี้ในขณะที่ใช้แบบสอบถามแบบกำหนดเองนี่คือวิธีทำ ในตัวอย่างนี้หน้าแรกต้องการ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.