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

9

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 messages en utilisant le loop-books.php:

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

À l'intérieur du loop-books.php, je les ai, tout comme le loop.php normal, je viens de changer les has_posts et la fonction_post pour travailler 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, j'obtiens une erreur php:

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

Il semble donc que la variable $ books ne soit 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 de loop-books.php, cela fonctionne bien, mais je veux les séparer.

passatgt
la source
essayez de supprimer le $books->loop-books.php et j'espère que cela fonctionnera.
Rohit Pande
Si je supprime la partie $ books->, elle utilisera une requête par défaut, donc ce n'est pas bon pour moi.
passatgt
si vous utilisez quelque chose comme: <?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 ici vous chargez la get_template_partrequête. Et après cela, si vous, reset postdataje pense que ma solution fonctionnera correctement.
Rohit Pande

Réponses:

5

Vous devrez soit globaliser $books(si vous voulez vous en tenir get_template_part()), soit utiliser

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

au lieu de get_template_part( 'loop', 'books' );. Ce problème est dû $booksau fait loop-books.phpqu'il n'est défini que dans le cadre de get_template_part().

Johannes Pille
la source
2
Cette. Cependant, si la $booksrequête est spécifique au loop-books.phpfichier de partie de modèle, je recommanderais simplement de placer l' $books = new WP_Query()appel dans le fichier de partie de modèle.
Chip Bennett
Merci. Quelle est votre opinion, laquelle est la meilleure solution?
passatgt
Identique, même @Chip - Je le mettrais également dans le même fichier et éviterais le problème en premier lieu. A répondu à cela en gardant à l'esprit que le PO voulait séparer les deux.
Johannes Pille,
1
@passatgt En ce qui concerne le mieux, voir les commentaires ci-dessus, je préfère aller avec un fichier et en finir avec. Si vous devez les séparer, je choisirais l' locate_template()option de ne pas encombrer l'espace de noms global.
Johannes Pille
OK merci. La raison pour laquelle je veux les séparer est parce que je veux utiliser la même boucle avec d'autres requêtes également basées sur d'autres catégories / taxonomies
passatgt
8

Une autre méthode: ouvrir / fermer la boucle, puis utiliser loop-books.phppour ne contenir que le balisage 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/>
Chip Bennett
la source