Usando un WP_Query personalizado con get_template_part loop

9

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 del loop-books.php tengo estos, al igual que el loop.php regular, acabo de cambiar la función have_posts y the_post para que funcione 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, recibo 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 del loop-books.php está funcionando bien, pero quiero separarlos.

passatgt
fuente
intente eliminarlo $books->de loop-books.php y espero que funcione.
Rohit Pande
Si elimino la parte $ books->, usará una consulta predeterminada, así que eso no es bueno para mí.
Passatgt
si está usando algo como: <?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 aquí carga la get_template_partconsulta. Y después de esto, si reset postdatacreo que mi solución funcionará correctamente.
Rohit Pande

Respuestas:

5

Tendrá que globalizarse $books(si desea seguir get_template_part()) o usar

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

en lugar de get_template_part( 'loop', 'books' );. Este problema se debe $booksa que loop-books.phpse define solo en el ámbito de get_template_part().

Johannes Pille
fuente
2
Esta. Sin embargo, si la $booksconsulta es específica del loop-books.phparchivo de parte de plantilla, recomendaría simplemente poner la $books = new WP_Query()llamada dentro del archivo de parte de plantilla.
Chip Bennett
Gracias. ¿Cuál es su opinión, cuál es la mejor solución?
Passatgt
Mismo, mismo @Chip: también lo pondría en el mismo archivo y evitaría el problema en primer lugar. Respondió esto teniendo en cuenta que el OP quería separar a los dos.
Johannes Pille
1
@passatgt En cuanto a cuál es el mejor, vea los comentarios anteriores, prefiero ir con un archivo y terminar con él. Si debe separarlos, iría con la locate_template()opción, para no saturar el espacio de nombres global.
Johannes Pille
OK gracias. La razón por la que quiero separarlos es porque quiero usar el mismo bucle con otras consultas también en función de otras categorías / taxonomías
passatgt
8

Un método alternativo: abrir / cerrar el bucle y luego usarlo loop-books.phppara contener solo el marcado del contenido del bucle. p.ej:

<?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;
?>

Luego, dentro de loop-books.php:

<?php the_title(); ?><br/>
Chip Bennett
fuente