WP_Queryを使い倒そう【マスター編 ②】タグ・タクソノミー・検索

やってまいりましたWP_Queryを使い倒すシリーズ、マスター編第二弾です。
今回はタグとタクソノミーのパラメータについてじっくり見ていこうかと思います。
この記事は連載記事です。
- WP_Queryを使い倒そう【基本編】
- WP_Queryを使い倒そう【マスター編 ①】投稿者・カテゴリー
- WP_Queryを使い倒そう【マスター編 ②】タグ・タクソノミー・検索
- WP_Queryを使い倒そう【マスター編 ③】投稿・固定ページ・パスワード
- WP_Queryを使い倒そう【マスター編 ④】日付・カスタムフィールド
- WP_Queryを使い倒そう【マスター編 ⑤】順序・ページ送り・権限・キャッシュ・戻り値
- WP_Queryの全パラメータと使い方をまとめたコードスニペット
パラメータの設定
それでは早速見ていきましょう。
前回の投稿者、カテゴリーのパラメータは割と単純でしたが、今回見ていくタグとタクソノミーは少しばかり厄介です。
中でもタクソノミーは、まず何ですのそれ状態の人もいると思うのでそちらも少し説明していきたいと思います。
タグのパラメータ
タグのパラメータはカテゴリーのパラメータと割と似た作りになっています。
1 2 3 4 5 6 7 8 9 |
<?php $args = Array( 'tag' => 文字列, // タグのスラッグを指定。 'tag_id' => 整数, // タグIDを指定。 'tag__and' => 配列, // タグIDの配列を指定。 'tag__in' => 配列, // タグIDの配列を指定。 'tag__not_in' => 配列, // タグIDの配列を指定。 'tag_slug__and' => 配列, // タグのスラッグの配列を指定。 'tag_slug__in' => 配列, // タグのスラッグの配列を指定。 ); |
カテゴリーのパラメータと似ていますが少し違うのがcatは整数ですがtagは文字列であること、あとはスラッグでのアンド・インのパラメータがあるところですね。
ここでいうスラッグとは初期設定でいくとタグそのままです。
少々注意しなくてはいけないのが英語はすべて小文字になるので要注意です。
tag
まず最初に見るのがこちら。
先述のとおりカテゴリーのパラメータではcatがカテゴリーIDを指定する整数のパラメータでしたが、tagはスラッグを指定する文字列のパラメータです。
代わりにタグIDでの指定は後述のtag_idを使用します。
例)「グルメ」というタグが付いた記事の一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag' => 'グルメ', ); |
クソほどカンタン!笑
サクサクと次を見ていきましょう。
tag_id
tag_idは読んで字のごとくタグIDで絞り込みを指定するパラメータです。
使用頻度は極小ですが覚えておいて損はないかと思います。
例)タグIDが「4」の記事一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag_id' => 4, ); |
tag__and
コイツはタグIDのアンド検索に使用できます。
指定したタグIDを全て持つ記事のみの取得が可能です。
例)タグIDが「8」と「51」の両方を持つ記事の一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag__and' => array(8,51), ); |
tag__in
このtag__inは指定したタグIDのどれかを持つ記事の取得が可能です。
例)タグIDが「8」と「51」のどちらかを持つ記事の一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag__in' => array(8,51), ); |
tag__not_in
ここまで来たらもうパラメータを見ただけで理解はできるんじゃないでしょうか?
そう、指定IDを持たなき記事の取得が可能なパラメータになります。
言われなくても分かるわバーカと思ったあなた。
理解が早いようなのですぐにでもタクソノミーのパラメータにすっ飛びましょう。
例)タグIDが「8」と「51」のどちらも持たない記事の一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag__not_in' => array(8,51), ); |
tag_slug__andとtag_slug__in
もはやまとめてしまいましたが、こ奴らはtag__andやtag__inをスラッグで使用できるパラメータになります。
これらのパラメータはユーザーがフロントから検索できる機能を作るときなどに使えます。
特に使えるのは不動産関連のサイトをワードプレスで作成したとき等は特に重宝するパラメータです。
例)「バストイレ別」と「オートロック」の両方のタグを持つ記事の一覧を取得する。
1 2 3 |
<?php $args = Array( 'tag_slug__and' => array('バストイレ別','オートロック'), ); |
以上でタグのパラメータは終了です。あっけなく片付きましたね!
ワードプレスは基本的な使用方法をしている限りこの程度の分かりやすいものが多いです。
一見複雑に見えても実はそうでもないことが多々あります。
しかし、ワードプレスは何もブログだけではなくほぼなんでもと言っていいくらいに色々なものが作れます。
次のタクソノミーパラメータ以降はそんなときには必要になってくる知識なので覚える必要はありませんが、覚えたら意外と楽しいかもしれません。
タクソノミーのパラメータ
お次は少々厄介なタクソノミーのパラメータになります。
まずタクソノミーとは英語で分類といったような意味合いのもので、カテゴリーやタグなどはワードプレスで標準で用意されているタクソノミーです。
これら以外にもワードプレスではカスタムタクソノミーというものが作成できます。
カスタム投稿タイプを作成した際に、何も設定をしないと投稿画面にはカテゴリーすらありません。
そんなときに作成するのがカスタムタクソノミーで、今回はソイツのパラメータになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $args = Array( 'tax_query' => array( // タクソノミーパラメータを指定する下記配列を指定。 'relation' => 文字列, // 演算子ANDまたはORを指定。 array( 'taxonomy' => 文字列, // タクソノミー名を指定。 'field' => 文字列, // termsでterm_id、name、slugのどれを使うか指定。 'terms' => 整数・文字列・配列, // タームの条件を指定。 'include_children' => 真偽値, // trueかfalseを指定。 'operator' => 文字列 // termsの演算子を指定。 ) ), ); |
なにやら今までと形が少し違いますね。
今回は{tax}はワードプレス3.1以降だと非推奨なので入れてません。
tax_query
今までと形が違う一番の原因がコイツtax_queryです。
タクソノミーのパラメータを設定する際はコイツを主に使っていきます。
tax_queryはタクソノミー検索条件(配列)の配列を入れていきます。この構造によって複数のタクソノミーの条件指定が可能です。
relation
先述の複数のタクソノミーを指定した際に使用する比較演算子です。
このパラメータは2つ以上のタクソノミー検索条件があるときのみ指定します。
指定できる演算子は’AND’ または ‘OR’ です。
例)タクソノミー「area」のターム「北海道」とタクソノミー「genre」のターム「居酒屋」の両方が付いた記事の一覧を取得する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $args = Array( 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'area', 'field' => 'name', 'terms' => '北海道', ), array( 'taxonomy' => 'genre', 'field' => 'name', 'terms' => '居酒屋', ), ), ); |
実際に使用していく形は上のようなコードになります。
relationの下にある配列2つが検索条件で、今回はその両方を持つ記事の指定だったのでrelationに「AND」を指定しました。
taxonomy
このパラメータは使用するタクソノミーを指定します。
タクソノミーを分かりやすく説明するとカテゴリーとかタグ等といった大きな分類になります。
例えばワードプレスというカテゴリーを設定した場合、relationの例題の表記をすると次のようになります。
タクソノミー「カテゴリー」のターム「ワードプレス」
こうするととってもわかりやすいですね。
タクソノミーとは分類の名前で、タームとはその内容になります。
このtaxonomyは後述のfieldとtermsをセットで使用するので例題とサンプルコードは纏めて書きたいと思います。
fieldとterms
パラメータを一気に2つ紹介します。
fieldはtermsで指定するものが何なのかを指定していきます。
fieldに入れられる有効な値はタームID「term_id」(デフォルト)、ターム名「name」、タームのスラッグ「slug」の3つのみが使用できます。
対して、termsは、fieldの指定条件を書いていきます。
実際に例を見ながら覚えていきましょう。
例)タクソノミー「genre」のタームID「5」の記事一覧を取得する。
1 2 3 4 5 6 7 8 9 |
<?php $args = Array( 'tax_query' => array( array( 'taxonomy' => 'genre', 'field' => 'term_id', 'terms' => 5, ), ), ); |
上記の例ではタームIDを使用するのでfieldに’term_id’を、termsに指定するタームIDの5を指定しています。
例)タクソノミー「genre」のタームのスラッグが「french」と「dinner」どちらかが付いたの記事一覧を取得する。
1 2 3 4 5 6 7 8 9 |
<?php $args = Array( 'tax_query' => array( array( 'taxonomy' => 'genre', 'field' => 'slug', 'terms' => array( 'french', 'dinner' ), ), ), ); |
上記の例は、タームのスラッグを使用するのでfieldに’slug’を、termsに指定するスラッグの配列を指定しています。
こんな感じでタクソノミーのパラメータの基本はもうこれで完璧です。
あとは詳細な設定をするパラメータを見ていきましょう。
include_children
コイツはタクソノミーがカテゴリーのように子孫関係の階層が作れる場合に指定します。
つまり簡単に言うと階層を持つタクソノミーの場合に子孫タクソノミーを含めるかどうか。入れられるのは真偽値のみで、デフォルトは true(含める)です。
コイツは特に例題もいらないかと思いますのですっ飛ばします。
operator
このoperatorはtermsで指定した条件の演算子が入ります。
使用可能な演算子は、’IN'(デフォルト), ‘NOT IN’, ‘AND’, ‘EXISTS’ (4.1.0 以降) と ‘NOT EXISTS'(4.1.0 以降) です。
‘EXISTS’とかは特に使う場面がありませんので説明はカットします。
その他の’IN’, ‘NOT IN’, ‘AND’はカテゴリーや投稿者パラメータでやったのと同じです。
例)タクソノミー「genre」のタームのスラッグが「french」と「dinner」の両方が付いたの記事一覧を取得する。
1 2 3 4 5 6 7 8 9 10 |
<?php $args = Array( 'tax_query' => array( array( 'taxonomy' => 'genre', 'field' => 'slug', 'terms' => array( 'french', 'dinner' )', 'operator' => 'AND', ), ), ); |
以上でタクソノミーのパラメータは終了です。
見た目は複雑ですが型を覚えてしまえば単純でしたね。
タクソノミーのパラメータを使用する際は不動産の物件サイトや飲食店を検索するサイト等の検索フォームで使用する事例が多いです。
それでは、検索はどうすればいいのか?
今回のラストは検索のパラメータを見ていきましょう。
検索のパラメータ
検索のパラメータを使用する場面はsearch.phpのほぼ一択と言ってもいいでしょう。
先述のカテゴリーやタグ、タクソノミーのパラメータは検索のパラメータと共にsearch.phpで使用すると爆発的な便利さを発揮します。
s
コイツはいたって単純で検索キーワードを指定します。
例えば、「ヒートテック」というキーワードを含む記事の一覧を取得する場合は以下のようなコードになります。
1 2 3 |
<?php $args = Array( 's' => 'ヒートテック', ); |
とてつもなくカンタン極まりないですね。
exactとsentence
こいつらはまあ使う場面がないのでリファレンスにも載ってません。
ざっくり説明をすると「exact」は完全一致にするかどうかの真偽値です。
exactをtrueにして検索した場合、「東京のグルメ」の検索結果は以下のようになります。
「東京のグルメ」 → ○
「東京のグルメ通が教える名店5選」 → ×
こんな不便なものほぼ使う場面はありません。※個人の感想です。
もう一つの「sentence」はフレーズ検索をするかどうかの真偽値です。
コイツも使用頻度は極小で、リファレンスには載っていません。
フレーズ検索とは、つまり単語の並びをそのままで検索する検索方法になります。
sentenceをtrueにして検索した場合、「東京 グルメ」の検索結果は以下のようになります。
「東京 グルメ」 → ○
「東京 グルメ おすすめ」 → ○
「グルメ 東京」 → ×
これは単語でタイトルを付けることのない日本語には本気で全くの無関係パラメータですね。
使う場面が全く見つからないので、この二つのパラメータは放置でかまいません。
以上で今回のパラメータのご紹介は終わりです。
上記を用いた実践的使い方
さあそれでは今まで見てきたパラメータを使って実践的なコードを見ていきましょう。
今回は検索フォームを使用した絞り込みを見ていきます。
フリーワードとカテゴリー・タグを指定した記事一覧取得
ワードプレスでフリーワード検索をかけたとき、使用されるのはGETメソッドです。
例えば、当サイトで「ラーメン」というワードで検索したときの検索結果のURLはhttp://kuhaku.org/?s=ラーメンという形になります。
なのでこのGETメソッドで同時に他のパラメータを送信してあげれば様々な条件での検索が可能になります。
例)検索フォームで「新宿」、カテゴリー「1LDK」、タグ「オートロック」で記事を絞り込む
今回はカテゴリーをname=”cat”で、タグをname=”point”で送信するものとしました。
検索結果のURLはhttp://kuhaku.org/?s=新宿&cat=1ldk&point=オートロックとなります。
これを表示するのは以下のコードで可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php // GETで送信された情報を取得 // フリーワード $s = $_GET['s']; // カテゴリー $cat = $_GET['cat']; // タグ $point = $_GET['point']; $args = Array( 'category_name' => $cat, 'tag' => $point, 's' => $s ); $the_query = new WP_Query($args); // 設定したWP_Queryで記事があればループをする if($the_query -> have_posts()): while($the_query -> have_posts()): $the_query -> the_post(); ?> <!--関連記事コンテンツ--> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <!--関連記事コンテンツ--> <?php // 関連記事のループ、if文の終了、元の投稿データを復元 endwhile; endif; wp_reset_postdata(); ?> |
ライン6~8行目でGETメソッドを代入して、10~14行目でWP_Queryにパラメータを設定しています。
複数条件での検索の型ができましたね。これであなたも検索マスターになれます。
『おまけ』検索でのパラメータ反映
今回は用例を説明するためにWP_Queryを使用しての検索方法をご紹介しましたが、実はワードプレスの検索には様々なパラメータが使用できるようになっており、単純なループ文でもパラメータの反映が可能です。
検索結果search.phpでWP_Queryを使用したループを使わなくても使えるパラメータは以下のとおりです。
‘m’, ‘p’, ‘posts’, ‘w’, ‘cat’, ‘withcomments’, ‘withoutcomments’, ‘s’, ‘search’, ‘exact’, ‘sentence’, ‘debug’, ‘calendar’, ‘page’, ‘paged’, ‘more’, ‘tb’, ‘pb’, ‘author’, ‘order’, ‘orderby’, ‘year’, ‘monthnum’, ‘day’, ‘hour’, ‘minute’, ‘second’, ‘name’, ‘category_name’, ‘tag’, ‘feed’, ‘author_name’, ‘static’, ‘pagename’, ‘page_id’, ‘error’, ‘comments_popup’, ‘attachment’, ‘attachment_id’, ‘subpost’, ‘subpost_id’, ‘preview’, ‘robots’, ‘taxonomy’, ‘term’, ‘cpage’, ‘post_type’
またここら辺は追って別記事で詳しくご紹介したいと思います。
次回は投稿と固定ページ・パスワードのパラメータを見ていきたいと思います。
それではまた次回お会いしましょう。