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で表示したい内容をうまく表示できるようになりますので、是非使い方をマスターしてください^^
コメント
コメント一覧 (5件)
[…] 、コチラのブログで凄まじく分り易く解説されています。 ht79.info:WordPressの記事取得で良く見るforeach(ループ処理)について解説 本当に理解している人が書けばこんなに分り易くなるの […]
[…] ※ループ処理、foreach → endforeach がポイントらしい。(謎) https://ht79.info/2019/2013/08/19/wordpress-foreach/ […]
[…] WordPressの記事取得で良く見るforeach(ループ処理)について解説 […]
[…] WordPressの記事取得で良く見るforeach(ループ処理)について解説 – ht79.info […]
理解してるつもりだったから助かりました。