こんにちは。エンジニアの庄子です。
前回に引き続き、WP JSON REST APIを色々調査してます。
今回は、記事に設定したカスタムフィールドでフィルタをかけて、データを取得する方法を調べてみました。
目的
- 記事に設定したカスタムフィールドを条件に、WP JSON REST APIで記事を取得する
環境
- MAMP
- WordPress 4.1.1
まずは普通にやってみた
データは前回作成したニュース記事を使用したいと思います。
ニュース1とニュース4の記事に対して、カスタムフィールド「UPDATED」を追加し、値に”1″を設定しました。
その上で、以下のクエリをAPIに投げてみます。
1 |
http://(WPルート)/wp-json/posts?filter[category_name]=NEWS&filter[meta_key]=UPDATED&filter[meta_value]=1 |
meta_keyはカスタムフィールドのキー名、meta_valueはそのキーの条件値です。
どうやらフィルタがかかっていないようです。
未認証でカスタムフィールドを取得するためにプラグインを導入したのと同様に、フィルタにカスタムフィールドを使う場合も何かしらプラグインが必要になる様です。
カスタムフィールドでフィルタ可能なプラグインを作る
今回は既存のプラグイン導入ではなく、プラグインを自作してみます。
プラグイン作成の方法はこことかに詳しく書かれていましたので、そちらをご覧下さい。
以下のようなPHPコードを書いてみました。
1 2 3 4 5 |
function my_filter_meta_value( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value' ) ); return $valid_vars; } add_filter( 'json_query_vars', 'my_filter_meta_value' ); |
meta_keyとmeta_valueという変数を配列に追加する関数:my_filter_meta_valueを定義し、json_query_varsというフィルターフックに追加しています。
このフィルタを「Rest API Custom Field」という名前にして保存し、WordPressのプラグイン一覧から有効化しました。
テストしてみる
先ほどと同じクエリをAPIに投げてみます。
1 |
http://(WPルート)/wp-json/posts?filter[category_name]=NEWS&filter[meta_key]=UPDATED&filter[meta_value]=1 |
結果は…
わかりづらいですが、ちゃんとニュース1とニュース4の記事データだけを取得出来ているようです。
さらに嬉しいことが!
WP JSON REST APIではpostsで記事を取得するときのソート指定を
- ソート項目:filter[orderby]
- 昇順降順指定:filter[order]
のように、フィルタで指定するようなのです。
カスタムフィールドをフィルタで絞れるようになったということは、もしやカスタムフィールドでソートも出来るようになったのではと思い、試してみました。
各ニュース記事に”SORT”というカスタムフィールドを追加して、それぞれソート順の数値を登録しました。
ということで、まずASCから試してみます。
1 |
http://(WPルート)/wp-json/posts?filter[category_name]=NEWS&filter[orderby]=meta_value&filter[meta_key]=SORT&filter[order]=ASC |
ちゃんとSORTの昇順でソートされていました。
次にDESC。
1 |
http://(WPルート)/wp-json/posts?filter[category_name]=NEWS&filter[orderby]=meta_value&filter[meta_key]=SORT&filter[order]=DESC |
こちらもちゃんとSORTの降順でソートされてそうです。
カスタムフィールドのフィルタとソートが出来れば、WordPressの記事で様々なデータを扱うことが出来そうです。
今回は以上です!