web-dev-qa-db-ja.com

"setup_postdata"と一緒に使用した場合の "get_posts"と "wp_get_recent_posts"の違いは何ですか?

これは完全に "私はまだWPに慣れていない"というタイプの質問かもしれませんが、 get_posts()wp_get_recent_posts() を使ったときに面白い出力に遭遇しました。私が setup_postdata() で書いたカスタム関数。これは私が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();
}

簡単でしょ?そしてその関数はうまく機能し、タイトルのdivタグの内側を完全に捨てます。 7行目から12行目を次のように置き換えます。

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

...その場合、関数の先頭でglobal $postを使用しないのと同じように、関数は投稿を正しく「反復」しないように見え、最初の投稿を何度も繰り返して破棄します。

どうしてこれなの? wp_get_recent_posts()が私にはまだ理解していないこととは異なる何かがありますか。

2
Chris Kempen

setup_postdata()ソース を見ると、配列ではなくオブジェクト($post)が渡される必要があることがわかります。

wp_get_recent_posts()source )は、デフォルトで(3.1以前のバージョンとの互換性のために)各投稿を配列として返します。 wp_get_recent_posts()に渡すことができる2番目のオプションの引数は、これを防ぐことができます。

$posts = wp_get_recent_posts( $args, OBJECT_K )

(2番目の引数のARRAY_A以外の値でも構いません)。

2
Stephen Harris