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.