Verwenden einer benutzerdefinierten WP_Query mit der Schleife get_template_part


9

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 Datei loop-books.php durchlaufen:

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

Innerhalb der loop-books.php habe ich diese, genau wie die reguläre loop.php, ich habe gerade die have_posts und die_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 stelle, funktioniert sie einwandfrei, aber ich möchte sie trennen.


versuche das $books->aus loop-books.php zu entfernen & ich hoffe es wird funktionieren.
— Rohit Pande

Wenn ich den Teil $ books-> entferne, wird eine Standardabfrage verwendet, was für mich nicht gut ist.
— passatgt

Wenn Sie etwas verwenden wie: <?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 hier laden Sie die get_template_partAbfrage. Und danach, wenn Sie reset postdatadann denke ich, dass meine Lösung richtig funktionieren wird.
— Rohit Pande

Antworten:


5

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

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

statt get_template_part( 'loop', 'books' );. Dieses Problem wird verursacht durch $booksin loop-books.phpnur in der definiert ist , Umfang von get_template_part().


2
Dies. Wenn die $booksAbfrage jedoch spezifisch für die loop-books.phpVorlagenteildatei ist, würde ich empfehlen, den $books = new WP_Query()Aufruf nur in die Vorlagenteildatei einzufügen.
— Chip Bennett

Vielen Dank. Was ist Ihre Meinung, welche ist die bessere Lösung?
— passatgt

Same, same @Chip - Ich würde es auch in dieselbe Datei einfügen und das Problem überhaupt vermeiden. Beantwortete dies unter Berücksichtigung der Tatsache, dass das OP die beiden trennen wollte.
— Johannes Pille

1
@passatgt Soweit das besser ist, siehe die obigen Kommentare, ich würde lieber mit einer Datei gehen und damit fertig sein. Wenn Sie sie trennen müssen, würde ich die locate_template()Option wählen, den globalen Namespace nicht zu überladen.
— Johannes Pille

OK danke. Der Grund, warum ich sie trennen möchte, ist, dass ich dieselbe Schleife auch mit anderen Abfragen verwenden möchte, die auf anderen Kategorien / Taxonomien basieren
— passatgt

8

Eine alternative Methode: Öffnen / Schließen der Schleife und Verwenden von 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/>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.