setup_postdata () scheint nicht zu funktionieren?

11

Ich bin nicht sicher warum, aber ich habe get_posts()einige Daten abgefragt. Dann habe ich verwendet setup_postdata()... Ich denke, es wird verwendet, damit ich Funktionen wie the_permalink()etc mit den neuen Post-Daten verwenden kann?

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

aber es scheint, dass nur the_excerptder neue Post-Datenwert enthält, warum ist das so? Ich finde, wenn ich es benutze echo get_the_permalink($cp), funktioniert es in Ordnung. Aber ich denke, die kürzere Version wird besser sein

Jiew Meng
quelle

Antworten:

30

Ich könnte mich irren, aber nach dem, was ich sehe, sollte "setup_postdata ()" verwendet werden, wenn eine benutzerdefinierte Auswahlabfrage ausgeführt wird (nicht nur query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

Wenn Sie Tags wie "the_title ()" und "the_permalink ()" für diese benutzerdefinierte Auswahlabfrage verwenden möchten, müssen Sie den Variablennamen $ post speziell (keinen anderen Variablennamen) in setup_postdata ( ) - AUCH - Sie sollten global $ post vor Ihrer "foreach" -Schleife aufrufen ...

Folgen Sie also im Grunde diesem Beispiel in diesem Codex-Link. Und ändern Sie nicht den Variablennamen $ post - sonst wird er beschädigt.

HTH

Jennifer Stuart
quelle
2
"Sie sollten global $ post aufrufen". JA! Warum ist das nicht im Codex
AlxVallejo
26

Ersetze das

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

mit

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

Sie müssen also die genaue $postVariable zusammen mit dem verwenden setup_postdata().

WP-Silber
quelle
Dies behebt das Problem, das ich hatte. Prost Kumpel
Jeff K.
1
Jemand kauft diesem Mann ein Bier! Vielen Dank. Irgendeine Idee, warum / wie sich eine lokale Variable damit anlegen kann setup_postdata()?
Odys
Seltsam. Es erscheint so unlogisch, einen bestimmten Variablennamen zu benötigen, wenn Sie ihn als Parameter übergeben.
Gavin
6

Abhängig davon, wo Sie setup_postdata () verwenden (wenn es sich nicht in der Hauptschleife oder beispielsweise in einem Funktions- / Seitenleisten-Widget befindet), müssen Sie möglicherweise auch Folgendes deklarieren:

global $post;
David Gard
quelle
4

global post;funktioniert nicht mit, setup_postdata($post);wenn Sie die the_title()Befehlsfamilie usw. verwenden möchten .

Es befindet sich unter https://codex.wordpress.org/Function_Reference/setup_postdata

Verwenden Sie stattdessen

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

... stellen Sie außerdem sicher, dass $post_objectes sich um ein gültiges WP_Post-Objekt handelt.

Ryan Taylor
quelle
1
Diese Antwort löst tatsächlich das Problem, anstatt das OP zu schelten: p
nodws
1

Verwenden Sie beim Abfragen von Posts einfach die normale Schleife mit einer Reihe von Argumenten. Setzen Sie dann die Abfrage am Ende zurück.

<?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(); ?>
Curtismchale
quelle
Danke, das funktioniert. Aber nur zum Verständnis, wissen Sie, warum setup_postdata()es nicht zu funktionieren scheint? Habe ich es falsch benutzt?
Jiew Meng
1
@jiewmeng - Überprüfen Sie, ob das Problem durch Verwendung $postanstelle von behoben wird $cp.
t31os
Ich stimme für die fix @ t31os Vorschläge. Die Beispiele im Codex zeigen die Verwendung so und $ post ist eine spezielle Variable in WordPress, sodass es in einer Schleife möglicherweise mehr bewirkt als das, was Sie verwendet haben.
Curtismchale
@ t31os, @curtismchale, das schien auch nicht zu funktionieren. Es gibt immer noch das gleiche Ergebnis
Jiew Meng