WordPressの記事取得で良く見るforeach(ループ処理)について解説

8月18日(日)にWordBench神戸で「第25回 WordBench神戸 - WordPressのPHPを学ぼう:超初級 –」が開催されました。
最後のディスカッションの部分でさらに初心者向けに「foreach」の解説をさせて頂いたので共有しておきます。

目次

foreachのループ内の処理がイマイチ理解できない

ディスカッションで頂いた質問内容です。

foreachを使って取得した記事をループしながら記事のタイトルなどを出力すれば良いことはなんとなく理解はできているのですが、でも具体的に中に書かれているコード1つ1つしっかり理解できていません。

以下のような処理のことだと思います。

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

では1つ1つ解説していこうと思います。

解説

1行目:まずは投稿記事の取得

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

get_posts の引数にcat=8&posts_per_page=-1を設定することによりカテゴリーIDが8のカテゴリーに所属する投稿記事を全件取得し、$my_posts 変数に保存しています。
posts_per_page  に-1を設定すると全件取得になります。-1以外ならその数字の数だけ取得します。

2行目と7行目:繰り返し処理

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

1行目の処理で$my_postsの中にはカテゴリーIDが8のカテゴリーに所属する投稿記事が全件入ってましたよね。
では次にforeach($my_posts as $post): をすることで$my_posts(記事の一覧)の内の1件の投稿記事を $post  へ渡しています。そしてsetup_postdata($post)をすることで「今からこの記事を使いたいから〜〜〜〜」とWordPressに教えています。

<?php endforeach; ?>foreach(ループ処理)の終わりを示しています。
endforeach  まで来たら、2行目の<?php foreach($my_posts as $post): setup_postdata($post); ?> の処理に戻ってきて2件目の投稿記事を $post  に渡します。
あとは記事が存在するまで繰り返します。

4行目:投稿記事のタイトルを表示

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

2行目でsetup_postdata($post); をしたことにより、4行目の the_permalink()the_title() を呼び出すだけで、セットした内容の記事のタイトルやパーマリンクが出力されます。
※実際には the_permalink()the_title()setup_postdata($post);をしなくても、$post に記事が渡されただけでもちゃんと出力はしてくれますが、この後に登場するthe_excerpt() がうまく表示されなくなりますので、必ずsetup_postdata($post); は書きましょう!
※また $my_posts  は任意の変数名でOK( $posts  以外の変数名が良いかも)ですが、 $post  の場合は他の変数名にしてしまうとうまく表示されなくなります。

5行目:記事の抜粋を表示

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

上記でも書きましたが、 setup_postdata($post);  を書いてないと抜粋がうまく表示されなくなりますので、必ず setup_postdata($post);  を書いてください。

8行目:global変数の$postを元に戻す

<?php $my_posts = get_posts("cat=8&posts_per_page=-1"); ?>
<?php foreach($my_posts as $post): setup_postdata($post); ?>

	<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
	<?php the_excerpt(); ?>

<?php endforeach; ?>
<?php wp_reset_postdata(); ?>

最後に8行目ですが、ネットのサンプルコードではこれが記載されてないことが多いです。
とても重要な処理なので記載するようにしてください。
これを記載していないとあとあと不具合を起こす可能性があります。

この処理では、 $post  の内容をクリアーにしています。
実は $post  変数はグローバル変数と言いまして、WordPress内の全体で共有している変数になります。みんなが利用している変数を上書きしていまっているので、それを自分が使う前の状態に戻す処理にしています。なので関数名にresetという文字が入ってるでしょ?
※4行目のところで my_posts  は任意の変数名でOKですが、「 $posts  以外の変数名が良いかも」って書いたのは$posts もグローバル変数になり、WordPressのいろんな処理がその値を利用しています。なので、$posts は使わずに$my_posts などの任意の変数名が良いです。

以上が解説です。

foreachの処理が理解できるとWordPressで表示したい内容をうまく表示できるようになりますので、是非使い方をマスターしてください^^

よかったらシェアしてね!
URLをコピーする
URLをコピーしました!

「エンジニアのためのWordPress開発入門」を執筆しました!

WordPressを使った開発案件は依然多く、それに携わるWebエンジニアも多数存在します。ただし、モダンな開発手法に慣れたWebエンジニアがWordPressに初めて触れたとき、その独特のアーキテクチャやシステムの構成に戸惑いを感じることがあるかもしれません。だが、WordPressは、それらを補ったうえにさらに強力なメリットを持ち合わせています。本書は、PHPプログラマがWordPressで開発する際に必要な基礎知識から、現場で役立つ具体的なカスタマイズ手法や開発のポイントについて詳しく解説しています。

この記事を書いた人

NPO法人のHP制作(WordPress)やkintoneを使った業務システムの構築をしています。サイボウズ株式会社公認kintoneエバンジェリスト/CoderDojo西宮と梅田のチャンピオン/認定NPO法人宝塚NPOセンター理事/NPO法人SEIN理事/

コメント

コメント一覧 (5件)

コメントする

目次
閉じる