Advanced Custom Fields

オープンソースCMSであるWordPressでのWeb制作はとてもポピュラーになったと思いますが、開発側からすると「これはちょっと・・」とったことも多くあったりします。

ブログだけでなく、企業や組織などのウェブサイトでも多く導入されているWordPress。
個人的にひとつの重要な機能として、カスタムフィールドが浮かびます。

そこで、Advanced Custom Fieldsの出番となるわけです。
Advanced Custom Fields(以後ACF)でカスタムフィールドを作って専用のデータを入力してもらうのが一般的です。

ACFはとても優秀なプラグインだと思うのですが、ひとつ気が付いてしまったことがあるのでメモしておこうと思います。

Advanced Custom Fieldsについて

これまでなぜかACFをガッツリ使う機会がなかったのですが、最近になって仕事で使う機会を得ました。

たぶんWordPressのプラグインの中でも最も有名なプラグインなのではないかと思います。

調べると「拡張性がハンパない」なんて意見がちらほらありますね。

基本は無料ですが、有料の拡張機能もあったりします。

チェックボックスはシリアライズ化されて保存されるから検索が危うい

何かしら専用の検索機能を持つWordPressサイトではカスタムフィールドの値をmeta_queryで引っ掛けてget_postsすることが多いと思います。

中にはquery_postsとかも使う方もいるかもしれませんが、個人的にはあまりおすすめではないです。

O:7:"Student":3:{s:4:"name";s:11:"Nanhe Kumar";s:13:"Studentroll";i:1;s:6:"*age";i:16;}

ちょっと公式リファレンスから引用してきたので意味不明ですが、チェックボックスで投稿データを保存した場合、post_metaにはこのような形で保存されます。

何が言いたかったかというと、meta_queryで引っ掛ける場合、このデータを読むことになるのでLIKE検索しかできないということなんですね。

何が起こるのか?

シャツ、チェックシャツ、ボタンダウンシャツというチェックボックスを持つ投稿があるサイトを作るとします。

もしACFのカスタムフィールドで作る場合は先ほど説明した通り、シリアライズ化されて保存されます。

  • シャツ
  • チェックシャツ
  • ボタンダウンシャツ

という検索フォームがあったとして、シャツと選び検索したとします。

わかる方はわかると思いますがこの場合、チェックシャツとボタンダウンシャツというパラメータがついた投稿も引っかかってしまいます。

meta_queryを使う場合、compareのLIKEを使うしかないすし、とても検索に向いてないことがわかります。(LIKEはあいまい検索なので当然ですね。)

シリアライズ化されたデータを文字列として見て検索しているだけ(笑)

追記→チェックボックスの値をプラグイン設定でユニークなものにすれば検索は問題なくできます。しかし、例えば投稿リストにラベルで『シャツ』と表示させたいときにユニークな値からわざわざラベル名を取得しなければならなくなるので面倒くさいですし、意識して値をユニークなものにキープする必要が出てきてしまうのでやはりタクソノミーの方が便利だと思います。

タクソノミーならget_the_termsで1発です。

まとめ

頑張ってプログラムを書けば回避策がないわけではないとは思いますけど、だったらもうカスタムタクソノミーでいいじゃん・・と思います。

単独の値で保存されるデータに関しては問題なくmeta_queryで書けるので、チェックボックスみたいな複数選択のものはカスタムタクソノミーで作るのが良いのかもしれません。

項目数が多すぎると何となく嫌ですけどね。

以上、Advanced Custom Fieldsのチェックボックスの落とし穴のメモを終わります。