メタデータの追加
メタデータの追加は、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など)を渡す際には注意が必要です。
JSON値 {"key":"value with \"escaped quotes\""}
を考慮してください:
$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""}
*/
回避策
関数 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は、カスタムフィールドリストに「_」(アンダースコア)で始まる meta_key
を持つカスタムフィールドを表示しないことに注意することが重要です。投稿編集画面や the_meta() テンプレート関数を使用する際に表示されません。
これは、add_meta_box() 関数を使用して、これらのカスタムフィールドを異常な方法で表示するのに役立ちます。
以下の例では、meta_key
名の「_color」と meta_value
の「red」を持つユニークなカスタムフィールドを追加しますが、このカスタムフィールドは投稿編集画面には表示されません:
add_post_meta( 68, '_color', 'red', true );
隠し配列
さらに、meta_value
が配列である場合、meta_key
名にアンダースコアを付けなくても、ページ編集画面には表示されません。