【WordPress】カスタムフィールドのチェックボックスでのDB保存形式について

WordPressのカスタムフィールド実装に関して少し混乱したので備忘録としてまとめておきます。

カスタムフィールドのチェックボックスについて

カスタムフィールドはWordpressに追加できる柔軟な入力フィールドです。
テキストエリアやラジオボタンなどがありますが、チェックボックスもここに入ります。

それぞれの要素について扱いは少し異なるので、要注意です。

例えば

  • テキストエリアやプルダウンは文字列でDBに保存される
  • チェックボックスは「シリアライズ化」された配列になる

というのが大きな違いです。

WordPressは裏にデータベース(以降DBと記載)を持ちます。
そこにカスタムフィールドの値を登録するのですが、登録の仕方に違いがあります。

上記のような場合、ものすごくざっくりいうとDBには以下のように登録されます。

custom_field_id value
inkan
like a:3:{i:1;i:1;i:1;i:2;i:2;i:3;}

列の名前などは違うのですが、テキストボックスの場合はそのまま「要」と入ります。
しかし、チェックボックスでチェックした内容は変な形で登録されますね。
これがシリアライズ化です。

ちなみに、管理画面でチェックをして保存をするとチェックしたものはチェックを入れた状態にしたいですよね?
例えば今回ならば「りんご」「ぶどう」「いちご」はチェック済みが良いと思います。

このチェック済みに関しては

get_post_meta(get_the_ID(), “like”, true );

というように記載すると取り出すことが出来ます。

WordPressの関数はシリアライズ、アンシリアライズ(シリアライズされた配列を元に戻すこと)に対応しているので、困ることはないでしょう。

ただ、チェックボックスの値がどのようにDBに登録されているのかは覚えておく必要がありますね。

配列同士の比較には要注意!

ただ情報を登録するためのチェックボックスならば問題はありません。
カスタムフィールドで登録した情報を表示するだけならば関数はたくさんありますからね。

一方で、例えばチェックボックスで登録した内容を、チェックボックスで検索する場合には要注意です。
上記の例ですと、「好きなフルーツを選んでください」という質問で「ぶどう」「いちご」を選ばれた場合ですね。

この場合、対象となる投稿を表示する際に配列同士の比較になります。
DBに保存されている「りんご」「ぶどう」「いちご」と検索条件に指定した「ぶどう」「いちご」の比較ですね。

一応配列同士の比較はPHPでは可能なのですが、

WordPressでは配列同士の比較は非推奨となっています

もしもこのような仕組みになるなら、そもそもDBに保存する際に

custom_field_id value
like りんご
like ぶどう
like いちご

というように登録するべきだそうです。

要はDB上でシリアライズ化されてしまうので、シリアライズ化された配列とチェックボックスの配列は比較できないということですね。

一応シリアライズ化された配列を検索の際にアンシリアライズする方法もありますが、あまり推奨されていないようです。注意しましょう。