WP_Queryでサブループを作成する例|パラメータの設定など【WordPress】
WordPressでサイトを作成していると、メインループとは違った条件のループ(サブループ)を作成したい場合があると思います。
今回は、WP_Queryを使用してサブループを作成するソースコードの例と、WP_Queryの主なパラメータの紹介となります。
サブループを作成する際には、get_posts関数を使用する場合もあります。違いとしては、WP_Query使用する場合では、メソッド(have_posts、the_post、next_postなど)を使用し、投稿データを扱うことができます。その他、投稿を取得するパラメータが違う場合もあります。
get_posts関数については、以下を参考にしてみてください。
WP_Query を使用したサブループの例
下記ソースコードがWP_Queryを使用したサブループの例となり、サブループを出力したい箇所に記述します。
<ul>
<?php
// WP_Queryのパラメータを指定
$args = array(
// 記事を3件表示
'posts_per_page' => 3,
// 記事をランダムで表示
'orderby' => 'rand',
// 記事の先頭固定表示なし
'ignore_sticky_posts' => true
);
// WP_Queryのオブジェクト(インスタンス)を作成
$query = new WP_Query( $args );
// ループ開始
while ( $query->have_posts() ) :
// サブループの投稿データをセット
$query->the_post();
?>
<li>
<a href="<?php the_permalink(); ?>">
<h2><?php the_title(); ?></h2>
<?php the_content(); ?>
</a>
</li>
<?php
endwhile;
// ループ終了
// メインクエリの投稿データに戻す
wp_reset_postdata();
?>
</ul>
WP_Queryのコードの説明
上記、WP_Queryのコードのポイントとなる箇所となります。
WP_Query
WP_Queryは、パラメータで指定した投稿やページのデータを取得できるクラスとなります。
例のコードでは3行目からの箇所で、サブループを作成するために、WP_Queryのインスタンスを作成しパラメーターで指定しています。
指定したパラメータでは、投稿記事を3件表示し、表示順はランダムとしています。そして、デフォルトでは記事の先頭固定表示は使用する設定となっているので、使用しない設定としています。
the_post()
the_postメソッドは、ループ内にて次の投稿データを取得し、グローバル変数「$post」にセットします。それにより、投稿データを表示する関数(the_title、 the_contentなど )を使用して、投稿データを表示できます。
例のコードでは18行目の箇所で、the_postメソッドで、メインクエリのグローバル変数「$post 」を変更し、サブループの投稿データをセットしています。
wp_reset_postdata()
wp_reset_postdata関数は、グローバル変数にセットされているサブループの投稿データを、メインクエリの投稿データに戻します。それにより、以降メインループで使用するメインクエリの投稿データを利用できます。
例のコードでは31行目の箇所となります。
WP_Queryの主なパラメータ
以下は、WP_Queryで指定できる主なパラメータの例となります。
表示・順序関連
表示・順序関連のパラメータの例です。
<?php
$args = array(
// 1ページに表示する記事の件数
'posts_per_page' => 5,
// ソート順の対象。date、category、title、randなどで指定
'orderby' => 'date',
// ソート順。ASC(昇順)かDESC(降順)で指定
'order' => 'DESC'
);
$query = new WP_Query( $args );
?>
投稿・ページ関連
投稿・ページ関連のパラメータの例です。
<?php
$args = array(
// 指定したページのタイプ。post、pageなど
'post_type' => 'post',
// 指定した投稿の状態。publish、draftなど。
'post_status' => 'publish',
// 指定した投稿ID
'p' => 33,
// 指定した投稿スラッグ
'name' => 'hello-world',
// 配列で指定した投稿ID
'post__in' => array(1,2,3),
// 除外する投稿IDを配列で指定
'post__not_in' => array(1,2,3),
);
$query = new WP_Query( $args );
?>
post_statusについて|ユーザーがログイン中の場合
投稿の状態を指定する上記'post_status'のデフォルト値は 'publish'(公開) ですが、ユーザーがログイン中の場合、'private' (非公開)も追加されます。
また、管理画面からの呼び出しの場合、保護状態のステータス('future', 'draft' , 'pending')も追加されます。
post__in・post__not_inについて
'post__in'と'post__not_in'は、同じクエリでは使用できません。
カテゴリー関連
カテゴリー関連のパラメータ例です。
<?php
$args = array(
// 指定したカテゴリーIDをもつ投稿。(複数の場合は , で区切る)
'cat' => '5',
//指定したカテゴリーIDのいずれかを持つ投稿
'category__in' => array( 2, 16 ),
//指定したカテゴリーIDの全てを持つ投稿
'category__and' => array( 15, 22 ),
//指定したカテゴリーIDを持つ投稿を除外
'category__not_in' => array( 8, 20 ),
//指定したカテゴリースラッグのいずれかを持つ投稿
'category_name' => 'staff, news',
//指定したカテゴリースラッグの全てを持つ投稿
'category_name' => 'web+book',
);
$query = new WP_Query( $args );
?>
catについて|除外するカテゴリーを指定する場合
上記'cat'ではカテゴリーIDを指定し、そのカテゴリーをもつ投稿を取得できますが、カテゴリーIDに - を付けて指定すると、除外するカテゴリーを指定できます。
タグ関連
タグ関連のパラメータの例です。
<?php
$args = array(
// 指定したタグIDをもつ投稿。
'tag_id' => 5,
//指定したタグIDのいずれかを持つ投稿
'tag__in' => array( 2, 6 ),
//指定したタグIDの全てを持つ投稿
'tag__and' => array( 15, 22 ),
//指定したタグIDを持つ投稿を除外
'tag__not_in' => array( 8, 20 ),
//指定したタグスラッグのいずれかを持つ投稿
'tag' => 'bread, baking',
//指定したタグスラッグの全てを持つ投稿
'tag' => 'cooking+recipe',
);
$query = new WP_Query( $args );
?>
カスタムフィールド関連
カスタムフィールド関連のパラメータの例です。
<?php
$args = array(
// 指定したカスタムフィールドのキー名を持つ投稿
'meta_key' => 'color',
// 指定したカスタムフィールドの文字列の値を持つ投稿
'meta_value' => 'red',
// 指定したカスタムフィールドの数値の値を持つ投稿
'meta_value_num' => '22',
// meta_value の値に対する演算子。指定できる値は以下となります。
// '='(デフォルト), '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE'
'meta_compare' => '=',
);
$query = new WP_Query( $args );
?>
パラメータmeta_queryの例
その他のカスタムフィールド関連のパラメータとして、meta_queryがあります。meta_queryでは複雑な条件での指定が可能となります。
<?php
$args = array(
// カスタムフィールドの条件を配列で指定
'meta_query' => array(
// 2つ以上の配列がある場合の論理的な関係。指定できる値は 'AND'か'OR'
'relation' => 'AND',
array(
// 指定したカスタムフィールドのキー名を持つ投稿
'key' => 'color',
// 指定したカスタムフィールドの文字列の値を持つ投稿
'value' => 'blue',
// meta_value の値に対する演算子。指定できる値は以下となります。
// '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE'
'compare' => 'NOT LIKE',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
?>
タクソノミー関連
タクソノミー関連のパラメータの例です。
<?php
$args = array(
// ポストタイプを指定
'post_type' => 'post',
// タクソノミーの条件を配列で指定
'tax_query' => array(
// 2つ以上のタクソノミーを指定する場合の論理的な関係。指定できる値は 'AND'か 'OR'
'relation' => 'AND',
array(
// タクソノミーを指定
'taxonomy' => 'actor',
// パラメータtermsで使用する種類を指定。指定できる値は 'term_id'(デフォルト), 'name', 'slug'
'field' => 'term_id',
// タームを指定(パラメータfieldで指定した種類で指定)
'terms' => array( 103, 115, 206 ),
// 階層構造を持もつタクソノミーの場合、子タクソノミーを含めるかを判断。含める場合はtrue(デフォルト)
'include_children' => true,
// 演算子。指定できる値は 'IN'(デフォルト), 'NOT IN', 'AND', 'EXISTS' (4.1.0以降) と 'NOT EXISTS'(4.1.0以降)
'operator' => 'NOT IN',
),
array(
'taxonomy' => 'movie_genre',
'field' => 'slug',
'terms' => array( 'action', 'comedy' ),
),
),
);
$query = new WP_Query( $args );
?>
固定ページ関連
固定ページ関連のパラメータの例です。
<?php
$args = array(
// 指定したページのタイプを取得。post、pageなど
'post_type' => 'page',
// 指定した固定ページIDのページ
'page_id' => 11,
// 指定した固定ページのスラッグのページ
'pagename' => 'sample-page',
// 指定した子ページ(スラッシュで区切られた親ページと子ページのスラッグで指定)
'pagename' => 'contact_us/canada',
);
$query = new WP_Query( $args );
?>
今回、紹介した関数やパラメータなどの詳細は、以下の参考サイト・書籍を確認してみてください。