Cómo usar WP_Query personalizado con get_template_part en WordPress
Tengo una consulta para un tipo de publicación personalizada:
<?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
));
?>
Y quiero recorrer estas publicaciones usando loop-books.php:
<?php get_template_part( 'loop', 'books' ); ?>
Dentro de loop-books.php tengo esto, similar al loop.php normal, solo cambié las funciones have_posts y the_post para trabajar con la consulta $books:
<?php if ( $books->have_posts() ) : ?>
<?php while ($books->have_posts()) : $books->the_post(); ?>
<?php the_title(); ?><br/>
<?php endwhile; ?>
<?php endif; ?>
Pero después de esto, obtengo un error de PHP:
Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1
Parece que la variable $books no está disponible dentro de la función get_template_part. ¿Cómo puedo resolver este problema? Si pongo la consulta $books dentro de loop-books.php funciona bien, pero quiero separarlas.

Un método alternativo: abrir/cerrar el loop, y luego usar loop-books.php
para contener solo el markup del contenido del loop. Por ejemplo:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Obtener la consulta de libros
$books = new WP_Query(array(
'post_type' => 'wiki',
'posts_per_page' => '50',
'paged' => $paged
));
// Abrir el loop de libros
if ( $books->have_posts() ) :
while ($books->have_posts()) : $books->the_post();
// Obtener el markup del loop
get_template_part( 'loop', 'books' );
// Cerrar el loop de libros
endwhile;
endif;
?>
Luego, dentro de loop-books.php
:
<?php the_title(); ?><br/>

Necesitarás globalizar $books
(si deseas seguir usando get_template_part()
) o utilizar
require( locate_template( 'loop-books.php' ) );
en lugar de get_template_part( 'loop', 'books' );
. Este problema ocurre porque $books
en loop-books.php
solo está definido en el ámbito de get_template_part()
.

Esto. Aunque, si la consulta $books
es específica para el archivo de plantilla parcial loop-books.php
, recomendaría simplemente colocar la llamada $books = new WP_Query()
dentro del archivo de plantilla parcial.

Lo mismo, lo mismo @Chip - yo también lo pondría en el mismo archivo y evitaría el problema desde el principio. Respondí esto teniendo en cuenta que el OP quería separar los dos.

@passatgt En cuanto a cuál es mejor, mira los comentarios anteriores, prefiero ir con un solo archivo y terminarlo. Si debes separarlos, optaría por la opción locate_template()
, para no saturar el espacio de nombres global.

Ok, gracias. La razón por la que quiero separarlos es porque quiero usar el mismo loop con otras consultas basadas en otras categorías/taxonomías
