web-dev-qa-db-ja.com

get_posts()ループは各投稿に対して同じthe_title()を返します

私はget_posts()を使って特定のカテゴリから投稿を取得し、メインのホームページLoopとは別にホームページの上部に表示します。すべてうまくいきそうですが、タイトル(the_title()を通して返される)は常に同じです。 get_posts()によって取得された最初の投稿のタイトル。 the_permalink()も同様に動作しますが、the_excerpt()は各投稿に対して正しい結果を返します。

これが私のコードです(この問題の原因となっているものを誤って削除する恐れがあるため、数行だけ削除しました)。

$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 }?>

特にこのコードは、ほとんどの部分で this articleget_posts()の例に基づいているので、本当に頭の痛いところです。

私はこれが私のsetup_postdataの使用と何らかの関係があると考えていますが、これは実際には単なるワイルドな推測にすぎないと思います。

1
laef

ミロスのコメントを答えに….

あなたが直面している問題は、いくつかのグローバル変数を期待する多くのワードプレスのテンプレート指向の関数の結果です。 WP_Queryベースのループでは、これらの変数の設定はWP_Queryオブジェクトのthe_post()メソッドを呼び出すことによって行われますが、get_postsを使うにはsetup_postdata()を呼び出す必要があります。

私の個人的な好みは、可能であれば、明示的な投稿IDを受け入れるthe_titleのような関数を優先して、get_the_titleのような関数を避けるようにすることです。

1
Mark Kaplun