Cómo usar WP_Query personalizado con get_template_part en WordPress

27 nov 2012, 14:37:42
Vistas: 13.7K
Votos: 11

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.

3
Comentarios

intenta eliminar el $books-> de loop-books.php y espero que funcione.

Rohit Pande Rohit Pande
27 nov 2012 14:42:44

Si elimino la parte $books-> usará una consulta predeterminada, lo cual no es bueno para mí.

passatgt passatgt
27 nov 2012 14:45:02

si estás 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í cargas la consulta get_template_part. Y después de esto si haces reset postdata entonces creo que mi solución funcionará correctamente.

Rohit Pande Rohit Pande
27 nov 2012 14:48:19
Todas las respuestas a la pregunta 2
0

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/>
27 nov 2012 15:17:22
6

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

27 nov 2012 14:55:32
Comentarios

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.

Chip Bennett Chip Bennett
27 nov 2012 14:56:51

Gracias. ¿Cuál es tu opinión, cuál es la mejor solución?

passatgt passatgt
27 nov 2012 14:57:01

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.

Johannes Pille Johannes Pille
27 nov 2012 15:00:00

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

Johannes Pille Johannes Pille
27 nov 2012 15:01:19

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

passatgt passatgt
27 nov 2012 15:06:25

¿Por qué no pasar esas otras taxonomías como variables a tu array de argumentos de consulta? (Cómo lo hagas dependería del contexto/implementación específica, pero ciertamente sería más limpio que poner toda la consulta en una variable global.)

Chip Bennett Chip Bennett
27 nov 2012 15:14:08
Mostrar los 1 comentarios restantes