Bagaimana cara menampilkan satu posting di halaman depan tetapi memiliki halaman normal?

9

Saya ingin memiliki satu posting di halaman depan saya (selalu yang terbaru), tetapi biarkan paging biasa berfungsi. Jadi halaman depan memiliki posting 1, halaman berikutnya harus memiliki posting 2-11 (1-10 juga baik-baik saja), kemudian 12-21 atau 11-20, dan seterusnya. Saya tahu saya dapat mengubah jumlah posting tergantung pada konteksnya , tetapi mengatur ini ke "1" di beranda berarti halaman selanjutnya juga hanya menampilkan satu posting.

Masalah utama saya adalah itu /page/2/dan seterusnya berfungsi, tetapi /page/1/selalu dialihkan ke beranda nyata /,. Ini berarti posting 2-10 selalu dilewati, karena halaman 2 menunjukkan 11-20. Saya saat ini menyelesaikan ini dengan menautkan ke arsip saya, tetapi ini tidak ideal ketika Anda datang ke posting pertama tahun ini dan ada lebih sedikit posting dan tidak ada cara yang jelas untuk melanjutkan.

Jan Fabry
sumber

Jawaban:

7

Aku dipecahkan menggunakan satu offsetparameter permintaan . Ini memungkinkan saya untuk mengedit kueri di pre_get_postshook, dan tampaknya menjadi cara terbersih untuk melakukan ini, tanpa kueri baru. Sekarang halaman beranda hanya menampilkan satu posting, dan page/2/menunjukkan posting 2-11. Semua tautan tetap berfungsi, tidak perlu modifikasi lain.

add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
    if (is_front_page() && is_paged()) {
            $posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
            // If you want to use 'offset', set it to something that passes empty()
            // 0 will not work, but adding 0.1 does (it gets normalized via absint())
            // I use + 1, so it ignores the first post that is already on the front page
            $query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
    }
}
Jan Fabry
sumber
Jika ini berhasil, maka OP harus menggunakan ini.
john010117
Yang saya lakukan, karena saya menulis pertanyaan dan jawaban ini. Tapi terima kasih atas saran Anda, mereka membawa saya ke jalur yang benar.
Jan Fabry
Apakah ada kemungkinan untuk membuatnya bekerja di archive.php atau category.php, hanya menampilkan 2 posting terbaru di halaman 1 sambil mempertahankan pagination yang benar? Terima kasih!
Amit
@Mit: Jika Anda mengganti is_front_page()dengan is_archive()atau is_category(), saya pikir Anda bisa mendapatkan di mana Anda harus berada.
Jan Fabry
3

Oke, mungkin ini cara yang aneh atau rumit untuk melakukan ini, tapi saya punya masalah yang sama (saya ingin menampilkan teks sambutan dan tiga posting terbaru dari kategori tertentu di halaman depan. Jadi saya lakukan:

  1. Membuat halaman baru bernama home dan meletakkan teks sambutan saya di atasnya.
  2. Nonaktifkan halaman beranda default dan tetapkan halaman beranda khusus saya sebagai halaman awal
  3. Membuat templat halaman baru (disalin dan dimodifikasi yang ada)
    1. biarkan ia menampilkan badan halaman
    2. muat tiga posting terbaru kategori X dan tampilkan
    3. memiliki tautan "lebih" di bawahnya yang menautkan pada / kategori / kategori-x /

terlihat seperti ini: http://hinek.de (halaman dalam bahasa Jerman, maaf)

Jika ini bisa menjadi jalan bagi Anda dan Anda memerlukan lebih banyak info atau contoh kode untuk templat halaman, komentar dan saya akan mengedit posting ini.

Hinek
sumber
Ini berfungsi karena Anda hanya menampilkan posting di kategori "Pesan ... apa pun", dan dengan demikian dapat pergi ke halaman kategori itu dan menggunakan halaman normal. Saya ingin menampilkan posting dari semua kategori, jadi pendekatan ini tidak akan berhasil untuk saya. Anda tidak punya tempat di mana orang dapat menelusuri semua posting dari semua kategori?
Jan Fabry
1

Saya berasumsi Anda menjalankan Wordpress 3.0.x?

Untuk hanya menampilkan satu posting (dalam kategori apa pun) di halaman depan itu mudah. Gunakan query_posts('post_per_page=1')dalam home.phpfile Anda alih-alih memohon get_template_part('loop').

Untuk mengikuti metode paging normal setelah itu agak sulit. Dalam loop.phpfile Anda , saya sarankan meletakkan <?php global $paged; ?>sebelum <?php if (have_posts()) : ?>pernyataan, dan menggunakan $pagedvariabel dan query_posts()fungsi untuk memodifikasi kueri Anda sehingga itu menunjukkan posting yang tepat.

loop.phpFile Anda akan terlihat seperti ini (catatan: tidak diuji):

<?php
global $paged;

if (!is_front_page() && $paged && $post->post_type == 'post') :
    query_posts('posts_per_page=10&paged=' . ($paged - 1));
    if (have_posts()) :
        while (have_posts()) : the_post();
        // Rest of the loop
        endwhile;
    endif;
endif;
?>

Saya menggunakan $paged - 1hanya karena halaman 2 akan menampilkan posting 1 - 10, dan halaman 3 akan menampilkan posting 11 - 20, dan seterusnya.

john010117
sumber
Mengubah pagedparameter tidak akan merusak yang lain, seperti next_posts_link? Mungkin lebih baik untuk memodifikasi kueri di pre_get_postshook, jadi saya tidak membuat kueri baru? Dan ya, ini WP 3.
Jan Fabry
AFAIK, itu seharusnya tidak mempengaruhi next_posts_link. Satu-satunya cara untuk mengetahuinya adalah dengan mencobanya, tentu saja.
john010117
1
Argh, jika saya mencoba mengedit pagedparameter di pre_get_postshook, redirect_canonicalmenendang dan ingin mengganti url dengan pagedparameter baru . Saya dapat menonaktifkan pengalihan dalam kasus ini, tetapi next_posts_linkmenggunakan $pagedvariabel global yang akan ditetapkan ke nilai baru, tetapi saya tidak tahu kode mana, jadi itu tidak benar.
Jan Fabry
Apakah Anda benar-benar mencoba menggunakan kode saya dan melihat apakah itu berfungsi? Saya tidak terlalu terbiasa dengan pre_get_postskail, jadi saya tidak bisa banyak membantu di sana. Selain itu, cobalah untuk memodifikasi $pagedvariabel secara langsung (mis .:) $paged = $paged - 1)jika Anda khawatir next_posts_link().
john010117
0

Pertanyaan ini agak lama, tetapi bagi mereka yang menemukan ini di era modern, Anda seharusnya tidak pernah memanggil query_posts . Dari kodeks Wordpress:

query_posts () adalah cara yang terlalu sederhana dan bermasalah untuk mengubah kueri utama halaman dengan menggantinya dengan instance baru dari kueri. Itu tidak efisien (menjalankan kembali query SQL) dan akan langsung gagal dalam beberapa keadaan (terutama sering ketika berhadapan dengan posting pagination).

...

TL; DR tidak pernah menggunakan query_posts ();

Sebagai gantinya, Anda harus menggunakan pre_get_postshook di functions.php sebagai berikut:

function hwl_home_pagesize( $query ) {
    // Behave normally for secondary queries
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the home page
        $query->set( 'posts_per_page', 1 );
        return;
    }

    // Otherwise, use whatever is set in the Wordpress Admin screen
    $query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Namun, berhati-hatilah dalam beberapa kasus, (seperti menyesuaikan offset pos), menggunakan pre_get_postskail dapat memotong-motong pagination Anda. Memperbaiki ini tidak terlalu sulit, tapi itu sesuatu yang harus diperhatikan. Ada contoh cara memperbaikinya di sini .

lfalin
sumber