KUHAKU
no
MEMOCHO

WP_Queryを使い倒そう【マスター編 ④】日付・カスタムフィールド

WP_Queryを使い倒そう【マスター編 ④】日付・カスタムフィールドのサムネイル

どうもKUHAKUです。

暫くさぼっていた久しぶりのWP_Queryを使い倒すシリーズをやっていこうと思います。

今回見ていくのは日付とカスタムフィールドによる記事の絞り込みです。
この記事を持ってWP_Queryで取得する記事を絞り込むパラメータは一通り終了となります。

これまでのシリーズはコチラ
↓↓

パラメータの設定

日付とカスタムフィールドのパラメータに関しては今までのものより少々複雑なのでより細かく説明を入れていこうと思います。
例が多くなってしまうかもしれないのでコードだらけの記事になるかもしれませんがご容赦を。

日付のパラメータ

ワードプレスをカスタマイズしているとちょくちょく出てくる日付での投稿の絞り込み。
例えばオススメ記事の一覧などを表示するときに過去記事ばかり出てきてもしょうがないので今週や今月など期間を絞ってオススメの記事を表示したい等の要望を叶えるのがこちらのパラメータです。

こちらを使えば先程のような記事の絞り込みも簡単に行えます。

投稿者が複数いて一日で数十件の更新があるサイトなどは直近の投稿が埋もれてしまわないように今週投稿された記事のみに絞ってオススメ記事として表示することがあります。

今までよりも若干複雑ですが分かってしまえばとても便利に使えるのでゆっくり見ていきましょう。

year

このパラメータは投稿年を指定することができるパラメータです。
使用する値は4桁の整数で西暦で指定すればOKという何ともわかりやすい仕様になっています。

例)2018年に投稿された記事一覧を取得する。

monthnum

こちらは投稿の月を指定するパラメータです。
気を付けるべきなのがよくmonthで覚えてしまって指定してみたら思うように動かないなんてことがたまにあります。
この後にご紹介するdate_queryのafterとbeforeでmonthというパラメータを使用できるので間違って覚えがちですがnumをくっつけるのをお忘れなく。

例)12月に投稿された記事一覧を取得する。

ただしこれだけ指定すると今年だけでなく、去年、一昨年の12月の記事も取得してくるので今年の12月に記事を取得するには先述のyearパラメータもお忘れなく。

w

普通に生活していると馴染みがないですが、プログラムの世界では週には番号があります。
一年間は365日なので一週間7日で割ると小数点切り上げで53週間あることになり、これを週番号として数えていきます。

かといって今日が一年で何番目の週かなんてわからないと思いますがphpのdate関数で簡単に取得できます。

こんな感じでサクッと取得できるので週番号がわからないどうしようなんて心配は不要。

例)今週投稿された記事を取得する

day / hour / minute / second

もう説明は不要かと思いますが投稿日や時間、分、秒を指定して記事を取得してくるパラメータです。
正直minuteとsecondに関しては設定が細かすぎるのであまり使う機会がないので無視してもらっても構いません。

注意点としては整数なので03のように一桁のものに関して先頭にゼロを付けないほうがよろしいということぐらい。

あとは当たり前ですが24時はありませんので0時を指定してください。

例)2018年1月27日18時59分3秒に投稿された記事の一覧を取得する

ここまでで見てきたパラメータはこの後のdate_queryでも使用しますのでそれほど難しいこともありませんが覚えておいてください。

m

このパラメータは今までのものと違い、この後ご紹介するdate_queryでは使用できませんが、何かと便利なので覚えておいてもいいかと思います。
ただdate_queryやほかの項目で十分賄えるので今後のアップデートで削除される可能性は大です。

使用する整数は西暦の4桁と月番号2桁をくっつけて使用します。
ココでの注意点は月番号が2桁なので先程までと違い、9以下の数字は先頭にゼロを付けなければなりません

例)2018年1月に投稿された記事の一覧を取得する

date_query

ここまでで簡易的な日付での絞り込み指定を見てきましたが、中にはもっと複雑な絞り込みをしたい場面も出てくると思います。
そんなときに活躍するのがdate_queryパラメータです。

例えば平日の記事のみ絞りこみたい場合や一年以上前の投稿で今月更新されたものを表示したい場合などに使用できます。

もちろん今まで見てきたパラメータをdate_queryの中で子配列として扱うことも可能です。
上記で見てきたパラメータの値の指定方法は先述のものと全く変わらないのでここでは省いて説明していきます。

afterとbefore

afterとbeforeのパラメータはstrtotime()互換の日付を指定する文字列、または ‘year’, ‘month’, ‘day’ の値を持つ配列を指定可能です。

strtotime()互換の日付を指定する文字列についてはphpのリファレンスに記載があるので気になる方は覗いてみてください。

PHP: 日付の書式 - Manual
php.net

形式としてはいたって単純で指定した日付より後の投稿を取得する場合はafterを、指定した日付より前の投稿を取得する場合はbeforeを使用します。

例)2016年5月29日から2016年10月15日までの記事の一覧を取得する

ここで注意するべきなのはbeforeパラメータに文字列で日付だけを指定するとその日の00:00:00に設定されてしまうので文字列で指定する場合は上記の例のように23:59:59まで指定するか、 ‘year’, ‘month’, ‘day’ の値を持つ配列を指定し、この後ご紹介するinclusiveをtrueにします。
inclusiveがtrueでも日付だけの文字列だとその日の投稿は含まれないので注意です。

inclusive

上記のafterやbeforeパラメータで指定した日付ぴったりを含めるかどうかの真偽値を入れます。
afterやbeforeの配列に入れても意味が全くないので要注意。

例)2017年12月28日以降、2018年1月3日以前の記事を取得する

指定した日付を含めたくない場合はfalseを指定します。
例えば、今日より前(昨日以前)の投稿を取得する場合は以下のような形になります。

compare

あまり使用はしませんが指定した値の比較演算子が入ります。
使用可能な値は ‘=’, ‘!=’, ‘>’, ‘>=’, ‘<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (WP3.5以降), and 'NOT EXISTS' (同じくWP3.5以降)で、デフォルトは'='です。 使用例としては、指定した日付の投稿を含めないで表示したい場合や平日の投稿のみを取得したい場合などに使用します。 例)今までの投稿から午前8時から午後5時の間に投稿された記事の一覧を取得する

このような感じで子配列ごとに指定することができます。

dayofweek

週の番号を指定できるパラメータで、整数だけでなく配列も指定可能です。
指定できる値は日曜を1として7までの数値が指定できます。

このパラメータと先述のcompareを使用すれば、平日の投稿のみを取得したりと便利なことができます。
曜日オーナー制の小さなバーのホームページなどではたまに使用したりします。

例)平日に投稿された記事の一覧を取得する

詳しいcompareの使用法は全部英語で分かりづらいですが下記に記載があります。

WP_Date_Query::get_compare() | Method | WordPress Developer Resources
developer.wordpress.org
column

このパラメータはざっくりいうと投稿日を見るのか更新日を見るのかを指定するパラメータです。

指定できる値は’post_date’,’post_date_gmt’,’post_modified’,’post_modified_gmt’の4つです。

投稿日を参照する場合はpost_dateを、更新日を参照する場合にはpost_modifiedを指定します。
このそれぞれにGMT(グリニッジ標準時)が用意されているのであまりないかとは思いますがGMTで参照したい場合は末尾に「_gmt」をくっつければOK。

例)1年より前の投稿で1ヶ月以内に変更された記事の一覧を取得する

こちらのパラメータは上手く使用すれば過去記事へのアクセス流入に役立ちます。
一度作ったコンテンツを無駄にしないためにも最近更新された記事一覧などをサイドバーあたりに作成してみるのもとてもいいかと思います。

relation

このパラメータはdate_queryで作成した子配列の検索条件の結合に使用します。
指定できるパラメータは’AND’と’OR’でデフォルトは’AND’になります。

例)2018年2月6日の投稿もしくは2018年1月6日に記事一覧を取得する

あまり使う機会はないかもしれないが覚えて損はないかなと思います。

以上で日付パラメータの説明が終わりになります。
意外と簡単のように見えてcompareとrelationあたりがぐちゃぐちゃになる危険があるので要注意です。

カスタムフィールドのパラメータ

続いて絞り込み系最後のパラメータになるカスタムフィールドのパラメータです。

先程に続き何やら複雑です。
複雑ですが分かってしまえば非常に簡単なので早速見ていきましょう。

meta_key

カスタムフィールドのキーを指定して記事を取得します。
例えば「address」というカスタムフィールドを持つ記事の一覧を値に関係なく取得する場合は以下のようなコードになります。

いたって単純ですがこれ単体では使用することはないでしょう。

meta_valueとmeta_value_num

これらのパラメータはカスタムフィールドの値で記事を絞り込む場合に使用します。

meta_valueとmeta_value_numの違いは文字列として比較するか数値として比較するかの違いです。
この二つに違いは使用してみるとわかると思いますので説明は省略します。

例)「東京」というカスタムフィールドの値を持つ記事の一覧を取得する

これでカスタムフィールドに「東京」が入っている記事のみが取得できます。
ただし、カスタムフィールドのキーに関係なく記事をとってきてしまうので例えば「address」というキーには「神奈川」が入っていて「graduate」というキーに「東京」が入っている場合でも上記コードだと記事データを取得してしまいます。

「address」に「東京」と入っている記事のみを取り出すためには先述のmeta_keyと合わせて使用します。

meta_compare

meta_valueもしくはmeta_value_numの比較演算子を指定可能です。
使える値は ‘!=’, ‘>’, ‘>=’, ‘<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' と 'RLIKE' です。デフォルトは’=’

例えば「age」というカスタムフィールドで「20」以上の記事の一覧を取得する場合は以下のコードで実装可能です。

meta_query

meta_queryは複雑なカスタムフィールドでの検索に使用できます。
このパラメータの中には子配列を入れることになります。今まで見てきたtax_queryやdate_queryと似たような構造なのでここまで理解できている方は特に問題なくこの項目も進めると思います。

key、value、compare

これらのパラメータは上記で説明したmeta_key、meta_value、meta_compareの接頭語が無くなっただけで使用方法は特に変わりません。
ただし、valueはmeta_valueと少しだけ違い、compare が ‘IN’, ‘NOT IN’, ‘BETWEEN’ または ‘NOT BETWEEN’ の場合は配列が指定できます。

これによってカスタムフィールドを使用した複数検索が可能になります。

例)「address」に「東京」もしくは「千葉」が入っている記事の一覧を取得する

これを使用すると不動産の物件情報サイト等のポータルサイトをはじめとする複雑なWEBサイトが作成できるようになります

ワードプレスでそこまでやる意味があるのか正直微妙ですがまあデータベース設計と接続をしなくても簡単に作成できるので制作的には楽です。笑

type

これは参照するカスタムフィールドの値の種類になります。
使える値は ‘NUMERIC’, ‘BINARY’, ‘CHAR’, ‘DATE’, ‘DATETIME’, ‘DECIMAL’, ‘SIGNED’, ‘TIME’, ‘UNSIGNED’ です。デフォルトは ‘CHAR’ です。

値の種類といってもphpやMySQLを勉強していない方はなんじゃそりゃ状態だと思いますが、いわゆるデータ型のことです。

データ型についてはこちらのブログが分かりやすく書かれているので気になる方は見てみてください。

【MySQL】データ型一覧 – ysklog
ysklog.net

例)「price」というカスタムフィールドの値が50000から80000の間の記事一覧を取得する

タイプは特に覚えなくてもいいかと思いますが日付の比較をする際には重要になってくる項目なので注意してください。

relation

これは日付のパラメータでやったものと全く一緒です。
このパラメータはmeta_queryの子配列が2つ以上ある場合にのみ指定するのが推奨とのことです。

ここまでくるととても複雑なカスタムフィールドの絞り込みが可能になります。

例)キー「type」の値が「1K」もしくは「1R」且つ、キー「option」の値が「防音」の記事一覧を取得する

以上でカスタムフィールドのパラメータは終了です。

ここまでくるとかなり複雑な記事の絞り込みが可能になります。
ワードプレスでぐるなびや食べログのような飲食店のポータルサイトを自作することも難しくはないでしょう。

実際僕はワードプレスに触れてWP_Queryに出会ってから真っ先に作ったのが地域のお店をメインにしたポータルサイトで自分でいうのもあれですがかなり立派なサイトを作ることができました。

上記を用いた実践的使い方

それでは今回はグルメポータルサイトを仮定して実際に使用する際のコードを見ていきます。

一般的にグルメポータルサイトなどではエリアやジャンル、予算などで絞り込み検索ができます。
あんな複雑な検索もこれらを使用するとサクッと実装ができます。

フリーワードとカテゴリー・カスタムフィールドを使用したカスタム投稿タイプの検索

お店のジャンルはカテゴリー、エリア、予算、特徴はそれぞれカスタムフィールドで設定しているものとしてコードを書いてみました。

正確に言うともっと工夫が必要ですがこれで複雑な検索の基礎ができました。
これをいろんなパターンを想定してもっと細かく設定していけば有名サイトのような検索が可能になります。

カスタム投稿タイプでカスタムフィールドに特定の値を持つ過去一か月の記事のみを表示する

今回はお知らせの中でお店向けのお知らせの記事を取得するという設定で見てみます。

newsというカスタム投稿タイプでお知らせを作成し、お店向けの記事にはforshopというキーのカスタムフィールドで真偽値(0 or 1)を指定しているものとします。

こんな感じですかね。

正直これ以上の使い方のコードが見当たりません。笑

おそらく次回かその次の記事でこのシリーズは終わりになるかと思います。

それではまた。

FB Comment