Utilizzare una WP_Query personalizzata con il loop get_template_part

27 nov 2012, 14:37:42
Visualizzazioni: 13.7K
Voti: 11

Ho una query per un custom post type:

<?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 ciclare attraverso questi post usando il file loop-books.php:

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

All'interno di loop-books.php ho questo codice, simile al normale loop.php, ho solo modificato le funzioni 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, ottengo un errore PHP:

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

Sembra che la variabile $books non sia disponibile all'interno della funzione get_template_part. Come posso risolvere questo problema? Se metto la query $books dentro loop-books.php funziona bene, ma vorrei mantenerle separate.

3
Commenti

prova a rimuovere il $books-> da loop-books.php e spero che funzionerà.

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

Se rimuovo la parte $books-> utilizzerà una query di default e questo non va bene per me.

passatgt passatgt
27 nov 2012 14:45:02

se stai usando qualcosa come:

<?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 query get_template_part. E dopo questo se fai reset postdata allora penso che la mia soluzione funzionerà correttamente.

Rohit Pande Rohit Pande
27 nov 2012 14:48:19
Tutte le risposte alla domanda 2
0

Un metodo alternativo: apri/chiudi il loop, e poi utilizza loop-books.php per contenere solo il markup del contenuto del loop. Ad esempio:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// Ottieni la query dei libri
$books = new WP_Query(array(
    'post_type' => 'wiki',
    'posts_per_page' => '50',
    'paged' => $paged
));
// Apri il loop dei libri
if ( $books->have_posts() ) :     
    while ($books->have_posts()) : $books->the_post();
        // Ottieni il markup del loop
        get_template_part( 'loop', 'books' );
// Chiudi il loop dei libri
    endwhile;
endif;
?>

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

<?php the_title(); ?><br/>
27 nov 2012 15:17:22
6

Dovrai globalizzare la variabile $books (se vuoi continuare a utilizzare get_template_part()) oppure usare

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

invece di get_template_part( 'loop', 'books' );. Questo problema è causato dal fatto che $books in loop-books.php è definita solo nell'ambito di get_template_part().

27 nov 2012 14:55:32
Commenti

Questo. Tuttavia, se la query $books è specifica per il file template-part loop-books.php, consiglierei di inserire direttamente la chiamata $books = new WP_Query() all'interno del file template-part.

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

Grazie. Qual è la tua opinione, quale delle due soluzioni è migliore?

passatgt passatgt
27 nov 2012 14:57:01

Uguale, uguale @Chip - metterei anche io nello stesso file ed eviterei il problema alla radice. Ho risposto tenendo presente che l'OP voleva separare i due.

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

@passatgt Per quanto riguarda quale sia la migliore, vedi i commenti sopra, preferirei usare un unico file e finirla lì. Se devi separarli, opterei per l'opzione locate_template(), per non ingombrare il namespace globale.

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

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

passatgt passatgt
27 nov 2012 15:06:25

Perché non passare quelle altre tassonomie come variabili al tuo array di argomenti della query? (Come farlo dipenderebbe dal contesto/implementazione specifica, ma sarebbe certamente più pulito che mettere l'intera query stessa in un globale.)

Chip Bennett Chip Bennett
27 nov 2012 15:14:08
Mostra i restanti 1 commenti