การใช้ WP_Query แบบกำหนดเองพร้อมด้วยวน get_template_part


9

ฉันมีข้อความค้นหาประเภทโพสต์ที่กำหนดเอง:

<?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
));
?>

และฉันต้องการวนลูปผ่านโพสต์เหล่านี้โดยใช้ loop-books.php:

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

ภายใน loop-books.php ฉันมีสิ่งเหล่านี้เหมือนกับ loop.php ปกติฉันเพิ่งเปลี่ยนฟังก์ชั่น have_posts และ the_post เพื่อทำงานกับแบบสอบถาม $ books:

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

แต่หลังจากนี้ฉันได้รับข้อผิดพลาด php:

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

ดังนั้นดูเหมือนว่าตัวแปร $ books จะไม่พร้อมใช้งานในฟังก์ชัน get_template_part ฉันจะแก้ไขปัญหานี้ได้อย่างไร หากฉันใส่คำสั่ง $ books เข้าไปใน loop-books.php การทำงานดี แต่ฉันต้องการแยกพวกเขาออก


ลองลบ$books->จาก loop-books.php และฉันหวังว่ามันจะใช้งานได้
Rohit Pande

หากฉันลบส่วน $ books-> มันจะใช้คิวรีเริ่มต้นเพื่อไม่ให้ดีสำหรับฉัน
passatgt

หากคุณกำลังใช้สิ่งที่ชอบ: <?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 )); ?>และที่นี่คุณโหลดget_template_partแบบสอบถาม และหลังจากนี้ถ้าคุณreset postdataจากนั้นฉันคิดว่าทางออกของฉันจะทำงานอย่างถูกต้อง
Rohit Pande

คำตอบ:


5

คุณจะต้องเป็นโลกาภิวัตน์$books(ถ้าคุณต้องการที่จะยึดget_template_part()) หรือใช้

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

get_template_part( 'loop', 'books' );แทน ปัญหานี้เกิดจาก$booksในloop-books.phpถูกกำหนดไว้เฉพาะในขอบเขตget_template_part()ของ


2
นี้. แม้ว่าหาก$booksแบบสอบถามเฉพาะloop-books.phpไฟล์เทมเพลตส่วนฉันขอแนะนำเพียงแค่วาง$books = new WP_Query()สายในไฟล์แม่แบบส่วน
Chip Bennett

ขอบคุณ ความคิดเห็นของคุณเป็นที่หนึ่งทางออกที่ดีกว่าคืออะไร?
passatgt

Same, @Chip เดียวกัน - ฉันจะใส่ไว้ในไฟล์เดียวกันและหลีกเลี่ยงปัญหาตั้งแต่แรก ตอบแบริ่งนี้ในใจว่า OP ต้องการแยกทั้งสอง
Johannes Pille

1
@passatgt เท่าที่ดีกว่าเห็นความคิดเห็นข้างต้นฉันอยากจะไปกับไฟล์เดียวและจะทำกับมัน หากคุณต้องแยกพวกเขาฉันจะไปกับlocate_template()ตัวเลือกที่จะไม่ถ่วงพื้นที่ทั่วโลก
Johannes Pille

โอเคขอบคุณ. เหตุผลที่ฉันต้องการที่จะแยกพวกเขาเป็นเพราะผมต้องการที่จะใช้ห่วงเหมือนกันกับคำสั่งอื่น ๆ ตามเกินไปในประเภทอื่น ๆ / taxonomies
passatgt

8

วิธีอื่น: เปิด / ปิดลูปแล้วใช้loop-books.phpเพื่อบรรจุเพียงมาร์กอัพสำหรับเนื้อหาลูป เช่น:

<?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;
?>

จากนั้นภายในloop-books.php:

<?php the_title(); ?><br/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.