setup_postdata() non sembra funzionare?
Non sono sicuro del perché ma ho usato get_posts() per interrogare alcuni dati. Poi ho usato setup_postdata()... Penso sia utilizzato per poter usare funzioni come the_permalink() ecc. con i nuovi dati del post?
<?php foreach ($childPosts as $cp) : setup_postdata($cp); ?>
<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<?php if (has_post_thumbnail()) : ?>
<a href="<?php the_permalink() ?>"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
<?php endif; ?>
<?php the_excerpt(); ?>
<p class="more"><a href="<?php the_permalink() ?>">Leggi di più ...</a></p>
<?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>
<?php endforeach; ?>
ma sembra che solo the_excerpt contenga il nuovo valore dei dati del post, perché? Ho scoperto che se uso echo get_the_permalink($cp) funziona correttamente. Ma penso che la versione più breve sarebbe migliore
Potrei sbagliarmi, ma da quello che vedo, "setup_postdata()" dovrebbe essere utilizzato quando si esegue una query select personalizzata (non solo query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query
Inoltre, se vuoi utilizzare tag come "the_title()" e "the_permalink()" con quella query select personalizzata... dovrai utilizzare specificamente il nome della variabile $post (non un altro nome di variabile) in setup_postdata() - E ANCHE - dovresti chiamare global $post prima del tuo ciclo "foreach"...
Quindi fondamentalmente segui quell'esempio nel link del codex. E non cambiare il nome della variabile $post - altrimenti si rompe.
Spero sia utile
Qualcuno offra una birra a quest'uomo! Grazie... Hai idea del perché/percome una variabile locale possa interferire con setup_postdata()?
Odys
Strano. Sembra così illogico richiedere un nome specifico per la variabile quando la stai passando come parametro.
Gavin
@Gavin Non capisco perché più persone non mettano in discussione quanto sia strana alcune logiche di WP. La stranezza ormai sembra essere la normalità...
JDandChips
global post; non funziona con setup_postdata($post); se vuoi utilizzare i comandi della famiglia the_title() ecc.
È documentato in https://codex.wordpress.org/Function_Reference/setup_postdata
Invece utilizza
// global $post; setup_postdata($post_object); //non fare così!
setup_postdata( $GLOBALS['post'] =& $post_object );
...assicurati anche che il tuo $post_object sia un oggetto WP_Post valido.
2 cose importanti per far funzionare questo codice:
Usa la variabile globale
$postper impostare i dati del post, altrimenti le funzioni del loop non vedranno il tuo oggetto post personalizzato.MOLTO IMPORTANTE: assicurati di chiamare la funzione
wp_reset_postdata()alla fine del loop, altrimenti potresti avere strani errori che saranno molto difficili da debuggare.<?php global $post; $myposts = get_posts( array( 'posts_per_page' => 5, 'offset' => 1, 'category' => 1 ) ); if ( $myposts ) : foreach ( $myposts as $post ) : setup_postdata( $post ); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> endforeach; wp_reset_postdata(); endif; ?>
Quando si effettua una query sui post, utilizza il normale loop con un insieme di argomenti passati. Poi resetta la query alla fine.
<?php
// fa sì che la query rispetti le regole di impaginazione
$paged = get_query_var('paged');
// definizione degli argomenti per il loop personalizzato
$variablenameQuery = array(
'post_type' => 'seating-charts',
'post_status' => 'publish',
'cust_tax_name' => 'custom-tax-term',
'posts_per_page' => -1, // -1 significa tutti i post
'orderby' => 'date',
'order' => 'ASC',
'paged' => $paged,
); // fine query
// passa il risultato in query_posts per ottenere il risultato
query_posts($variablenameQuery);
?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php // Stile del singolo post ?>
<?php endwhile; ?>
<?php // navigazione impaginata - post successivo, post precedente... ?>
<?php else : ?>
<h3>Ops, sembra ci sia stato un problema. Per favore <a href="<?php echo get_option('home'); ?>/contact" title="Contattaci">contattaci</a> e risolveremo il problema.</h3>
<?php endif; ?>
<!-- resetta la Query di WordPress -->
<?php wp_reset_query(); ?>
Grazie, funziona. Ma solo per capire, sai perché setup_postdata() non sembra funzionare? L'ho usato in modo sbagliato?
Jiew Meng
@jiewmeng - Prova a usare $post invece di $cp per vedere se risolve il problema.
t31os
Sono d'accordo con la soluzione proposta da @t31os. Gli esempi nel codex mostrano l'uso in quel modo e $post è una variabile speciale in WordPress, quindi potrebbe fare più cose all'interno di un loop rispetto a quella che hai usato.
curtismchale
@t31os, @curtismchale, sembra che non abbia funzionato neanche così. Ottengo ancora lo stesso risultato
Jiew Meng
Vecchio, lo so, ma NON usare query_posts() a meno che tu non SAPPIA di averne bisogno. È inefficiente. Guarda questa utile immagine per le alternative: https://www.rarst.net/images/query_functions.png
Tex0gen