文中の説明画像をクリックすると拡大します。
WordPressのループって何?
プログラミング言語には「ループ」と呼ばれる制御構造があります。ループとは特定の条件の元で同じような処理を繰り返すことをいいます。
WordPressにおけるループとは、WordPressの管理画面で作成したページのコンテンツ(投稿や固定ページ)の中身を呼び出すために使われます。
WordPressは、特定のカテゴリーやタグに所属する記事一覧を表示させることができますが、この時にループを使って、記事を1件ずつ表示させることができます。
記事の詳細ページではループは1回しか実行されませんが、その1回のループで記事の詳細のデータを表示させています。
このように、WordPressの管理画面で作成した記事や固定ページのコンテンツは、全てループを使って表示させることになります。
WordPressで操作するループには、「メインループ」と「サブループ」の2種類があります。
WordPressのメインループとサブループ
WordPressでは、ブログの記事(投稿やカスタム投稿)や固定ページを作成することができますが、それをどのようにブラウザで表示させているのでしょうか。
例えば、固定ページで「お問い合わせ」のページを作ったとします。
ここで、パーマリンクの設定を「http://localhost/wptest/wp/contact/」に設定したことにします。(実際に設定できるのは「contact」の部分だけです)
このパーマリンク(URL)にブラウザでアクセスすると、以下のようなページが表示されるはずです。(テーマによってデザインは変わってきます)
ここまでは、当たり前の動作だと思われるかもしれません。つまり「お問い合わせ」のページにアクセスしたら、「お問い合わせ」のページの中身が表示されたという結果です。
このように管理画面で作成したページにアクセスしたら、「そのURLに応じたページ」を表示させる、という仕組みをWordPressの「メインループ」といいます。WordPressにおいて、メインループを使って表示させるデータは、全てURLに依存しています。
「お問い合わせ」のページにアクセスしたら「お問い合わせ」のページを表示させる。「お知らせカテゴリー」にアクセスしたら、「お知らせカテゴリー」に所属している記事の一覧を表示させる。
言い換えると、アクセスしたURLに応じて「最も相応しい内容」を表示させるための仕組みが「メインループ」という事ができます。
しかし、場合によってはメインループで表示させるデータとは違うデータを表示させたい時もあるかもしれません。
例えば「オレンジのカテゴリー」ページに「リンゴのカテゴリーに所属する記事の一覧」を表示させたり、投稿の詳細ページに、記事の詳細の下に「その記事が所属しているカテゴリーの記事の一覧」を表示させたりなど、メインループで表示されるデータとは無関係に、自分が表示させたいと思うデータを表示させる方法が、「サブループ」です。
WordPressでサブループを作るためには、表示させたいデータの条件を自分で組み立てる必要があります。サブループを作るための方法をいくつかあるのですが、最も汎用性の高い方法が、「WP_Query」を使う方法です。
サブループを作る「WP_Query」
サブループを使って条件をカスタマイズしたループを作る方法を、紹介します。
【PHP】
<?php $args = array( 'post_type' => 'post', 'posts_per_page' => -1 ); $the_query = new WP_Query($args); if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); // ここにループの中の処理を書く endwhile; endif; wp_reset_postdata(); ?>
WP_Queryを使ってサブループを作る方法は、このようになります。「$args = array(~~)」箇所でサブループに与える条件を連想配列で指定します。ここでは、
- 投稿タイプ→通常の投稿
- 1ページ当たりに表示する記事数→全記事
という条件を与えています。「’posts_per_page’ => -1」という指定は、マイナス1を指定していますが、このように書くと、1ページに全記事を表示させることができます。
「$the_query = new WP_Query($args);」の箇所で、指定した条件を与えたサブループを作成しています。サブループを作るPHPの構文は少し難しいのですが、ここらへんはたいていコピー&ペーストで済ますことができます。
また、サブループはメインループと違い、ループの終わりにクエリをリセットする必要があります。
そのため endwhile(ループの終わり)の後にwp_reset_postdata(ページ送り関数)を追加してクエリをリセットし、直前のクエリを復元します。
重要なのは、サブループに対して与える条件の指定方法です。つまり、この例で言うと、$argsにどのような条件を与えるのか、という点です。
サブループに与える条件の種類は、とてもたくさんあり、かなり柔軟にカスタマイズできます。詳しい説明は、WordPress Codex日本語版にある「関数リファレンス/WP Query」をご覧ください。
メインループを書き換える「pre_get_posts」
サブループを使って、自分で好きなデータを表示させる方法について、紹介しました。サブループを使う事で、好きなデータを取得することができます。
さらにWordPressでは、「メインループを書き換える」ということも可能です。それが「pre_get_posts」を使う方法です。
メインループを書き換えるのは一体どんな時なのかですが、例えば「検索結果の一覧ページでは1ページ当たり10記事表示させる」が「カテゴリーアーカイブの場合は1ぺージあたり5記事だけ表示させる」。例えば「検索結果の一覧は、特定のカスタム投稿タイプのみを対象にさせる」など、記事一覧にしても一覧ごとに異なる条件で表示したい場合、などです。
表示させる条件としては、「ほとんどメインループのままでいいのだけど、一部だけ条件を変更したい」といった時にメインループを書き換える方法を取ります。このための方法が「pre_get_posts」を使う方法です。
それでは、具体的にpre_get_postsを使ってメインループを書き換える方法を紹介します。ここでは、以下の条件でメインループを書き換えます。
- 書き換えるメインループ:検索結果一覧
- 指定するカスタム投稿タイプ:items
- 1ページに表示させる記事数:20件
【PHP】
function my_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_search() ) { $query->set('post_type', 'items'); $query->set('posts_per_page', 20); } } add_action('pre_get_posts','my_pre_get_posts');
このコードを、テーマフォルダにある「functions.php」に追加します。
この仕組みは「アクションフック」と呼ばれ、WordPressが標準で用意している機能を、開発者がカスタマイズしたい時に使う機能です。
今回は、WordPressにもともとあった「pre_get_posts」という機能に対して、自分で作った「my_pre_get_posts」というオリジナルの処理を付け加えるようなイメージです。
今回紹介したメインループとサブループの話は、WordPressでオリジナルのテーマやプラグインを開発する場面で、非常に重要な知識となります。
特にサブループを使いこなすことができれば、市販のテーマではサポートしていないようなカスタマイズも思うようにできるようになります。WordPressで思い通りのカスタマイズをするために、メインループとサブループの話はぜひ身につけたい技術の一つなのです。
まとめ
- WordPressのループには、メインループとサブループがある。
- サブループを作るためには、「WP_Query」を使う。
- メインループを書き換えるためには、「pre_get_posts」を使う。