ループの使い方とリファレンス
2020/04/25
WrodPressのループ処理
メインループについて
[fusion_builder_container hundred_percent=”yes” overflow=”visible”][fusion_builder_row][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]
WordPressのメインループとは、メインコンテンツに表示している繰り返し処理のことです。
投稿ページでは、メインコンテンツに新着順でリストが表示。カテゴリーアーカイブでは、指定したカテゴリーのリストが表示されますよね。
これが、ループ処理です。
メインループの繰返す条件を決めるには、pre_get_postsを使用します。
※query_posts()は、非推奨になりました。公式でも以下のように記載してあります。
query_posts() はページ内のメインクエリーを書き換え、新しいクエリーのインスタンスと置き換えるために使う関数としては過度に単純化され、問題が発生しやすい方法です。– WordPress Codex 日本語版 (ja)
ひとことで言うと、query_posts() は決して使うべきではありません。
query_postsをテンプレートで使用する場合、WordPressはすでにデータベースへの問い合わせを実行し、テンプレートを読み込む頃にはデータの取り出しを終えています。そのため、query_posts()を使ってデフォルトのクエリーを上書きして結果を得るには、どうしても再度データベースに問い合わせし再計算する必要があります。
つまり、レスポンスが落ち、不具合が出る可能性もあるのでfunction.phpから書き換える(pre_get_posts)か、新しいクエリを作成(WP_Query)してください。ということのようです。
サブループについて
[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]
対してサブループとは、サイドバーなどにある「最近の投稿」や、プラグインによる「人気順の記事」などのリストのことです。メインループに影響を与えないように新しいクエリオブジェクトを生成して、繰り返し処理を行っています。
サブループの繰返す条件を決めるには、WP_Query()を使用します。
「pre_get_posts」「WP_Query」の使い分け
- pre_get_posts:1ページに一つだけ存在するメインクエリにアクションフックでフィルターをかける為、レスポンスに影響しない+不具合が生じない。
- WP_Query:メインクエリとは別にクエリを新しく作成します。複数の配置が可能。不具合が生じないが、レスポンスではpre_get_postsに劣る。
「pre_get_posts」「WP_Query」レスポンスを検証
[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]
上の画像が「pre_get_posts」を使用したトップページ、
下の画像が「WP_Query」で使用した固定ページ。
内容は全く同じで10件ほどカテゴリーを絞った記事を表示させました。
[/fusion_builder_column][fusion_builder_column type=”1_1″ background_position=”left top” background_color=”” border_size=”” border_color=”” border_style=”solid” spacing=”yes” background_image=”” background_repeat=”no-repeat” padding=”” margin_top=”0px” margin_bottom=”0px” class=”” id=”” animation_type=”” animation_speed=”0.3″ animation_direction=”left” hide_on_mobile=”no” center_content=”no” min_height=”none”]
表示速度が遅いのは気にしないでください。最適化してないんです。(評価Eってお前)
この結果、少数の記事で違いが出るほどの顕著な差は見られませんでした。
ということで、複数の配置が可能な「WP_Query」の方が柔軟性があり、いい気がしてしまいます。
メインループのリファレンス
pre_get_postsアクションは固定ページのリクエストでは動作しません。
つまり、フロントページを設定すると固定ページとなり、pre_get_postsは使用できません。トップページ内メインコンテンツに複数のループを登場させたい場合は、WP_Queryの一択となります。
メインループの表示条件を指定する引数
メインループの繰り返し条件を決める場合、function.phpへ記述します(pre_get_posts)。
function query_at_home( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_home() ) { $query->set( '引数', '値' ); return; } } add_action( 'pre_get_posts', 'query_at_home' );
-
カテゴリー引数
カテゴリーによるフィルターをかけて、繰り返しのルールを変更します。複数の指定する場合は、カンマ(,)で区切ります。$query->set( 'category_name', 'xxx,xxx' ); //カテゴリーでの絞り込み(スラッグ名で指定)
↑カテゴリーで決めた任意のスラッグ名を指定する方法です。コードを見た際に、分かりやすいのがメリットですが、スラッグを変更すると表示されなくなるので、注意が必要です。
$query->set( 'cat', '3,8' ); //カテゴリーでの絞り込み(IDで指定)
↑カテゴリーのIDを指定する方法です。変更されることのないユニークIDなので安心ですが、コードで見た際に分かりにくい。
$query->set( 'cat', '-3,-8' ); //特定カテゴリーの除外(IDで指定)
↑除外するカテゴリーのIDを指定する方法です。IDの前にマイナス(-)を付けます。
-
タグ引数
タグによるフィルターをかけて、繰り返しのルールを変更します。使用方法はカテゴリー引数と同じですので、説明は省略します。$query->set( 'tag', 'xxx,xxx' ); //タグでの絞り込み(スラッグ名で指定)
$query->set( 'tag_id', '3,8' ); //タグでの絞り込み(IDで指定)
-
投稿者引数
投稿者によるフィルターをかけて、繰り返しのルールを変更します。使用方法はカテゴリー引数と同じですので、説明は省略します。$query->set( 'author_name', 'xxx,xxx' ); //タグでの絞り込み(スラッグ名で指定)
$query->set( 'author', '3,8' ); //タグでの絞り込み(IDで指定)
$query->set( 'author', '-3,-8' ); //特定タグの除外(IDで指定)
-
投稿・固定ページ引数
投稿・固定ページの指定、繰り返しのルールを変更します。使いそうな引数のみ記載します。$query->set( 'author', '-3,-8' ); //投稿タイプでの絞り込み(文字列で指定)
↑標準では投稿の「post」が指定されていて、これを変更できます。例えば、「page」なら固定ページ、任意のカスタム投稿タイプも文字列で指定できます。
$query->set( 'p', '7' ); //投稿ページでの絞り込み(IDで指定)
↑投稿ページをIDで指定します。
$query->set( 'page_id', '7' ); //固定ページでの絞り込み(IDで指定)
↑固定ページをIDで指定します。
$query->set( 'name', 'xxx' ); //投稿ページでの絞り込み(スラッグ名で指定)
↑投稿ページをスラッグ名で指定します。
$query->set( 'pagename', 'xxx' ); //固定ページでの絞り込み(スラッグ名で指定)
↑固定ページをスラッグ名で指定します。
$query->set( 'post_parent', '93' ); //親ページでの絞り込み(スラッグ名で指定)
↑指定したIDを親とする子ページをすべて表示する。
-
ページ送り引数
表示数の繰り返しのルールを変更します。$query->set( 'posts_per_page', '10' ); //表示数の制限
↑表示する投稿数を指定します。
メインループの開始と終了
ページにある既存のループにフィルターをかける為、記述はfunction.phpのみです。
サブループのリファレンス
サブループの表示条件を指定する引数
サブループ処理に入る前に、繰り返し条件を決める場合、先ほど紹介したWP_Queryを使用します。使いそうな引数をまとめました。
-
カテゴリー引数
カテゴリーによるフィルターをかけて、繰り返しのルールを変更します。複数の指定する場合は、カンマ(,)で区切ります。//カテゴリーでの絞り込み(スラッグ名で指定)
↑カテゴリーで決めた任意のスラッグ名を指定する方法です。コードを見た際に、分かりやすいのがメリットですが、スラッグを変更すると表示されなくなるので、注意が必要です。
//カテゴリーでの絞り込み(IDで指定)
↑カテゴリーのIDを指定する方法です。変更されることのないユニークIDなので安心ですが、コードで見た際に分かりにくい。
//特定カテゴリーの除外(IDで指定)
↑除外するカテゴリーのIDを指定する方法です。IDの前にマイナス(-)を付けます。
array( 3,8 ) ) ); ?> //複数カテゴリーを含む投稿(IDで指定)
↑複数カテゴリーの両方を持つ投稿を指定する方法です。3と8のカテゴリー両方に該当する記事のみが表示されます。
-
タグ引数
タグによるフィルターをかけて、繰り返しのルールを変更します。使用方法はカテゴリー引数と同じですので、説明は省略します。//タグでの絞り込み(スラッグ名で指定)
//タグでの絞り込み(IDで指定)
array( 3,8 ) ) ); ?> //複数タグを含む投稿(IDで指定)
-
投稿者引数
投稿者によるフィルターをかけて、繰り返しのルールを変更します。使用方法はカテゴリー引数と同じですので、説明は省略します。//タグでの絞り込み(スラッグ名で指定)
//タグでの絞り込み(IDで指定)
//特定タグの除外(IDで指定)
-
投稿・固定ページ引数
投稿・固定ページの指定、繰り返しのルールを変更します。使いそうな引数のみ記載します。//投稿タイプでの絞り込み(文字列で指定)
↑標準では投稿の「post」が指定されていて、これを変更できます。例えば、「page」なら固定ページ、任意のカスタム投稿タイプも文字列で指定できます。
//投稿ページでの絞り込み(IDで指定)
↑投稿ページをIDで指定します。
//固定ページでの絞り込み(IDで指定)
↑固定ページをIDで指定します。
//投稿ページでの絞り込み(スラッグ名で指定)
↑投稿ページをスラッグ名で指定します。
//固定ページでの絞り込み(スラッグ名で指定)
↑固定ページをスラッグ名で指定します。
//親ページでの絞り込み(スラッグ名で指定)
↑指定したIDを親とする子ページをすべて表示する。
-
ページ送り引数
表示数の繰り返しのルールを変更します。//表示数の制限
↑表示する投稿数を指定します。
//表示数の制限とスキップ数
↑表示する投稿数とスキップする数を指定します。
//表示数の制限とランダム
↑表示する投稿数とランダム表示を指定します。
複数の引数を組み合わせて使用する場合は、アンド(&)で区切って記述します。
//カテゴリの指定+表示数の制限+ランダム
サブループの開始と終了
紹介したWP_Query(引数)を記述した後、ループ処理を開始します。
have_posts() ) : while ( $query1->have_posts() ) : $query1->the_post(); ?>
↑ループの開始
ループ内に呼び出すテンプレートタグを記述します。例えば、
↑ループの終了
ループ内部のテンプレートタグ
使いそうなテンプレートタグのリファレンス。
-
投稿のタイトル:タイトルの文字を出力。
-
投稿の本文:本文の文字を出力。
-
投稿のアイキャッチ画像:アイキャッチ画像がある場合に表示。
-
投稿の日付:日付を出力。
-
投稿のカテゴリー:カテゴリーアーカイブへのリンクをulリストで表示。
↓区切り文字を入れることで、つなげて出力できます。
-
投稿のタグ:「タグ:」の後に「,」で区切ったタグアーカイブへのリンクを表示。
-
投稿へのリンクURL:投稿へのURLを出力。
まとめ
query_posts()は、使うと不具合がでる可能性があり、レスポンスも悪いので使わないようにしましょうということでした。
fuction.phpに記述する「pre_get_posts」は、取っつきにくいですが、最良の方法のようです。「WP_Query」は、レスポンスでは劣るようですが、気にならない程度なので、コチラを使うのも良いと思いました。
[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]