get_posts( )で使用する foreach文の$postですがPHP的に考えると別に$postとしなくても好きな変数名にすればいいと考えてしまいます。
ところが、適当な変数名を使用すると期待どおりの動作をしてくれません。
get_posts( )で使用する foreach文の$postについて考察してみます。
get_posts( )について
get_posts( )はメインループとは別に、サブループを作るときに使用する便利な関数です。
たとえば5件の投稿タイトルを表示する場合には次のようなコードを書きます。
<?php $mypost = get_posts('numberposts=5'); foreach( $mypost as $post ) : setup_postdata($post); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
$postの不思議
このコードの中で、 次の部分に焦点をあてます。
foreach( $mypost as $post ) : setup_postdata($post);
PHPでは$post部分には好きな変数名を使用できるはずです。
けれどもこの場合では好きな変数名を使用すると予想外の表示になります。
なぜ?
コードをひとつひとつ見ていきましょう。
$mypost = get_posts('numberposts=5');
これで5件の投稿情報が取得される。
foreach( $mypost as $a) : setup_postdata($a);
これで5件の投稿情報が$aとして一つ一つ取り出してセットします。
そして投稿タイトルが一つ一つ表示されるはずですがうまくいかない。
5件の投稿情報が$aとして一つ一つ取り出されてセットされる。までは正しいです。
けれどもsetup_postdata()がくせ者です。これは引数にグローバル変数$postを指定する必要があります。$aでは駄目なのです。
the_title()やthe_content()を表示するにはグローバル変数の$postが必要なのです。
setup_postdata() は $post グローバル変数をセットしませんが、それへのリファレンスを引数とするつもりで設計されています。とWordPress codexに記述されています。
get_posts( )の追加情報
the_title()のみを表示させるにはsetup_postdata($post);は必ず必要ではありません。
foreach( $mypost as $post ) : <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
としても表示されます。
問題なのは
<?php the_content(); ?>
を表示するにはsetup_postdata($post);が必要になります。
更にthe_title()のみの表示なら以下のようにすることも可能です。
このコードの意味を考えるとWordPressが何をやっているか見えてきます。
<?php $mypost = get_posts( array( 'numberposts' => 5 ));?> <?php foreach( $mypost as $a) : ?> <p><a href="<?php echo $a->guid; ?>"><?php echo $a->post_title; ?></a></p> <?php endforeach; ?> <?php wp_reset_postdata(); ?>