web-dev-qa-db-fra.com

la boucle get_posts () renvoie le même the_title () pour chaque message

J'utilise get_posts() pour récupérer les messages d'une catégorie particulière à afficher en haut de ma page d'accueil, séparément de la boucle de la page d'accueil principale. Tout semble bien fonctionner, mais pour le titre (renvoyé par the_title()) qui est toujours le même. le titre du premier message récupéré par get_posts(). the_permalink() fait la même chose, mais the_excerpt() renvoie le résultat correct pour chaque message.

Voici mon code (j'ai supprimé seulement quelques lignes de peur de supprimer par inadvertance la cause de ce problème):

$query = get_posts(array(
    'numberposts'=>-1,
    'category'=>3
    ));
$events = array();

if ($query) {
    foreach ($query as $tpost) {
        $fields = get_post_custom($tpost->ID);
        if (isset($fields['event_start'])) {
            $usetime = $fields['event_start'][0];
            if (isset($fields['event_end'])) {
                $usetime = $fields['event_end'][0];
                }
            if ($usetime>time()) {
                $events[] = array("post"=>$tpost,"fields"=>$fields);
                }
            }
        }
    usort($events,function($a,$b){
        $a = $a['fields']['event_start'][0];
        $b = $b['fields']['event_start'][0];
        if ($a==$b) { return 0; }
        return ($a < $b) ? -1 : 1;
        });
    }

if (count($events)>0) { ?>
    <div class="pad10 tac">
    <h2 class="mar10">Upcoming Events</h2>
    <div class="tiles">
    <?php foreach ($events as $event ) { ?>
        <?php setup_postdata( $event['post'] );?>
        <a href="<?php the_permalink(); ?>" class='noshow'>
        <div class="tile smalltile"><div id='post-<?php the_ID(); ?>'>
            <h2><?php the_title();?></h2>
            <b><?php
            echo(date_i18n("D, F j @ g:ia",$event['fields']['event_start'][0]));
            ?></b>
            <p><?php the_excerpt();?></p>
        </div></div>
        </a>
    <?php }?>
    </div></div>
<?php }?>

Je suis vraiment curieux, surtout que ce code est, pour l’essentiel, basé sur l’exemple get_posts() de cet article , où il fonctionnerait bien.

Je pense que cela a probablement un rapport avec mon utilisation de setup_postdata, mais je suppose que ce n’est vraiment qu’une pure spéculation.

1
laef

Transformer le commentaire de Milos en réponse ...

Le problème auquel vous êtes confronté est le résultat de nombreuses fonctions orientées templates basées sur Wordpress qui supposent des variables globales. Dans les boucles basées sur WP_Query, le réglage de ces variables est effectué en appelant la méthode the_post() de l'objet WP_Query, mais avec get_posts, vous devez appeler setup_postdata() pour cela.

Ma préférence personnelle est simplement d’essayer d’éviter des fonctions telles que the_title au lieu de fonctions telles que get_the_title, qui acceptent un identifiant de publication explicite, lorsque cela est possible.

1
Mark Kaplun