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

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

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

ディスカッションで頂いた質問内容です。
foreachを使って取得した記事をグルグルループしながら記事のタイトルなどを出力すれば良いのは、なんとなく理解されているみたいです。
でも具体的に中に書かれているコードがイマイチ理解できないとのことでした。

WordPressのテーマテンプレート内でforeachの処理を見るのは新しく記事一覧を取得する時、要は「get_posts」をした後の処理に見ることが多いと思います。こんな処理です。

[php] <?php $my_posts = get_posts(); ?>
<?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(); ?>
[/php]

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

解説

1行目:<?php $my_posts = get_posts(“cat=8&posts_per_page=-1”); ?>

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

2行目:<?php foreach($my_posts as $post): setup_postdata($post); ?>

1行目の処理で「$my_posts」の中にはカテゴリーIDが8の投稿記事が全件入ってましたよね。
では次に「foreach($my_posts as $post):」をすることで「$my_posts」(記事の一覧)の内の1件の投稿記事を「$post」へ渡しています。そして「setup_postdata($post)」をすることで「今からこの記事を使いたいから〜〜〜〜」とWordPressに教えています。
※setup_postdata=ポストデータをセットアップする。拳銃に玉を詰めて、引き金を引いた状態にしたって感じでしょうか。

4行目:<h1><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h1>

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 the_excerpt(); ?>

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

7行目:<?php endforeach; ?>

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

8行目:<?php wp_reset_postdata(); ?>

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

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

以上が解説です。

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です