Có số lượng bài viết khác nhau trên trang đầu tiên


11

Tôi cần phải có số lượng bài viết khác nhau trên mỗi trang trên trang đầu tiên trên các trang khác.

Ví dụ, đây là những gì tôi cần

  • Tổng số bài viết: 6
  • Trang đầu tiên: hiển thị 3 bài viết
  • Trang sau: hiển thị 2 bài viết trên mỗi trang

Đây là mã của tôi:

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

Tại trang đầu tiên trong kho lưu trữ, mã này giả định:

Vâng, tổng cộng 6 bài viết và 3 bài viết trên mỗi trang. Vì vậy, tôi cần 2 trang lưu trữ và phân trang tôi trình bày cho bạn là:

[1] [2]

Tuy nhiên, bất kỳ trang nào khác trong kho lưu trữ mã đều giả sử:

Vâng, tổng cộng 6 bài viết và 2 bài viết trên mỗi trang. Vì vậy, tôi cần 3 trang lưu trữ và phân trang tôi trình bày cho bạn là:

[1] [2] [3]

Cần một chút giúp đỡ để khắc phục điều này.


Giá như tôi có thể nói với WP_pagenavi có bao nhiêu bài đăng ở trang 1 và phần còn lại ...
norixxx

Tại sao chính xác bạn cần phải làm theo cách này. Bất kỳ lý do cụ thể nào
Pieter Goosen

Chỉ là sự ích kỷ của khách hàng của tôi. Tôi thực sự không quan tâm nếu tôi sử dụng wp_pagenavi hay không. Bất kỳ kỹ thuật nào khác tôi có thể sử dụng?
norixxx

2
Trước hết 'caller_ get_ posts'chứa khoảng trắng và không hợp lệ. Thứ hai, nó không được dùng nữa. Sử dụng ignore_sticky_poststhay thế.
kaiser

Trang chủ của bạn, có phải là trang chủ bình thường hoặc được đặt làm trang đầu
Pieter Goosen

Câu trả lời:


21

EDIT - TRẢ LỜI

Tôi đang nghiên cứu một giải pháp khác thực sự tốt hơn câu trả lời ban đầu. Điều này không liên quan đến bất kỳ truy vấn tùy chỉnh nào và tôi nghĩ rằng cho tất cả các mục đích, câu trả lời ban đầu của tôi có thể bị hủy nhưng được giữ cho mục đích thông tin

Tôi vẫn tin rằng bạn đang ở trang chủ và cũng sẽ coi điều này là như vậy. Vì vậy, đây là giải pháp mới của tôi

BƯỚC 1

Xóa truy vấn tùy chỉnh khỏi trang chủ và thay thế nó bằng vòng lặp mặc định

<?php

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

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

            endwhile;

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

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

BƯỚC 2

Sử dụng pre_get_postsđể thay đổi truy vấn chính để thêm phân loại tùy chỉnh của bạn vào truy vấn chính để hiển thị trên trang chủ.

BƯỚC 3

Bây giờ, hãy lấy posts_per_pagetùy chọn được đặt từ mặt sau (mà tôi giả sử là 2) và cũng đặt tùy chọn offsetmà chúng ta sẽ sử dụng. Đó sẽ là 1vì bạn sẽ cần 3 bài viết trên trang một và 2 trên phần còn lại

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

BƯỚC 4

Trên trang một, bạn sẽ cần thêm offsetvào posts_per_pagesẽ thêm tối đa 3 để nhận ba bài đăng của bạn trên trang một.

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

BƯỚC 5

Bạn phải áp dụng của bạn offsetcho tất cả các trang tiếp theo, nếu không bạn sẽ nhận được sự lặp lại của bài đăng cuối cùng của trang trên trang tiếp theo

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

BƯỚC 6

Cuối cùng, bạn cần trừ đi phần bù của mình found_postsnếu không số trang của bạn trên trang cuối sẽ bị sai và gây ra 404lỗi vì bài đăng cuối cùng sẽ bị thiếu do số bài đăng không chính xác

LƯU Ý: Đoạn mã này đã phá vỡ phân trang trên trang tìm kiếm. Điều này hiện đã được sửa, xem mã cập nhật

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

TẤT CẢ CÙNG NHAU

Đây là cách truy vấn hoàn chỉnh của bạn sẽ trông như thế nào sẽ đi vào hàm.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

Tôi biết điều này có từ 1000 năm trước, nhưng một giải pháp khác cho bất kỳ ai khác đang tìm kiếm giải pháp này trong khi sử dụng truy vấn tùy chỉnh, đây là cách thực hiện. Trong ví dụ này, trang 1 cần 10 bài và mỗi trang tiếp theo cần 9.

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

và sau đó trong mảng sử dụng điều này:

'posts_per_page' => $limit,

Bây giờ bạn tốt để đi.


2
Điều này sẽ không làm việc. Với điều này, bạn sẽ có bài # 10 được hiển thị hai lần. Vì khi đi trên trang thứ hai, nó sẽ "nghĩ" rằng trang đầu tiên cũng có 9 bài đăng được hiển thị và do đó sẽ bắt đầu hiển thị bài số 10 mặc dù nó đã được hiển thị trên trang đầu tiên.
leymannx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.