Usando um WP_Query personalizado com o loop get_template_part

9

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 esses posts usando o loop-books.php:

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

Dentro do loop-books.php eu os tenho, assim como o loop.php normal, apenas alterei 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 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, está funcionando bem, mas quero separá-las.

passatgt
fonte
tente remover o $books->loop-books.php e espero que funcione.
precisa
Se eu remover a parte $ books->, ela usará uma consulta padrão para que não seja bom para mim.
27612 passatgt #
se você estiver 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 )); ?>e aqui você carrega a get_template_partconsulta. E depois disso, se você reset postdata, acho que minha solução funcionará corretamente.
precisa

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' );. Este problema é causado por $booksem loop-books.phpque está sendo definido apenas no âmbito da get_template_part().

Johannes Pille
fonte
2
Este. Porém, se a $booksconsulta for específica para o loop-books.phparquivo de parte do modelo, eu recomendaria apenas colocar a $books = new WP_Query()chamada dentro do arquivo de parte do modelo.
Chip Bennett
Obrigado. Qual é a sua opinião, qual é a melhor solução?
passatgt
Mesmo, mesmo @Chip - eu também o colocaria no mesmo arquivo e evitaria o problema em primeiro lugar. Respondeu a esse fato que o OP queria separar os dois.
Johannes Pille
11
@passatgt Quanto melhor, veja os comentários acima, eu prefiro ir com um arquivo e terminar com ele. Se você precisar separá-los, eu usaria a locate_template()opção, para não bagunçar o espaço para nome global.
Johannes Pille
Ok obrigado. A razão de eu querer separá-los é porque eu quero usar o mesmo ciclo com outras consultas também com base em outras categorias / taxonomias
passatgt
8

Um método alternativo: abra / feche o loop e use loop-books.phppara conter apenas a marcação do 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;
?>

Então, dentro de loop-books.php:

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