setup_postdata () ne semble pas fonctionner?

12

Je ne sais pas pourquoi, mais j'ai utilisé get_posts()pour rechercher des données. Ensuite, j'ai utilisé setup_postdata()... Je pense que son utilisé afin que je puisse utiliser des fonctions comme the_permalink()etc avec les nouvelles données de poste?

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

mais il semble que ne the_excerptcontienne que la nouvelle valeur des données de publication, pourquoi? Je trouve que si j'utilise echo get_the_permalink($cp)ça marche bien. Mais je pense que la version courte sera meilleure

Jiew Meng
la source

Réponses:

32

Je peux me tromper, mais d'après ce que je vois, "setup_postdata ()" devrait être utilisé lors d'une requête de sélection personnalisée (pas seulement query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

De plus, si vous souhaitez utiliser des balises comme "the_title ()" et "the_permalink ()" avec cette requête de sélection personnalisée ... vous devrez utiliser le nom de variable $ post spécifiquement (pas un autre nom de variable) dans setup_postdata ( ) - AINSI - vous devez appeler global $ post avant votre boucle "foreach" ...

Donc, suivez cet exemple dans ce lien codex. Et ne changez pas le nom de variable $ post - sinon il le casse.

HTH

Jennifer Stuart
la source
2
msgstr "vous devriez appeler global $ post". OUI! Pourquoi est-ce pas dans le Codex
AlxVallejo
27

Remplace le

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

avec

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

Vous devez donc utiliser la $postvariable exacte avec le setup_postdata().

WP-Silver
la source
Cela a résolu le problème que j'avais. Cheers mate
Jeff K.
2
Quelqu'un achète une bière à cet homme! Merci .. Avez-vous une idée de pourquoi / comment une variable locale peut jouer avec setup_postdata()?
Odys
Bizarre. Il semble tellement illogique d'exiger un nom de variable spécifique lorsque vous le transmettez en tant que paramètre.
Gavin
6

Selon l'endroit où vous utilisez setup_postdata () (s'il ne se trouve pas dans la boucle principale ou dans un widget de fonction / barre latérale, par exemple), vous devrez peut-être également déclarer -

global $post;
David Gard
la source
4

global post;ne fonctionne pas setup_postdata($post);si vous souhaitez utiliser la the_title()famille de commandes, etc.

C'est dans https://codex.wordpress.org/Function_Reference/setup_postdata

Utilisez plutôt

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

... assurez-vous également que votre $post_objectest un objet WP_Post valide.

Ryan Taylor
la source
1
Cette réponse résout en fait le problème, au lieu de réprimander l'OP: p
nodws
1

Lorsque vous interrogez des publications, utilisez simplement la boucle normale avec un ensemble d'arguments transmis. Réinitialisez ensuite la requête à la fin.

<?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
la source
Merci, cela fonctionne. Mais juste pour comprendre, savez-vous pourquoi setup_postdata()ne semble pas fonctionner? L'ai-je mal utilisé?
Jiew Meng
1
@jiewmeng - Voir si l'utilisation $postau lieu de $cprésout le problème.
t31os
Je vote pour le correctif proposé par @ t31os. Les exemples sur le codex montrent l'utilisation comme ça et $ post est une variable spéciale dans WordPress donc il pourrait faire plus à l'intérieur d'une boucle que ce que vous avez utilisé.
curtismchale
@ t31os, @curtismchale, cela ne semblait pas fonctionner aussi. Il donne toujours le même résultat
Jiew Meng