WordPressでよく使われるwhileループ
WordPressで使われるループforeachについては前回で書きましたが、今回はwhileループについて調べてみました。
ちなみにforeachのまとめはこちら。

WordPressでよく使われるループである「foreach」ですが、今までなんとなくモヤモヤしたまま使っていましたが、ここは基本に立ち返っ...
まずWordPressで記事を出力する基本的な型はこうなります。
1 2 3 4 5 6 7 |
<?php if( have_posts() ) : while( have_posts() ): the_post(); the_content(); endwhile; endif; ?> |
基本構文を分解する
まずif( have_post() ):で投稿記事の有無を確認した後にwhlieループに入ります。
1 2 3 |
if( have_posts() ) : <-- ループ処理 --> endif; |
have_post()はwhile文にも入ってくるのですが、とりあえず「記事の有無を確認する」とだけ捉えておきましょう。
whileループ
1 2 3 |
while( have_posts() ): the_post(); <-- 表示内容 --> endwhile; |
whileループの解釈はシンプルで「括弧内に書いた条件が満たされる場合に処理を進める」というものです。
括弧内に書かれているhave_posts()は前述した通りなので、 while(have_post) = 記事の有無を確認して、あるならばループ処理を行う という意味になります。
そしてさらにthe_post()という謎の関数が出てきました。こちらは「ループ内で引用する投稿データを用意する」という感じです。
まとめるとこんな感じ
こうやって日本語の文章に置き換えればwhileループ処理は理解しやすいんじゃないのでしょうか。
尚、have_posts()とthe_postの解説はコチラ

have_posts()関数で行われる処理。関数とは「どこかから値または配列を持ってきて何かしらの処理をする」ものなので、もちろんhave_...
サブループの基本構文
ループにはテンプレートにあわせて出力される部分的なデータの入った$wp_queryを使わないで、サブループという新たに全てのデータの入った$wp_queryから条件分けして格納したもうひとつの変数を使用したループを作ることができます。
「web」のタイトルを10件表示させる例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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を使用したものもあるので興味のある方は調べてみてください。
まとめ
ということで、今までただの決まり事というだけだったwhileループ処理と用例を「いくらか」紐解いてみました。
wordpressを始めてまず最初に目にするループといっても過言ではない構文ですが、それがどういう意味を持っているのかを知ることは大事なことですし、自分で書いたコードが意図通りに動いた喜びは先に進むきっかけにもなると思いますので、拙い知識と文章ですが是非参考にしてみてください。
この記事に関連する記事

WordPressでよく使われるループである「foreach」ですが、今までなんとなくモヤモヤしたまま使っていましたが、ここは基本に立ち返っ...

have_posts()関数で行われる処理。関数とは「どこかから値または配列を持ってきて何かしらの処理をする」ものなので、もちろんhave_...
ありがとうございます。とても良い記事に感謝です。参考にさせて頂きました。
あと、post-typeではなくて、post_typeかもしれません。
コメントありがとうございます。
参考にになったようで何よりです!
あと、ご指摘ありがとうござます。
post_typeでしたね…早速修正しておきました。