WordPress には記事作成画面を拡張できるカスタムフィールドの機能があります。しかし、デフォルトのカスタムフィールドの UI は使いづらく、そのまま利用するのはなかなか大変です。そんな WordPress のカスタムフィールドを簡単・便利に利用できるようにするプラグインも公開されていて、Advanced Custom Fields なんかはその操作性の高さから多くのサイトで利用されています。
僕もいつも Advanced Custom Fields を利用していたのですが、実はこのプラグイン、ちょっとおかしな作りをしていて、複数選択項目の値をシリアライズして持っていたり、後方互換性の配慮が甘くて、メジャーバージョンアップの際にデータが消えるというバグがあったりなどの問題もありました。
そのような問題をクリアするために、Advanced Custom Fields をフォークして作成された Custom Field Suite というプラグインもありますが、操作性がちょっと気に食わなかったのと、今後手元で変更が効いたほうが便利かなーということで、独自に Smart Custom Fields というプラグインを作り始めました。
こんな感じです
本題
独自のカスタムフィールド UI は add_meta_box などの標準の関数で簡単に追加できて、今までもよっとしたメタボックスは作ったりしていたので、結構簡単にできるかな、と思っていたのですが、やってみるとあるところで大きくはまってしまいました。
それは、複数選択項目の扱いについてです。WordPress はひとつのキーで複数の値を保存できるので、複数選択項目の場合も問題なく保存できるのですが、全ての値が並列に保存されるため、繰り返しグループ内にチェックボックスを用意して、そのグループを複数繰り返した場合に、そのチェックボックスのどの値がどのグループのものか判断できず、大変困りました。
上記の例の場合、カスタムフィールドの値を保存する wp_postmeta テーブルには次のような感じでデータが保存されます。
| meta_id | post_id | meta_key | meta_value | xxxx | 1234 | loopmikantest | イチロー | xxxx | 1234 | loopmikantest | 松井 | xxxx | 1234 | loopmikantest | 高橋 | xxxx | 1234 | loopmikantest | イチロー | xxxx | 1234 | loopmikantest | 松井
という感じで、全ての値が並列に保存されているので、どちらの複製されたグループに保存された値か判別するための情報が必要になります。拙作の Smart Custom Fields の場合は、別途判別用の隠しメタデータも一緒に保存して判別するように実装しました。しかし、これだと、せっかくシリアライズせずに WordPress 標準の方法でデータを保存しているのに、別のプラグインに乗り換えると判別ができずに複数選択項目の値が大変なことになってしまう可能性があります。。
Custom Field Suite の場合
いろいろ調べていると、「Custom Field Suite は Advanced Custom Fields と違い、WordPress 標準の方式でデータを保存するためもし他のカスタムフィールド系プラグインがでても乗り換えができる」という情報があったりしましたが、ざっと見た感じ Custom Field Suite も同様の問題がある?ようで、こちらの場合は独自テーブルで判定しているのかな?という感じでした。
カスタムフィールドの値を並列ではなく階層的に保存する良い方法があれば良いのですが…良い方法をご存知の方がいらっしゃいましたら、こっそり教えていただくと、とてつもなく嬉しいです。
また、もし暇で暇で誰かの作ったプラグインをテストしたいなーという欲求にかられている方がいらっしゃいましたら、ぜひぜひテストにご協力いただけると嬉しいです。まだ GitHub 等にはあげていないので、ご連絡いただければプラグイン差し上げます…。