Menggunakan WP_Query khusus dengan loop get_template_part


9

Saya memiliki permintaan untuk jenis posting khusus:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
?>

Dan saya ingin mengulang posting ini menggunakan loop-books.php:

<?php get_template_part( 'loop', 'books' ); ?>

Di dalam loop-books.php saya punya ini, sama seperti loop.php biasa, saya baru saja mengubah have_posts dan the_post berfungsi untuk bekerja dengan permintaan $ books:

<?php if ( $books->have_posts() ) : ?>      
    <?php while ($books->have_posts()) : $books->the_post(); ?>
        <?php the_title(); ?><br/>
    <?php endwhile; ?>
<?php endif; ?>

Tapi setelah ini, saya mendapatkan kesalahan php:

Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1

Jadi sepertinya variabel $ books tidak tersedia di dalam fungsi get_template_part. Bagaimana saya bisa mengatasi masalah ini? Jika saya meletakkan $ books query di dalam loop-books.php berfungsi dengan baik, tetapi saya ingin memisahkannya.


coba hapus $books->dari loop-books.php & saya harap ini akan berhasil.
— Rohit Pande

Jika saya menghapus bagian $ books-> itu akan menggunakan permintaan default jadi itu tidak baik untuk saya.
— passatgt

jika Anda menggunakan sesuatu seperti: <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $books = new WP_Query(array( 'post_type' => 'wiki', 'posts_per_page' => '50', 'paged' => $paged )); ?>dan di sini Anda memuat get_template_partkueri. Dan setelah ini jika Anda reset postdatamaka saya pikir solusi saya akan berfungsi dengan baik.
— Rohit Pande

Jawaban:


5

Anda harus mengglobal $books(jika ingin tetap get_template_part()) atau menggunakannya

require( locate_template( 'loop-books.php' ) );

bukannya get_template_part( 'loop', 'books' );. Masalah ini disebabkan oleh $booksdi loop-books.phpdidefinisikan hanya dalam lingkup dari get_template_part().


2
Ini. Meskipun, jika $bookskueri khusus untuk file loop-books.phptemplat-bagian, saya akan merekomendasikan menempatkan $books = new WP_Query()panggilan di dalam file templat-bagian.
— Chip Bennett

Terima kasih. Apa pendapat Anda, solusi mana yang lebih baik?
— passatgt

@Chip sama, sama - Saya juga meletakkannya di file yang sama dan menghindari masalah di tempat pertama. Menjawab hal ini dengan mengingat bahwa OP ingin memisahkan keduanya.
— Johannes Pille

1
@passatgt Sejauh mana yang lebih baik, lihat komentar di atas, saya lebih suka pergi dengan satu file dan selesai dengan itu. Jika Anda harus memisahkan mereka, saya akan locate_template()memilih, untuk tidak mengacaukan namespace global.
— Johannes Pille

Ok terima kasih. Alasan saya ingin memisahkan mereka adalah karena saya ingin menggunakan loop yang sama dengan pertanyaan lain juga berdasarkan pada kategori lain / taksonomi
— passatgt

8

Metode alternatif: buka / tutup loop, dan kemudian gunakan loop-books.phpuntuk hanya berisi markup untuk konten loop. misalnya:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Get books query
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
// Open books loop
if ( $books->have_posts() ) :     
    while ($books->have_posts()) : $books->the_post();
        // Get loop markup
        get_template_part( 'loop', 'books' );
// Close books loop
    endwhile;
endif;
?>

Kemudian, di dalam loop-books.php:

<?php the_title(); ?><br/>
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.