Memiliki jumlah posting yang berbeda di halaman pertama

11

Saya perlu memiliki jumlah posting yang berbeda per halaman pada halaman pertama dan halaman lainnya.

Sebagai contoh, inilah yang saya butuhkan

  • Total posting: 6
  • Halaman pertama: menampilkan 3 posting
  • Halaman berikut: menampilkan 2 posting per halaman

Ini kode saya:

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

Pada halaman pertama dalam arsip, kode ini mengasumsikan:

Nah, total 6 posting dan 3 posting per halaman. Jadi saya perlu 2 halaman arsip dan pagination yang saya berikan kepada Anda adalah:

[1] [2]

Namun, setiap halaman lain dalam arsip kode mengasumsikan:

Nah, total 6 posting dan 2 posting per halaman. Jadi saya perlu 3 halaman arsip dan pagination yang saya berikan kepada Anda adalah:

[1] [2] [3]

Perlu sedikit bantuan untuk memperbaikinya.

norixxx
sumber
Kalau saja saya bisa memberi tahu WP_pagenavi berapa banyak posting di halaman 1 dan sisanya ...
norixxx
Mengapa Anda perlu melakukannya dengan cara ini. Alasan khusus apa pun
Pieter Goosen
Hanya keegoisan klien saya. Saya sebenarnya tidak peduli jika saya menggunakan wp_pagenavi atau tidak. Adakah teknik lain yang bisa saya gunakan?
norixxx
2
Pertama 'caller_ get_ posts'berisi spasi dan tidak valid. Kedua, sudah usang. Gunakan ignore_sticky_postssebagai gantinya.
kaiser
Halaman beranda Anda, apakah itu beranda normal atau ditetapkan sebagai laman depan
Pieter Goosen

Jawaban:

21

EDIT - JAWABAN DIREVISI

Saya sedang mengerjakan solusi lain yang sebenarnya lebih baik dari jawaban aslinya. Ini tidak melibatkan permintaan khusus dan saya pikir untuk semua tujuan, jawaban asli saya dapat dijatuhkan tetapi disimpan untuk tujuan informasi

Saya masih yakin Anda ada di beranda dan juga akan memperlakukan ini seperti itu. Jadi ini solusi baru saya

LANGKAH 1

Hapus kueri khusus dari beranda dan ganti dengan loop default

<?php

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

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

            endwhile;

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

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

LANGKAH 2

Gunakan pre_get_postsuntuk mengubah kueri utama untuk menambahkan taksonomi khusus Anda ke kueri utama untuk ditampilkan pada halaman beranda.

LANGKAH 3

Sekarang, dapatkan posts_per_pageopsi yang diatur dari ujung belakang (yang saya asumsikan 2) dan juga mengatur yang Anda offsetakan gunakan. Itu akan menjadi 1karena Anda akan membutuhkan 3 posting di halaman satu dan 2 di sisanya

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

LANGKAH 4

Di halaman satu, Anda harus menambahkan offsetuntuk posts_per_pagemenambahkan hingga 3 untuk mendapatkan tiga posting Anda di halaman satu.

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

LANGKAH 5

Anda harus menerapkannya offsetke semua halaman berikutnya, jika tidak, Anda akan mendapatkan pengulangan posting terakhir halaman di halaman berikutnya

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

LANGKAH 6

Terakhir, Anda perlu mengurangi ofset Anda dari yang found_postslain pagination Anda pada halaman terakhir akan salah dan memberi Anda 404kesalahan karena posting terakhir akan hilang karena jumlah posting yang salah

CATATAN: Bagian kode ini rusak pagination pada halaman pencarian. Ini sekarang sudah diperbaiki, lihat kode yang diperbarui

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

BERSAMA

Ini adalah bagaimana kueri lengkap Anda akan terlihat seperti itu harus masuk ke 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 );
Pieter Goosen
sumber
3

Saya tahu ini dari 1000 tahun yang lalu, tetapi solusi lain untuk orang lain yang mencari solusi ini saat menggunakan kueri khusus, berikut adalah cara melakukannya. Dalam contoh ini halaman 1 membutuhkan 10 posting dan setiap halaman berikutnya membutuhkan 9.

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

dan kemudian dalam array gunakan ini:

'posts_per_page' => $limit,

Sekarang kamu baik untuk pergi.

Kiel Fleming
sumber
2
Ini tidak akan berhasil. Dengan ini, Anda akan memiliki posting # 10 ditampilkan dua kali. Sejak ketika pergi ke halaman kedua akan "berpikir" bahwa halaman pertama juga memiliki 9 posting yang ditampilkan dan karena itu akan mulai menampilkan posting # 10 meskipun sudah ditampilkan pada halaman pertama.
leymannx