setup_postdata () non sembra funzionare?


12

Non sono sicuro del perché, ma ho usato get_posts()per cercare alcuni dati. Poi ho usato setup_postdata()... Penso che sia usato in modo da poter usare funzioni come the_permalink()etc con i nuovi dati di 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() ?>">Read more ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

ma sembra che the_excerptcontenga solo il nuovo valore dei dati post, perché? Trovo che se lo uso echo get_the_permalink($cp)funziona bene. Ma penso che la versione più corta sarà migliore

Risposte:


32

Potrei sbagliarmi, ma da quello che vedo, "setup_postdata ()" dovrebbe essere usato quando si esegue una query di selezione personalizzata (non solo query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Inoltre, se si desidera utilizzare tag come "the_title ()" e "the_permalink ()" con quella query di selezione personalizzata ... sarà necessario utilizzare il nome variabile $ post specificamente (non un altro nome variabile) in setup_postdata ( ) - BENE - dovresti chiamare $ post globale prima del tuo ciclo "foreach" ...

Quindi, in pratica, segui questo esempio in quel link di codice. E non cambiare il nome della variabile $ post, altrimenti lo spezza.

HTH


2
"dovresti chiamare $ post globale". SÌ! Perché questo non è nel Codice
AlxVallejo il

27

Sostituisci il

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

con

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

Quindi è necessario utilizzare la $postvariabile esatta insieme a setup_postdata().


Questo risolto il problema che stavo avendo. Saluti compagno
Jeff K.

2
Qualcuno compra a quest'uomo una birra! Grazie .. Qualche idea sul perché / su come una variabile locale può interferire setup_postdata()?
Odys,

Strano. Sembra così illogico richiedere un nome di variabile specifico quando lo si passa come parametro.
Gavin,

6

A seconda di dove stai usando setup_postdata () (se non si trova nel ciclo principale o in un widget funzione / barra laterale, per esempio), potresti anche dover dichiarare -

global $post;

4

global post;non funziona setup_postdata($post);se si desidera utilizzare la the_title()famiglia di comandi ecc.

È in https://codex.wordpress.org/Function_Reference/setup_postdata

Invece usa

// global $post; setup_postdata($post_object); //don't do this!
setup_postdata( $GLOBALS['post'] =& $post_object );

... assicurati anche che il tuo $post_objectsia un oggetto WP_Post valido.


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

1

Quando esegui una query sui post, utilizza semplicemente il ciclo normale con una serie di argomenti passati in esso. Quindi reimpostare la query alla fine.

<?php 

    // makes query respect paging rules
    $paged = get_query_var('paged');

    // defining the arguements for the custom loop
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // neg 1 means all posts
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // end query

    // pass result into query_posts to get result
    query_posts($variablenameQuery);

?>
<?php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post(); ?>

        <?php // Individual Post Styling ?>

    <?php endwhile; ?>

        <?php // paged navigation - next post, previous post... ?>

    <?php else : ?>

    <h3>Ooops looks like there was an issue. Please <a href="<?php echo get_option('home'); ?>/contact" title="Contact Us">get in touch</a> with us and we'll get the problem fixed.</h3>

<?php endif; ?>

<!-- resets the WordPress Query -->
<?php wp_reset_query(); ?>

Grazie, funziona. Ma solo per capire, sai perché setup_postdata()non sembra funzionare? L'ho usato male?
Jiew Meng,

1
@jiewmeng: verifica se il problema viene utilizzato $postinvece di utilizzare $cp.
t31os,

Voto per la correzione @ t31os suggerisce. Gli esempi nel codice mostrano l'uso in questo modo e $ post è una variabile speciale in WordPress, quindi potrebbe fare di più all'interno di un ciclo di quello che hai usato.
curtismchale,

@ t31os, @curtismchale, che non sembra funzionare troppo. Dà ancora lo stesso risultato
Jiew Meng,
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.