WP_Query Pagination pada single-custom.php


16

Apa yang ingin saya lakukan:

Atur WP_Querypagination dalam file template single-custom-post-type.php

Apa yang telah aku lakukan

1) Membuat jenis posting yang disebut "penulis". Setiap postingan dalam tipe postingan itu adalah seorang penulis individual.

2) Halaman layar edit edit standar berisi dropdown yang mencantumkan semua posting (penulis) dari jenis posting kustom penulis.

3) Membuat template single-author.php yang meminta semua posting dengan metadata penulis dari dropdown, sehingga hasilnya adalah daftar posting yang memiliki penulis yang sama yang ditugaskan kepadanya (seperti arsip):

<?php

// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;

/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
    $paged = get_query_var( 'page' );
} else {
    $paged = 1;
}

$args = array(
    'posts_per_page'    =>  10,
    'meta_key'          => 'author_select',
    'meta_value'        => $author_id,
    'paged'             => $paged,
);

$temp = $wp_query;
$wp_query = NULL;

$wp_query = new WP_Query($args);

?>

<?php if( $wp_query->have_posts() ) : ?>    
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>

    <?php endwhile; ?>

<div class="single_navigation"> 
    <?php if( get_adjacent_post( false, '', true ) ) { ?>
        <span class="prev"><?php previous_post_link( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></span>
    <?php } ?>
    </div><!--/single navigation-->
<?php endif; ?>

<?php
    $wp_query = null;
    $wp_query = $temp;
    wp_reset_query();
?>

Apa yang saya terjebak

Tautan pagination tidak muncul. Saya telah melakukan beberapa penelitian dan menemukan bahwa mereka menggunakan $wp_queryvariabel, namun ketika saya mengubah variabel kueri $wp_query, tautan muncul, tetapi ketika diklik tidak melakukan apa-apa.

Adakah yang salah tahu?

Edit:

Untuk menjawab beberapa pertanyaan Anda, kueri saya berhasil menampilkan posting yang saya query, $ author_id sudah memiliki nilai yang tidak saya sertakan dalam cuplikan kode ini. Demikian pula, saya meninggalkan output konten aktual dalam loop sementara karena bagian itu bukan masalah. Masalahnya adalah saya harus membuat paginasi konten yang sudah ada di posting tunggal ini.

Tujuan dari fungsi ini adalah untuk memungkinkan posting memiliki penulis khusus (di luar sistem Pengguna yang dibangun di dalam) dan tujuan template ini adalah untuk menampilkan semua posting untuk penulis yang diberikan (yang sudah berfungsi).


3
Suara positif untuk pertanyaan yang diformat dengan baik, meskipun Anda tidak menjelaskan mengapa Anda melakukan ini, apakah ini terkait dengan kotak penulis saat ini?
Tom J Nowell

1
Saya sangat setuju dengan @TomJNowell. +1
Pieter Goosen

2
Tidak terkait, tetapi tidak perlu digaungkanthe_title()
Pieter Goosen

2
Apakah 'meta_value' => $author_iddiisi dari dropdown yang disebutkan? Dan ketika memilih masing-masing penulis melalui dropdown, apakah sepuluh posting pertama ditampilkan dengan benar?
Stephen S.

1
Sudahkah Anda memastikan yang $author_query->have_posts()kembali truedan yang $author_querybenar - benar berisi posting?
kaiser

Jawaban:


17

Anda memiliki 2 masalah.

Masalah pertama

Garis

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

akan gagal, karena pada tampilan posting tunggal, ketika URL berisi '/page/XX/', set variabel WordPress adalah 'page'dan tidak 'paged'.

Anda mungkin berpikir untuk menggunakan 'page'bukan 'paged', tapi itu tidak akan berhasil, karena sekali 'page'variabel dimaksudkan untuk digunakan untuk multi-halaman tunggal pos (pemisahan halaman menggunakan <!--nextpage-->) dan sekali posting tidak multi-halaman, WordPress akan mengarahkan permintaan ke URL tanpa '/page/XX/'.

Inilah yang terjadi ketika Anda memberi nama variabel kueri Anda $wp_query.

Solusinya adalah mencegah pengalihan tersebut dengan menghapus fungsi yang bertanggung jawab untuknya, yang 'redirect_canonical'terhubung ke 'template_redirect':

Jadi, di functions.phpadd Anda :

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $wp_query->set( 'page', 1 );
            $wp_query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

Sekarang WordPress tidak akan mengarahkan ulang dan akan mengatur dengan benar 'paged'kueri var.

Masalah kedua

next_posts_link()dan previous_posts_link()keduanya memeriksa if ( ! is_single() )untuk menampilkan pagination.

Sekarang, is_single()benar dalam kasus Anda, karena Anda berada dalam satu posting tipe 'penulis', sehingga fungsi-fungsi itu tidak dapat berfungsi seperti yang Anda harapkan.

Anda memiliki 3 kemungkinan:

  1. Gunakan query_postsuntuk mengganti permintaan utama (benar - benar tidak disarankan)
  2. Gunakan templat halaman khusus alih-alih jenis posting khusus, karena is_single()palsu untuk halaman, dan kode Anda akan berfungsi di sana.
  3. Tulis fungsi pagination Anda sendiri dan gunakan itu

Itulah kode untuk nomor solusi # 3:

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) {
        $query = $GLOBALS['wp_query'];
    }
    $max_page = ( int ) $query->max_num_pages;
    // only one page for the query, do nothing
    if ( $max_page <= 1 ) {
        return;
    }
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) {
        $paged = 1;
    }
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // if 1st page requiring previous or last page requiring next, do nothing
    if ( $target_page < 1 || $target_page > $max_page ) {
        return;
    }
    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}

dan gunakan seperti ini di single-authors.php:

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );

Jawabannya sangat terperinci, terima kasih! Ini berfungsi untuk sisi bahasa Inggris dari situs, tetapi di sisi Prancis tautan pagination tidak melakukan apa-apa, mereka hanya menyegarkan halaman. Saya menggunakan WPML.
Shane

1
@Shane jadi sepertinya WPML menjalankan beberapa filter yang mencegah kode untuk bekerja. Tetapi ini adalah plugin yang sangat besar, dan saya tidak dapat menggali ribuan baris kode untuk memahami di mana letak konfliknya. Coba tanyakan dukungan WPML.
gmazzap

@Shane Forum Dukungan WPML - dan jika di atas berfungsi untuk (yang saya asumsikan), maka silakan tandai sebagai solusi. Konflik WPML berada di luar topik / di luar cakupan situs ini.
kaiser

Jawaban yang fantastis, terutama karena itu membantu saya memperbaiki masalah pagination saya. Saya telah melakukan tugas yang sama dan telah membuat WP_Query kedua untuk mengulang. Saya menelepon the_posts_paginationtetapi harus mengambil salinan wp_query asli sebagaimana diuraikan dalam pertanyaan ini: wordpress.stackexchange.com/questions/216821/…
Alexander Holsgrove

1
Anda benar @HongPong, diperbaiki, terima kasih.
gmazzap

0

Berdasarkan pertanyaan WPSE serupa lainnya " Pagination tidak bekerja dengan nilai bidang khusus wp_query ", saya sarankan menambahkan global $paged;ke awal file template Anda:

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

1
Terima kasih atas tanggapannya! Sayangnya itu tidak membuat perbedaan. Tautan pagination tidak muncul
Shane

1
Stephen, mengapa itu membantu? Ya, ini akan membawanya dari konteks global, tetapi sejauh ini Anda tidak melakukan apa-apa dengannya. Jika Anda ingin menimpa global, maka gunakan $GLOBALS['paged'] = get_query_var( 'paged' );. Lain hanya menggunakan konten global.
kaiser

@Shane Hmm, apakah halaman template digunakan sebagai halaman depan statis?
Stephen S.

Tidak, ini hanya digunakan sebagai templat posting tunggal untuk jenis posting khusus. Saya memang mencoba mengubah kueri saya dari $author_querymenjadi $wp_querydan itu tampaknya membuat pagination muncul, tetapi ketika saya mengklik halaman itu menyegarkan dan tidak benar-benar pergi ke halaman berikutnya, meskipun ada beberapa halaman. Saya telah memperbarui jawaban saya untuk mencerminkan perubahan itu.
Shane

1
The penjelasan php.net yang tidak buruk. Saya sarankan hanya bermain-main dengan globaldan $GLOBALS. Sedikit var_dump(), beberapa fungsi dan Anda baik-baik saja. Untuk benar-benar memahaminya dengan sedikit coba / kesalahan Anda akan kira-kira. butuh setengah jam. Ini akan membantu Anda lebih memahami fungsi vs kelas dan pendekatan OOP secara keseluruhan juga. Dan itu jelas akan membawa Anda lebih dekat untuk memahami ruang nama :)
kaiser
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.