Utilizzo di un WP_Query personalizzato con il ciclo get_template_part


9

Ho una query per un tipo di post personalizzato:

<?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 voglio scorrere questi post usando il loop-books.php:

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

All'interno di loop-books.php ho questi, proprio come il normale loop.php, ho appena cambiato la funzione have_posts e the_post per lavorare con la query $ books:

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

Ma dopo questo, ricevo un errore php:

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

Quindi sembra che la variabile $ books non sia disponibile all'interno della funzione get_template_part. Come posso risolvere questo problema? Se inserisco la query $ books all'interno di loop-books.php funziona correttamente, ma voglio separarli.


prova a rimuovere il $books->da loop-books.php e spero che funzioni.
Rohit Pande,

Se rimuovo la parte $ books-> utilizzerà una query predefinita, quindi non va bene per me.
passatgt

se stai usando qualcosa del tipo: <?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 qui carichi la get_template_partquery. E dopo questo se reset postdatapensi che la mia soluzione funzionerà correttamente.
Rohit Pande,

Risposte:


5

Sarà necessario globalizzare $books(se si desidera attenersi get_template_part()) o utilizzare

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

invece di get_template_part( 'loop', 'books' );. Questo problema è causato da $booksin loop-books.phpessendo definito solo nella portata di get_template_part().


2
Questo. Tuttavia, se la $booksquery è specifica per il loop-books.phpfile della parte del modello, consiglierei di inserire la $books = new WP_Query()chiamata nel file della parte del modello.
Chip Bennett,

Grazie. Qual è la tua opinione, qual è la soluzione migliore?
passatgt

Lo stesso, lo stesso @Chip: lo metterei anche nello stesso file ed eviterei il problema in primo luogo. Ha risposto a questa considerazione tenendo presente che l'OP voleva separare i due.
Johannes Pille,

1
@passatgt Per quanto è meglio, vedi i commenti sopra, preferirei andare con un file e finire. Se devi separarli, sceglierei l' locate_template()opzione per non ingombrare lo spazio dei nomi globale.
Johannes Pille,

Ok grazie. Il motivo per cui voglio separarli è perché voglio usare lo stesso loop anche con altre query basate su altre categorie / tassonomie
passatgt

8

Un metodo alternativo: apri / chiudi il ciclo, quindi usa loop-books.phpper contenere solo il markup per il contenuto del ciclo. per esempio:

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

Quindi, all'interno di loop-books.php:

<?php the_title(); ?><br/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.