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.


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


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/>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.