Utilizzare una WP_Query personalizzata con il loop get_template_part
Ho una query per un custom post type:
<?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
));
?>
E voglio ciclare attraverso questi post usando il file loop-books.php:
<?php get_template_part( 'loop', 'books' ); ?>
All'interno di loop-books.php ho questo codice, simile al normale loop.php, ho solo modificato le funzioni have_posts e the_post per lavorare con la query $books:
<?php if ( $books->have_posts() ) : ?>
<?php while ($books->have_posts()) : $books->the_post(); ?>
<?php the_title(); ?><br/>
<?php endwhile; ?>
<?php endif; ?>
Ma dopo questo, ottengo un errore PHP:
Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1
Sembra che la variabile $books non sia disponibile all'interno della funzione get_template_part. Come posso risolvere questo problema? Se metto la query $books dentro loop-books.php funziona bene, ma vorrei mantenerle separate.
Un metodo alternativo: apri/chiudi il loop, e poi utilizza loop-books.php per contenere solo il markup del contenuto del loop. Ad esempio:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Ottieni la query dei libri
$books = new WP_Query(array(
'post_type' => 'wiki',
'posts_per_page' => '50',
'paged' => $paged
));
// Apri il loop dei libri
if ( $books->have_posts() ) :
while ($books->have_posts()) : $books->the_post();
// Ottieni il markup del loop
get_template_part( 'loop', 'books' );
// Chiudi il loop dei libri
endwhile;
endif;
?>
Poi, all'interno di loop-books.php:
<?php the_title(); ?><br/>
Dovrai globalizzare la variabile $books (se vuoi continuare a utilizzare get_template_part()) oppure usare
require( locate_template( 'loop-books.php' ) );
invece di get_template_part( 'loop', 'books' );. Questo problema è causato dal fatto che $books in loop-books.php è definita solo nell'ambito di get_template_part().
Questo. Tuttavia, se la query $books è specifica per il file template-part loop-books.php, consiglierei di inserire direttamente la chiamata $books = new WP_Query() all'interno del file template-part.
Chip Bennett
Uguale, uguale @Chip - metterei anche io nello stesso file ed eviterei il problema alla radice. Ho risposto tenendo presente che l'OP voleva separare i due.
Johannes Pille
@passatgt Per quanto riguarda quale sia la migliore, vedi i commenti sopra, preferirei usare un unico file e finirla lì. Se devi separarli, opterei per l'opzione locate_template(), per non ingombrare il namespace globale.
Johannes Pille
Ok, grazie. Il motivo per cui voglio separarli è perché voglio utilizzare lo stesso loop con altre query basate su altre categorie/tassonomie
passatgt