web-dev-qa-db-fra.com

Quelle est la différence entre "get_posts" et "wp_get_recent_posts" lorsqu'ils sont utilisés avec "setup_postdata"?

C’est peut-être une question de type "Je suis toujours nouveau dans WP", mais j’ai rencontré un problème avec l’utilisation de get_posts() et wp_get_recent_posts() dans une fonction personnalisée que j’ai écrite avec setup_postdata() . Voici ce que j'avais dans mon fichier functions.php:

<?php
function getRecentPosts($total_posts = 2)
{
    $total_posts = intval($total_posts);
    global $post;

    $args = array(
        'posts_per_page' => $total_posts,
        'post_type'      => 'post',
        'post_status'    => 'publish'
    );
    $posts = get_posts($args);

    foreach ($posts as $post)
    {
        setup_postdata($post);
        echo '<div>';
            the_title();
        echo '</div>';
    }
    wp_reset_postdata();
}

Simple, non? Et cette fonction fonctionne très bien, en jetant parfaitement les balises de titre dans les variables div. Mais quand je remplace les lignes 7 à 12 par ce qui suit:

    ...
    $args = array(
        'posts_per_page' => $total_posts,
        //'post_type'    => 'post',
        'post_status'    => 'publish'
    );
    $posts = wp_get_recent_posts($args);
    ...

... alors la fonction ne semble pas "parcourir" correctement les posts, jetant le titre du premier post trouvé, encore et encore, un peu comme si vous n'utilisiez pas global $post au début de la fonction.

Pourquoi est-ce? Y at-il quelque chose de différent que wp_get_recent_posts() fait que je ne comprends pas encore.

2
Chris Kempen

Si vous regardez le source de setup_postdata(), vous constaterez qu'il faut un objet ($post) à transmettre et non un tableau.

wp_get_recent_posts() ( source ), par défaut (pour la compatibilité avec les versions antérieures à la version 3.1), renvoie chaque publication sous forme de tableau. Le deuxième argument optionnel, pouvant être passé à wp_get_recent_posts(), peut empêcher ceci:

$posts = wp_get_recent_posts( $args, OBJECT_K )

(bien que toute valeur autre que ARRAY_A dans le deuxième argument fasse l'affaire).

2
Stephen Harris