Usando um WP_Query personalizado com loop get_template_part

8

Eu tenho uma consulta para um tipo de postagem personalizado:

<?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 eu quero percorrer essas postagens usando o loop-books.php:

<?php get_template_part( 'loop', 'books' ); ?>

Dentro do loop-books.php eu tenho estes, assim como o loop.php normal, eu mudei a função have_posts e the_post para trabalhar com a consulta $ books:

<?php if ( $books->have_posts() ) : ?>      
    <?php while ($books->have_posts()) : $books->the_post(); ?>
        <?php the_title(); ?><br/>
    <?php endwhile; ?>
<?php endif; ?>

Mas depois disso, recebo um erro de php:

Fatal error: Call to a member function have_posts() on a non-object in .../loop-books.php on line 1

Parece que a variável $ books não está disponível dentro da função get_template_part. Como posso resolver esse problema? Se eu colocar a consulta $ books dentro do loop-books.php, ela está funcionando bem, mas eu quero separá-los.

    
por passatgt 27.11.2012 / 13:37

2 respostas

5

Você precisará globalizar $books (se quiser manter get_template_part() ) ou usar

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

em vez de get_template_part( 'loop', 'books' ); . Esse problema é causado por $books in loop-books.php sendo definido apenas no escopo de get_template_part() .

    
por Johannes Pille 27.11.2012 / 13:55
7

Um método alternativo: abra / feche o loop e, em seguida, use loop-books.php para conter apenas a marcação para o conteúdo do loop. por exemplo:

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

Em seguida, dentro de loop-books.php :

<?php the_title(); ?><br/>
    
por Chip Bennett 27.11.2012 / 14:17