wake-up-neo.com

Verwenden einer benutzerdefinierten WP_Query mit der get_template_part-Schleife

Ich habe eine Abfrage nach einem benutzerdefinierten Beitragstyp:

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

Und ich möchte diese Beiträge mit der loop-books.php durchlaufen:

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

In der loop-books.php habe ich diese, genau wie die reguläre loop.php, ich habe gerade die have_posts und the_post-Funktion geändert, um mit der $ books-Abfrage zu arbeiten:

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

Aber danach bekomme ich einen PHP-Fehler:

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

Es sieht also so aus, als ob die Variable $ books in der Funktion get_template_part nicht verfügbar ist. Wie kann ich dieses Problem beheben? Wenn ich die $ books-Abfrage in die loop-books.php lege, funktioniert sie einwandfrei, aber ich möchte sie trennen.

9
passatgt

Sie müssen entweder $books globalisieren (wenn Sie sich an get_template_part() halten möchten) oder verwenden

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

anstelle von get_template_part( 'loop', 'books' );. Dieses Problem wird dadurch verursacht, dass $books in loop-books.php nur in scope von get_template_part() definiert wird.

5
Johannes Pille

Eine alternative Methode: Öffnen/Schließen Sie die Schleife, und verwenden Sie dann loop-books.php, um nur das Markup für den Schleifeninhalt zu enthalten. z.B.:

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

Dann innerhalb von loop-books.php:

<?php the_title(); ?><br/>
8
Chip Bennett