カスタムフィールドの値がどのように格納されているかを理解するといろいろなことができるようになります。(知ってる人は知ってるんですけどね。)
この記事のコンテンツ:
カスタムフィールドの値を見てみよう
ほとんどの方は、WordPressでカスタムフィールドの実装はプラグインを使っているのではないでしょうか。
有名どころとしては、Advanced Custom Fields、Custom Field Templateでしょうか。
ちなみにわたしは、ほとんどはスクラッチで、ループ(画像を任意に複数設けるなど)だけ、その機能をフリーで提供しているCustom Field Suiteを使っています。
どのように実装しようとも(ここから本題)
カスタムフィールドの値は基本的に文字列ですが、その格納の方法は次の三種類です。
(1)文字列(単一)
(2)文字列(複数)
(3)文字列(配列がシリアライズされた値)
phpMyAdminでデータを覗いてみるとその格納状況が分かります。
カスタムフィールドの値(meta_value)を取得する
プラグインを使っているなら、その専用の取得(出力)方法がありますので、それぞれご確認ください。
ここでは、WordPressのもともとの関数(get_post_meta)を使った方法について取り上げます。(詳細はCodexを参照)
基本的な書式:
$meta_values = get_post_meta($post_id, $key, $single);
$post_id データを取得したい投稿のID
$key 取得したい値のキー名の文字列
$single 取得する結果の形式を指定(true → 文字列 false → 配列)
肝は$singleです。
前述の(1)文字列(単一)、(3)文字列(配列がシリアライズされた値)を取得するには、true を指定します。取得結果は:
// (1)文字列(単一)の取得結果 "ビジネス街" // (3)文字列(配列がシリアライズされた値)の取得結果 array(2) { [0]=> string(15) "ビジネス街" [1]=> string(9) "商店街" }
前述の(2)文字列(複数)の場合に、$singleを false に指定します。
// (2)文字列(複数)の取得結果 array(2) { [0]=> string(15) "ビジネス街" [1]=> string(9) "商店街" }
取得結果が(2)文字列(複数)、(3)文字列(配列がシリアライズされた値)が同じになるのも興味深いですね。
少し混乱するような説明になっていますが、実は・・・
チェックボックスは配列になる
カスタムフィールドの値がどのような方式で格納されているかを意識しなくても、プラグインを使ってチェックボックスを実装している場合は前述の(3)文字列(配列がシリアライズされた値)になっています。(基本的には)
チェックボックスの選択は配列の形でWordPressに渡され、WordPressは自動的にシリアライズして文字列かしてデータベースに格納しています。
// WordPressに渡される配列: array(2) { [0]=> string(15) "ビジネス街" [1]=> string(9) "商店街" } // WordPressがデータベースに格納する値: a:2:{i:0;s:15:"ビジネス街";i:1;s:9:"商店街";}
使用しているプラグインによっては異なる形式になりますので、ご自分で確認してくださいね。
配列が格納されたカスタムフィールドで絞り込み(meta_query)
今回の例で、「ビジネス街」を値として持つ記事(ID:127)を抽出するには
query_posts( array( 'meta_query' => array( array( 'key'=>'area', 'value'=>'ビジネス街', 'compare'=>'=' ) ) ) );
これでは、ID127の記事を抽出することはできません。
格納されている値は「a:2:{i:0;s:15:”ビジネス街”;i:1;s:9:”商店街”;}」であり、‘compare’=>’=’ ではヒットしません。このようなケースでは LIKE を使います。つまり
query_posts( array( 'meta_query' => array( array( 'key'=>'area', 'value'=>'"ビジネス街"', 'compare'=>'LIKE' ) ) ) );
雑感
今回の例はあくまでも投稿画面からカスタムフィールドの入力が前提でしたが、このようにどのように格納されるか取得できるか抽出するかを理解すると、いろいろ(?)できるようになります。
これらは便利なプラグインを使っているとなかなか応用が効きません。
user_metaもちょっと違いますが同じような仕様で、同じように応用できます。
たとえば、登録ユーザーがサイトにアクセスしたら、そのセッション情報をユーザーメタに日時と共に記録して一覧するなど。
この場合は配列で格納したいところです。そうなんです。カスタムフィールド(meta_value)に配列を格納できるんです。
何かおかしな点に気付かれましたら教えてくださいね。