web-dev-qa-db-fra.com

Utilisation d'une requête WP_Query personnalisée avec la boucle get_template_part

J'ai une requête pour un type de message personnalisé:

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

Et je veux parcourir ces publications en utilisant le fichier loop-books.php:

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

À l'intérieur de loop-books.php, je les ai, tout comme le fichier loop.php classique, je viens de modifier les fonctions have_posts et the_post afin qu'elles fonctionnent avec la requête $ books:

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

Mais après cela, je reçois une erreur php:

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

On dirait donc que la variable $ books n'est pas disponible dans la fonction get_template_part. Comment puis-je résoudre ce problème? Si je mets la requête $ books à l'intérieur du loop-books.php, cela fonctionne bien, mais je veux les séparer.

9
passatgt

Vous devrez soit globaliser $books (si vous souhaitez vous en tenir à get_template_part()) ou utiliser

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

au lieu de get_template_part( 'loop', 'books' );. Ce problème est dû au fait que $books dans loop-books.php est défini uniquement dans scope of get_template_part().

5
Johannes Pille

Une autre méthode consiste à ouvrir/fermer la boucle, puis à utiliser loop-books.php pour ne contenir que le markup du contenu de la boucle. par exemple.:

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

Ensuite, à l'intérieur de loop-books.php:

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