Tampilkan jumlah posting yang berbeda per halaman tergantung pada konteks (mis. Beranda, pencarian, arsip)

21

Di Pengaturan Membaca, ada tempat untuk mengatur jumlah posting yang ditampilkan yang mempengaruhi jumlah posting yang ditampilkan dalam semua konteks. Sebagai gantinya, saya ingin menampilkan sejumlah posting tertentu di beranda, dan sejumlah posting berbeda di halaman seperti arsip, hasil pencarian, dll.

membaca-pengaturan-blog-halaman-show-at-most-per-page

Saya sadar saya bisa melakukan ini dengan mengedit file tema dan mengubah parameter kueri di sana, tetapi saya lebih suka memiliki akses yang lebih mudah ke halaman pengaturan yang sederhana. Dahulu kala, saya menemukan sebuah plugin yang melakukan ini, tetapi saya tidak dapat menemukannya sekarang.

Adakah yang tahu tentang plugin untuk melakukan ini, atau bahkan sebuah fungsi yang saya bisa masukkan ke functions.php untuk mencapai hal yang sama?

Doug
sumber
Anda mungkin berpikir tentang plugin 'Different Posts Per Page' dari @ chip- bennett : chipbennett.net/plugins/cbnet-different-posts-per-page yang melakukan apa yang Anda inginkan dengan cara grafis.
Tom Auger

Jawaban:

23

Saya percaya cara terbaik untuk melakukan ini dalam sebuah plugin adalah dengan menjalankan fungsi sampel berikut ketika pre_get_postskait tindakan ditemukan. The $wp_queryobjek tersedia, yang berarti tag kondisional Anda yang tersedia, tapi sebelum WordPress mendapat tulisan, yang berarti Anda mengubah permintaan vars sebelum permintaan pertama yang dijalankan, daripada menambahkan query kedua seperti ketika query_posts () digunakan dalam tema mengajukan.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');
kevtrout
sumber
Saya menggunakan fungsi ini di situs saya sendiri. Mudah untuk memotong dan menempelkannya di sini untuk Anda.
kevtrout
0

Anda dapat melakukan loop kustom menggunakan query_posts, dan menentukan jumlah posting oleh is_home, is_archive, dll.

hanya pernyataan if sederhana bersama dengan query_posts

chrismccoy
sumber
Ya, saya sebutkan itu dalam pertanyaan saya. Saya mencari cara untuk melakukannya sehingga saya tidak perlu mengedit banyak file tema untuk mengubah pengaturan. Terima kasih.
Doug
1
Itu ide yang buruk untuk melakukannya dengan cara ini. WordPress sudah menjalankan kueri. Jika Anda memasukkan query_poststema Anda, Anda akan mengabaikan permintaan asli dan membuat yang lain, berlebihan.
Krzysiek Dróżdż
-1

Untuk menambah pertanyaan ini. Adakah yang tahu cara menentukan post_per_page untuk fungsi fungsi ini custom_posts_per_page ($ query) jika menambahkan halaman baru ke index.php seperti ini:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
glazasha
sumber
-1

Saya sadar saya bisa melakukan ini dengan mengedit file tema dan mengubah parameter kueri di sana, tetapi saya lebih suka memiliki akses yang lebih mudah ke halaman pengaturan yang sederhana.

Untuk kepentingan kelengkapan, saya menemukan bahwa query_postsdikombinasikan dengan $query_stringpenggabungan bekerja dengan baik.

Saya menempatkan kode ini di index.php(tema saya tidak memiliki category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Tentu saja yang kami lakukan di sini adalah memodifikasi string kueri internal loop, menimpa jumlah posting default per halaman .

Ini berfungsi memperlakukan untuk menyediakan daftar posting yang lebih kecil di beranda tempat saya menunjukkan posting penuh, dan daftar posting yang jauh lebih besar di mana pun (kategori, berdasarkan tanggal, dll) di mana saya hanya menampilkan ringkasan posting.

Namun, harap dicatat bahwa tidak seperti jawaban yang diterima, ini akan menjalankan kueri dua kali , jadi itu bukan solusi yang baik.

Jeff Atwood
sumber
Jeff, saya sedang mencari tempat terpusat untuk mengontrol jumlah pos yang dikembalikan dalam konteks yang berbeda. Jawaban Anda hanya akan melakukannya jika Anda menggunakan index.php untuk menangani SEMUA konteks, yang tidak dilakukan sebagian besar tema. Selain meningkatkan panggilan ke basis data (yang memengaruhi kinerja), teknik Anda juga dapat mengubah respons terhadap tag kondisional (misalnya, is_home () atau is_front_page) dengan cara yang tidak terduga. Terakhir, jika Anda ingin menambahkan loop sekunder ke halaman, Anda TIDAK boleh menggunakan query_posts, tetapi gunakan "WP_Query baru" sebagai gantinya (atau get_posts).
Doug
@doug ini bukan loop sekunder, itu mengesampingkan loop utama - dan ya, tema khusus ini menggunakan index.php untuk membuat semuanya, itu cukup minimalis. Saya merasa ini lebih masuk akal di sini sebagai jawaban, tetapi jika Anda mau, saya dapat mengajukan pertanyaan saya sendiri dan menjawabnya jika jawaban ini menyinggung Anda.
Jeff Atwood
Sebenarnya saya salah membaca paragraf kedua hingga terakhir dan menganggap daftar posting "lebih besar" dan "lebih kecil" ada di halaman yang sama, jadi kalimat terakhir saya di atas tidak relevan. Dan ya, sangat sah untuk memasukkan semua kode Anda di index.php jika Anda mau. Dan jika itu masalahnya, maka metode Anda adalah cara cepat dan mudah untuk melakukan ini, jadi saya akan menghapus downvote saya setelah kunci 20 jam selesai. Meski begitu, mengirim permintaan baru daripada memodifikasi permintaan asli seperti dalam jawaban kevtrout kurang diinginkan karena alasan yang telah disebutkan (oleh Anda, saya dan WP Codex).
Doug