NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2016.11.04
#13
バックエンドへの道

WP_Queryを使って、記事を自在に取得してくる方法

ヤスタカ

こんにちは。長野オフィスでバックエンドエンジニアをやっているヤスタカです。

野尻湖の夜は気温がもう0度になることがあり、こたつから出られません。そしてそのままこたつで寝てしまう……という季節がやってきましたね。

LIGでCMSのWebサイトを作るときはwordpressを使用することが多いのですが、記事の一覧を表示することってよくありますよね。そんなとき、ある条件に合致する記事だけを表示させたいということがよくあるかと思います。

今回はWP_Queryを使って、いろんな条件指定した記事一覧の取得方法を見ていきたいと思います。

まず、いちばんオーソドックスな記事の取得方法から。

$news_args = array(
    'post_status' => 'publish',
    'posts_per_page' => 6,
    'orderby' => 'post_date',
    'order' => 'DESC',
 );

$news_query = new WP_Query($news_args);

WP-Queryインスタンスを作成すると、$postsなどの中身が条件指定した内容に書き換わります。
WordPressの基本的な記事一覧表示方法が下記のような形だと思うのですが、「1ページの投稿が6件」、「記事が公開のもののみ」、「記事の並び順は投稿日順の降順」という条件を指定しています。

この辺はなんの問題もないですよね。

続いて、特定のカテゴリー分類に所属する記事のみ取得という条件を付け加えてみましょう。

記事取得条件を指定

まずは記事の取得条件の指定方法について見ていきましょう! さまざまな条件に合致する記事を自在に取ってこれるようになるはず!

カテゴリーの指定

カテゴリーを指定するには、「カテゴリー名で指定する方法」「カテゴリーIDで指定する方法」の 2 つに大別されます。
カテゴリー名で指定する場合は、さきほどの$news_argsの配列にこんな条件を加えてあげます。

category_name => array('category_name1', 'category_name2')

などのように指定します。

IDで指定する場合、cat, category_and, category_in, category_not_in という指定方法があり、catはカテゴリーIDを指定して、特定のカテゴリーのみ取得できます。
こんな風に使います。

cat => '3' // 指定したカテゴリーの記事を取得 -1とすることで、そのカテゴリーの記事を除外することも可能
category_and => array(1, 2, 3) // 複数カテゴリーに所属する記事を取得 AND条件
category_in => array(1, 2, 3) // 指定したカテゴリーのどれかに所属する記事を取得
category_not_in => array(1, 2, 3) // 指定したカテゴリーの記事を除外

タグの指定

タグの指定はカテゴリーの指定とほぼ同じで、

例)
tag (文字列) - タグのスラッグを指定。
tag_id (整数) - タグ ID を指定。
tag__and (配列) - タグ ID を指定。
tag__in (配列) - タグ ID を指定。
tag__not_in (配列) - タグ ID を指定。
tag_slug__and (配列) - タグのスラッグを指定。
tag_slug__in (配列) - タグのスラッグを指定。

という指定で記事を取得できます。内容はカテゴリーのときの条件を見たら、ほぼ想像つきますよね?
よって説明は省略!!

タクソノミーの指定

続いてはタクソノミーです。カテゴリーやタグ以外に自分でカテゴリー分けを作成できるカスタムタクソノミーを作り、それを使って記事の取得条件を指定したい場合はこんなふうに書きます。

$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'people',
			'field'    => 'slug',
			'terms'    => 'bob',
		),
	),
);

タクソノミーを指定する場合は、tax_queryというキーの名前を指定し、そのなかの配列に条件を追加していきます。
上記の場合は、peopleというカスタムタクソノミーのスラッグ名がbobという記事を取得してくる条件が書かれています。
もし複数のカスタムタクソノミーの条件を指定したい場合は、

'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'movie_genre',
			'field'    => 'slug',
			'terms'    => array( 'action', 'comedy' ),
		),
		array(
			'taxonomy' => 'actor',
			'field'    => 'term_id',
			'terms'    => array( 103, 115, 206 ),
			'operator' => 'NOT IN',
		),
	),

というように、relationというキーにAND条件かOR条件かを指定してあげて、複数配列を渡しましょう。これによって 2 つ以上のタクソノミーの条件を指定できます。

投稿タイプの指定

投稿タイプの指定は、

'post_type' => 'page'

のように指定します。指定できる値は、

'post' - 投稿。 カスタム投稿の場合はそのカスタム投稿のスラッグ名
'page' - 固定ページ。
'revision' - 履歴 (リビジョン) 。
'attachment' - 添付ファイル。
'nav_menu_item' - ナビゲーションメニュー項目。
'any' //すべての記事を取得

です。また複数の投稿タイプを取得したい場合は、配列で渡してあげることにより取得できます。

'post_type' => array( 'post', 'page', 'movie', 'book' )

ポストステータスのパラメータ

ポストステータスを条件に記事を取得する場合は、post_statusというキーを使って、

post_status => 'publish'

のように指定します。

指定できる値は以下のとおり。

'publish' - 公開された投稿もしくは固定ページ
'pending' - レビュー待ちの投稿
'draft' - 下書きの投稿
'auto-draft' - コンテンツのない、新規作成された投稿
'future' - 予約公開設定された投稿
'private' - ログインしていないユーザーから見えない設定
'inherit' - リビジョン。 get_childrenを見てください。
'trash' - ゴミ箱に入った投稿。 (Version 2.9 以降で利用可能)。
'any' - 'exclude_from_search' が true にセットされているもの(つまり trash と auto-draft)を除き、すべてのステータスの投稿を取得する。

投稿の並び順を指定する

特定の条件に合致する記事の取得方法を見てきましたが、今度はその取得してきた記事を特定の値でソートしてみましょう。
ソートを実行するには

order=>'ASC' 昇順
order=>'DESC' 降順

を指定した後に

orderby=>'date'

のようにどの値でソートするかを指定します。
orderbyに指定できる値は、以下のとおりです。

'none' - 順序をつけない(バージョン 2.8 以降で使用可能)。
'ID' - 投稿 ID で並び替える。大文字に注意。
'author' - 著者で並び替える。
'title' - タイトルで並び替える。
'date' - 日付で並び替える。
'modified' - 更新日で並び替える。
'parent' - 投稿/固定ページの親ID順。
'rand' - ランダムで並び替える。
'comment_count' - コメント数で並び替える(バージョン 2.9 以降で使用可能)。
'menu_order' - 固定ページの表示順で並び替える。固定ページ(固定ページ編集画面のページ属性ボックス)と添付ファイル(ギャラリー内のメディアの順番に相当)で使うことがもっとも多いでしょう。しかしバラバラの値が入った 'menu_order' を持つ任意の投稿タイプに対して使うことができます(デフォルト値は 0)。
'meta_value' - カスタムフィールドで並び替える。'meta_key=keyname' がクエリに存在しなければいけません。また、ソート順は文字列順になることに注意してください。数値だと予想外の挙動をします(通常、1, 3, 4, 6, 34, 56となると思うところが、1, 3, 34, 4, 56, 6となります)。数値なら代わりに 'meta_value_num' を使ってください。カスタムフィールドの値を特定の型にキャストしたければ 'meta_type' を指定できます。有効な値は 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' です('meta_query' と同じ)。
'meta_value_num' - カスタムフィールドの値を数値として並び替える。(バージョン 2.8 以降で使用可能)。これもまた、'meta_key=keyname'がクエリに存在しなければならないことに注意してください。こちらは 'meta_value' 示したような数値での並べ替えを可能にします。
'post__in' - post__in パラメータの配列に並んだ投稿 ID の順になります(バージョン 3.5 以降で利用可能)。

まとめ

いかがでしたでしょうか? WP_Queryの使い方を習得すると、自由に記事を取得できるようになります。もうどんな条件の記事一覧画面でも実装できるようになりましたね!他にもいろいろな条件の指定方法があり、WP_Queryは奥が深いのですが、一度ルールをわかってしまえばSQLを書かなくても、複雑な条件のクエリを発行できるので、ぜひマスターしてみてください。
それでは!