メタデータの追加
メタデータの追加は、add_post_meta()
で簡単に行うことができます。この関数は post_id
、meta_key
、meta_value
、そして unique
フラグを受け付けます。
meta_key
は、プラグインがコードの他の場所でメタ値を参照する方法です。mycrazymetakeyname
のようなものでも良いですが、プラグインやテーマに関連する接頭辞の後にキーの説明をつけると、より便利です。wporg_featured_menu
などが良いかもしれません。メタデータのバリエーションを保存するために、同じ meta_key
を複数回使用できることに注意してください (下記のユニークフラグを参照)。
meta_value
には、文字列、整数、配列を指定できます。配列の場合は、データベースに格納する前に自動的にシリアライズされます。
unique
フラグにより、このキーがユニーク (一意) であるか否かを宣言できます。「非」ユニークキーとは、価格のように、投稿が複数のバリエーションを持つことができるキーのことです。
投稿には価格を 1つ だけ持たせたい場合は、unique
フラグを立て、meta_key
の値は1つだけ保持できるようにします。
メタデータの更新
キーがすでに存在していて、それを更新したい場合は、update_post_meta()
を使用します。この関数を使用し、キーが存在 しない 場合は、add_post_meta()
を使用した際と同じように、キーが作成されます。
add_post_meta()
と同様に、この関数は post_id
、meta_key
、meta_value
を受け付けます。また、オプションで prev_value
を指定でき、この値が指定された場合、この関数は、既存のメタデータ・エントリのみを、この値で更新します。この値が指定されない場合、関数はデフォルトですべてのエントリを更新します。
メタデータの削除
delete_post_meta()
は、post_id
、meta_key
、そしてオプションで meta_value
を受け取ります。これは、名前が示すとおりのことを行います。
文字エスケープ
投稿メタの値は、保存時に stripslashes()
関数を通して渡されるため、エスケープされた文字を含む可能性のある値 (JSON など) を渡す際には注意が必要です。
{"key":"value with \"escaped quotes\""}
という JSON 値を考えてみましょう:
$escaped_json = '{"key":"value with \"escaped quotes\""}';
update_post_meta( $id, 'escaped_json', $escaped_json );
$broken = get_post_meta( $id, 'escaped_json', true );
/*
$broken, after stripslashes(), ends up unparsable:
{"key":"value with "escaped quotes""}
*/
回避方法
(WordPress 3.6で導入された) 関数 wp_slash()
を使って、もう1段階エスケープを追加することで、stripslashes()
の呼び出しを補うことができます:
$escaped_json = '{"key":"value with \"escaped quotes\""}';
update_post_meta( $id, 'double_escaped_json', wp_slash( $escaped_json ) );
$fixed = get_post_meta( $id, 'double_escaped_json', true );
/*
$fixed, after stripslashes(), ends up as desired:
{"key":"value with \"escaped quotes\""}
*/
非表示のカスタムフィールド
プラグインやテーマの開発者で、カスタムフィールドを使ってパラメータを格納しようと考えている場合、WordPress では、投稿編集画面や get_post_meta()
テンプレート関数のカスタムフィールド一覧で、meta_key
が「_」(アンダースコア) で始まるカスタムフィールドは表示されないことに注意してください。
これは、add_meta_box()
関数を使用して、これらのカスタムフィールドを通常とは異なる方法で表示するのに便利です。
以下の例では、meta_key
の名前が ‘_color’、meta_value
が ‘red’ のユニークなカスタムフィールドが追加されますが、このカスタムフィールドは投稿編集画面には表示されません:
add_post_meta( 68, '_color', 'red', true );
非表示の配列
また、meta_value
が配列の場合、meta_key
の名前の前にアンダースコアを付けなかったとしても、ページ編集画面には表示されません。