Wordpress の REST API で ACF のサブフィールドを使ってクエリする

サイドプロジェクトで Wordpress を Headless CMS として使っていて、そのときに ACF (Advanced Custom Field) で定義したフィールドを REST API のクエリで利用できなかった。それをどうやって解決したかという話。

TL;DR

ACF Better Search プラグインをインストールして search クエリを使う。対象のサブフィールドが "監修者" で "田中太郎" でクエリしたい場合、"監修者" を ACF Better Search の検索対象にして /wp-json/wp/v2/posts?search=田中太郎 というクエリを投げる。

ACF: Better Search
このプラグインはデフォルトの WordPress検索エンジンにAdvanced Custom Fields プラグインの選択されたフィールドからのコンテンツで検索する機能を追加します。

背景

Wordpress はバージョン 4.7 から REST API をデフォルトで提供していて、何もしなくてもGET /wp-json/wp/v2/posts というパスで投稿をJSON 形式で取得できる。それをつかって Wordpress を Headless CMS として用いることができ、Next.js でブログのフロントを作って記事は Wordpress で入稿して管理するというようなことができる。

REST API Handbook | Developer.WordPress.org
The WordPress REST API provides an interface for applications to interact with your WordPress site by sending and receiving data as JSON…

で、Wordpress の投稿にはさまざまなメタデータがつけられるようになっていて、Advanced Custom Field (ACF) もその一種。ACF はかなりメジャーなプラグインのようでみんなよく使っている。

この ACF で付与したメタデータで投稿をフィルタして一覧を取得したいと思ったのだけどデフォルトの REST API では ACF のメタデータはクエリに使えない。ACF も一部は REST API に対応していて category や custom-taxonomy などのトップレベルのものはクエリに使えるが、投稿に付けているメタデータ(=サブフィールド)は対象にならない。Stack Overflow にもそのように書かれていた。

How to query the Wordpress API by ACF properties?
I’m trying to query the Worpress API based on ACF properties. If I don’t include a query, I get this output: [{“id”:215,“date”:“2018-08-05T09:21:37”,“date_gmt”:“2018-08-5T08:21:37”,“guid”:{“rende…

自分で Wordpress に新しい REST API エンドポイントを組み込めばよさそうなんだけどめんどくさいし PHP は慣れてないのであまり書きたくない。1時間ほど Google をさまよっていたら ACF Better Seach というプラグインを見つけた。

ACF: Better Search
このプラグインはデフォルトの WordPress検索エンジンにAdvanced Custom Fields プラグインの選択されたフィールドからのコンテンツで検索する機能を追加します。

これは Wordpress にある「検索機能」の検索対象に ACF のサブフィールドを加えてくれるというもの。Wordpress の REST API にもこの「検索機能」に対応する search というクエリがあり、これをインストールすれば対象に ACF のサブフィールドが加わる。

さらに、検索対象にするサブフィールドをしぼるオプションもある。

Settings on 'ACF: Better Search'

そして、ACF 側で検索対象にするサブフィールドを選ぶことができる。

Settings on 'Edit Field Group (ACF Plugin)'

これらを組み合わせることでめでたく ACF サブフィールドによるクエリ(=フィルタ)が実現できた。

もちろん、対象にしたいサブフィールドが複数、それらで同じ値がある場合にはちょっと工夫が必要になる。ただ、ACF サブフィールドは取得したデータに入っているし、REST API で取得後にアプリケーションレベルでさらにフィルタで十分実用に足りると思う。すくなくとも全件取得して自分でフィルタするよりはかなりマシだろう。

余談

なんか Wordpress とか ACF っていろいろトラブル抱えてるのね。これを調べながら初めて知った。Redis とか Elastic もこういうのあるよな~。

WordPressがWP Engine保有の超有名プラグイン「Advanced Custom Fields」を勝手に「フォーク」、開発元はプラグインが「同意なしに持ち去られた」と主張
WordPressの創始者であるマット・マレンウェッグ氏が、WordPress特化のホスティングサービスである「WP Engine」を痛烈に批判し、WP Engineからのアクセスをブロックしています。この問題に続き、WordPressのマレンウェッグ氏が、WP Engine保有の超有名プラグイン「Advanced Custom Fields(ACF)」をフォークしたと発表しました。

Read more

Apple Watch で au ウォッチナンバープランを契約する

小学生の子供に Apple Watch を持たせた小学生の子供との連絡用に Apple Watch SE2 持たせるようにしました、という話。 みまもり GPS 小学校に入学してからみまもりのために GPS を持たせていた。使っていたのはみてねのみまもりサービス。月額500円くらい。 【公式】みてねみまもりGPS-CMで話題!子どもを見守るGPS2023年新規利用者数No.1。みてねの子供向けGPS端末。長持ちバッテリー搭載で最大2ヶ月充電不要。最高水準の位置情報精度で登下校の移動履歴、出発到着の通知をスマホで簡単に見守り。簡単操作のお知らせボタン付き(第3世代)で緊急時も安心安全。未就学児から小学生の子供まで持ち運びしやすい小型で精度の高いGPSトラッカー「みてねみまもりGPS」家族アルバム みてね これはなかなか使い勝手がよくてアプリの出来や位置の精度含めて不満はなかった。ただ、子供が高学年にさしかかってきて習い事や塾、友達と遊びに行くという機会が増えてきたので、通話したりメッセージをやりとりしたくなってきた。というわけで、うちもそろそろスマホかケータイか何か持たせた方がいいかなと

ブログを始めて10年経った

ブログを始めて 10 年経った。 この日のことはなんとなく覚えていて、iPhone 5 ではてなブログのアカウントを作ってこの記事を書いた記憶がある。 約30年近く生きてきた自分を省みると、だいたい3ヶ月の壁があって、3ヶ月以上続くとその後も習慣が続くことが多いのでまずは3ヶ月を超えられるようにしたいですね と書いていたけど、10 年続いたな。 10 年間、人があまり経験しないようなことも何度か経験したなー。心停止した人を発見して心肺蘇生法施して命を救うってそうそう経験しないでしょ?(そのときは Youtube でやり方を調べました)。あとはレイオフで社員は半分クビです、というのもあった。「今週末が最終出社です」みたいなの日本でもあるんだね(もちろん合法的な手続きです)。 でも、やっぱり子供が生まれたことが一番大きいな。 ブログを初めてすぐに生まれた子供はもうすぐ 10 歳になる。10 年後は 20 歳。確実に時の流れは加速していて、こうやってあっという間に時間は過ぎ去っていくのであった。次の 10 年もあっという間に過ぎ去るのだろう。

小学生の子供に Apple Watch を持たせた

小学生の子供との連絡用に Apple Watch SE2 持たせるようにしました、という話。 みまもり GPS 小学校に入学してからみまもりのために GPS を持たせていた。使っていたのはみてねのみまもりサービス。月額500円くらい。 【公式】みてねみまもりGPS-CMで話題!子どもを見守るGPS2023年新規利用者数No.1。みてねの子供向けGPS端末。長持ちバッテリー搭載で最大2ヶ月充電不要。最高水準の位置情報精度で登下校の移動履歴、出発到着の通知をスマホで簡単に見守り。簡単操作のお知らせボタン付き(第3世代)で緊急時も安心安全。未就学児から小学生の子供まで持ち運びしやすい小型で精度の高いGPSトラッカー「みてねみまもりGPS」家族アルバム みてね これはなかなか使い勝手がよくてアプリの出来や位置の精度含めて不満はなかった。ただ、子供が高学年にさしかかってきて習い事や塾、友達と遊びに行くという機会が増えてきたので、通話したりメッセージをやりとりしたくなってきた。というわけで、うちもそろそろスマホかケータイか何か持たせた方がいいかなと思って検討を始めた。 スマートウォッ

ブログ移行した(再び)

ブログを Wordpress から Ghost に移行しました。 ちょうど 1 年前にはてなブログから Wordpress に移行したけど書く頻度がけっこう下がってしまっていた。やっぱり Wordpress って全体的に too much な感じで自分の好みとあまりマッチしなかった。フルマネージドの Wordpress.com を使ったけど、シンプルにブログだけ書きたい自分の方向性とあってなかった。個人で EC したりとかそういう向けかな。使いたいテーマが Premium しかなくて年額15,000円くらい払ったけど、テーマの満足度も低くていまいちだった。 ブログホスティングサービスどれがいいんだろうと思っていろいろ探したが、ばっちり自分と合うようなものはなかなか見つけられなかった。Substack がいいのかな?と思ったりしたけど、ニュースレターという感じでもないし SEO が低そうだと思って候補から外した。それこそ Next.js で自作したり、Github Page でホスティングするほうが自分でいくらでもシンプルにできるよなーとは思ったけど、絶対続かなくなるからそれはやめた