setup_postdata() non sembra funzionare?

19 feb 2011, 16:50:26
Visualizzazioni: 43.7K
Voti: 17

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

0
Tutte le risposte alla domanda 6
2
44

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

22 feb 2011 20:02:56
Commenti

"dovresti chiamare global $post" . SÌ! Perché non è nel Codex

AlxVallejo AlxVallejo
26 apr 2014 20:11:39

2021 e questo ancora mi causa problemi lol

Andrew Schultz Andrew Schultz
25 feb 2021 14:04:07
5
41

Sostituisci il

foreach ( $childPosts as $cp ) : setup_postdata( $cp );

con

foreach ( $childPosts as $post ) : setup_postdata( $post );

Quindi devi utilizzare esattamente la variabile $post insieme alla funzione setup_postdata().

25 ago 2011 00:12:28
Commenti

Questo ha risolto il problema che stavo avendo. Grazie amico!

Jeff K. Jeff K.
3 mar 2012 00:05:04

Qualcuno offra una birra a quest'uomo! Grazie... Hai idea del perché/percome una variabile locale possa interferire con setup_postdata()?

Odys Odys
7 nov 2016 16:09:53

Strano. Sembra così illogico richiedere un nome specifico per la variabile quando la stai passando come parametro.

Gavin Gavin
14 dic 2018 09:51:02

@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 JDandChips
24 lug 2020 19:47:59

Un'altra splendida implementazione da parte di Automattticcc.

marek.m marek.m
4 nov 2021 17:22:08
1
12

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.

14 set 2016 02:40:49
Commenti

Questa risposta risolve effettivamente il problema, invece di rimproverare l'OP :p

nodws nodws
24 nov 2017 01:20:10
1
10

A seconda di dove stai utilizzando setup_postdata() (se non è nel loop principale, o in una funzione/widget della sidebar, ad esempio), potresti anche aver bisogno di dichiarare -

global $post;
21 set 2011 18:50:21
Commenti

Puoi spiegare perché?

Peter Højlund Andersen Peter Højlund Andersen
4 dic 2021 16:16:36
0

2 cose importanti per far funzionare questo codice:

  1. Usa la variabile globale $post per impostare i dati del post, altrimenti le funzioni del loop non vedranno il tuo oggetto post personalizzato.

  2. 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;
     ?>
    
9 nov 2021 14:07:53
5

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(); ?>
19 feb 2011 16:55:33
Commenti

Grazie, funziona. Ma solo per capire, sai perché setup_postdata() non sembra funzionare? L'ho usato in modo sbagliato?

Jiew Meng Jiew Meng
19 feb 2011 17:16:37

@jiewmeng - Prova a usare $post invece di $cp per vedere se risolve il problema.

t31os t31os
20 feb 2011 03:28:43

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 curtismchale
20 feb 2011 03:54:04

@t31os, @curtismchale, sembra che non abbia funzionato neanche così. Ottengo ancora lo stesso risultato

Jiew Meng Jiew Meng
20 feb 2011 04:11:38

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 Tex0gen
29 mar 2023 17:00:45