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.


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().


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/>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.