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.

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.

@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.

Ok, grazie. Il motivo per cui voglio separarli è perché voglio utilizzare lo stesso loop con altre query basate su altre categorie/tassonomie
