8月18日(日)にWordBench神戸で「第25回 WordBench神戸 - WordPressのPHPを学ぼう:超初級 –」が開催されました。
最後のディスカッションの部分でさらに初心者向けに「foreach」の解説をさせて頂いたので共有しておきます。
目次
- 1 foreachのループ内の処理がイマイチ理解できない
- 2 解説
- 2.1 1行目:<?php $my_posts = get_posts(“cat=8&posts_per_page=-1”); ?>
- 2.2 2行目:<?php foreach($my_posts as $post): setup_postdata($post); ?>
- 2.3 4行目:<h1><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h1>
- 2.4 5行目:<?php the_excerpt(); ?>
- 2.5 7行目:<?php endforeach; ?>
- 2.6 8行目:<?php wp_reset_postdata(); ?>
foreachのループ内の処理がイマイチ理解できない
ディスカッションで頂いた質問内容です。
foreachを使って取得した記事をグルグルループしながら記事のタイトルなどを出力すれば良いのは、なんとなく理解されているみたいです。
でも具体的に中に書かれているコードがイマイチ理解できないとのことでした。
WordPressのテーマテンプレート内でforeachの処理を見るのは新しく記事一覧を取得する時、要は「get_posts」をした後の処理に見ることが多いと思います。こんな処理です。
<?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(); ?>
では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で簡単に使えるPHP
ピンバック: イタグレ服屋+α
ピンバック: WordPressの記事取得で良く見るforeach(ループ処理)について解説 - Dreamテスト環境
ピンバック: foreachで記事を取得している時に、記事がなかった場合の処理も指定したい | めもたんWordpress