私は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 article のget_posts()
の例に基づいているので、本当に頭の痛いところです。
私はこれが私のsetup_postdataの使用と何らかの関係があると考えていますが、これは実際には単なるワイルドな推測にすぎないと思います。
ミロスのコメントを答えに….
あなたが直面している問題は、いくつかのグローバル変数を期待する多くのワードプレスのテンプレート指向の関数の結果です。 WP_Query
ベースのループでは、これらの変数の設定はWP_Query
オブジェクトのthe_post()
メソッドを呼び出すことによって行われますが、get_posts
を使うにはsetup_postdata()
を呼び出す必要があります。
私の個人的な好みは、可能であれば、明示的な投稿IDを受け入れるthe_title
のような関数を優先して、get_the_title
のような関数を避けるようにすることです。