it-swarm-id.com

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

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 bisa 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 /page/2/ dan seterusnya berfungsi, tetapi /page/1/ selalu mengalihkan ke halaman rumah yang sebenarnya, /. 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.

8
Jan Fabry

Saya memecahkannya menggunakan parameter permintaan offset . Ini memungkinkan saya untuk mengedit kueri di kait pre_get_posts, dan tampaknya menjadi cara terbersih untuk melakukan ini, tanpa permintaan 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;
    }
}
6
Jan Fabry

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 atur 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 tertaut 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.

3
Hinek

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 file home.php Anda alih-alih memanggil get_template_part('loop').

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

File loop.php 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 - 1 hanya karena halaman 2 akan menampilkan posting 1 - 10, dan halaman 3 akan menampilkan posting 11 - 20, dan seterusnya.

1
john010117

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

query_posts () adalah cara yang terlalu sederhana dan bermasalah untuk memodifikasi kueri utama dari suatu halaman dengan menggantinya dengan instance kueri yang baru. 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 kait pre_get_posts 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 posting), menggunakan kait pre_get_posts dapat memotong-motong pagination Anda. Memperbaiki ini tidak terlalu sulit, tapi itu sesuatu yang harus diperhatikan. Ada contoh cara memperbaiki ini di sini .

0
lfalin