WordPressで使われるループforeachについては前回で書きましたが、今回はwhileループについて調べてみました。
ちなみにforeachのまとめはこちら。
まずWordPressで記事を出力する基本的な型はこうなります。
<?php
if( have_posts() ) :
while( have_posts() ): the_post();
the_content();
endwhile;
endif;
?>
基本構文を分解する
まずif( have_post() ):で投稿記事の有無を確認した後にwhlieループに入ります。
if( have_posts() ) :
<-- ループ処理 -->
endif;
have_post()はwhile文にも入ってくるのですが、とりあえず「記事の有無を確認する」とだけ捉えておきましょう。
whileループ
while( have_posts() ): the_post();
<-- 表示内容 -->
endwhile;
whileループの解釈はシンプルで「括弧内に書いた条件が満たされる場合に処理を進める」というものです。
括弧内に書かれているhave_posts()は前述した通りなので、 while(have_post) = 記事の有無を確認して、あるならばループ処理を行う という意味になります。
そしてさらにthe_post()という謎の関数が出てきました。こちらは「ループ内で引用する投稿データを用意する」という感じです。
まとめるとこんな感じ
こうやって日本語の文章に置き換えればwhileループ処理は理解しやすいんじゃないのでしょうか。
尚、have_posts()とthe_postの解説はコチラ
サブループの基本構文
ループにはテンプレートにあわせて出力される部分的なデータの入った$wp_queryを使わないで、サブループという新たに全てのデータの入った$wp_queryから条件分けして格納したもうひとつの変数を使用したループを作ることができます。
「web」のタイトルを10件表示させる例
<?php
$args = array(
'category_name' => 'web',
'posts_per_page' => 10,
);
$my_query = new WP_Query($args);
if($my_query -> have_posts()) :
While ($my_query->have_posts()) : $my_query->the_post();
?>
<!--?php the_title(); ?-->
<?php
Endwhile;
endif;
?>
<?php wp_reset_postdata(); ?>
今回は$my_queryという変数に代入しましたが、代入する変数名は任意のものを使用できます。
if構文とwhile構文に使われているhave_posts()の部分、記事データのthe_post()にも、本来そのページが持っている$wp_queryからじゃなく$my_queryから参照するように指示してあります。
メインループに影響を与えないよう、最後にwp_reset_postdata()で投稿データをリセットすれば完了です。
ほぼ通常のwhileループと同じ書き方なのでラクチンです!
ちなみにpre_get_postsやget_postsを使用したものもあるので興味のある方は調べてみてください。
余談ですが古い書籍などでループの用例で使われていますがquery_posts() は現在非推奨になっていますのでやめたほうがいいでしょう。
まとめ
ということで、今までただの決まり事というだけだったwhileループ処理と用例を「いくらか」紐解いてみました。
wordpressを始めてまず最初に目にするループといっても過言ではない構文ですが、それがどういう意味を持っているのかを知ることは大事なことですし、自分で書いたコードが意図通りに動いた喜びは先に進むきっかけにもなると思いますので、拙い知識と文章ですが是非参考にしてみてください。
while(have_post) : the_post(); = 記事の有無を確認して、あるならばループ内で引用する投稿データを用意してループ処理を行う