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.

passatgt
sumber
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().

Johannes Pille
sumber
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/>
Chip Bennett
sumber