特定の投稿タイプ内の投稿オブジェクトに投稿メタを使用する必要があるWebサイトで作業しています。
作成する新しい投稿オブジェクトに追加の設定を提供するために、特定の投稿タイプにメタボックスを追加することがよくあります。
あなたは今想像することができます、私は私の毎日の必要性のためにポストメタ管理をより簡単にするいくつかのクラスを作成しました。
私は、すべてのカスタムフィールドキーの前に常にプレフィックスを付けるという慣例を習得しました。私はいつも自分のイニシャルを使い、それからフィールドが何であるかについてのクイックリファレンスを使うことにしました。
たとえば、特定の投稿タイプのすべての投稿オブジェクトに表示設定を追加するとします。カスタムフィールドのキープレフィックスは、mbe_visibility_
のようになります。
それで、私がPostオブジェクトのための「グローバル」カスタムフィールドを持っていたら。 mbe_visibility_global
のようになります。
私は現在、Postオブジェクトのすべてのカスタムフィールドを取得し、返されたフィールドを繰り返し処理して、自分のフィールドキープレフィックス(mbe_visibility_
)を持つフィールドのみを除外する関数を持っています。
Global
、Post Types
、およびPosts
という3つのカスタムフィールドがある場合、それぞれPostオブジェクトを保存するときに指定した3つのキー(mbe_visibility_global
、mbe_visibility_post_types
、およびmbe_visibility_posts
)があります。
今ここに私の質問が定式化し始めるところです。
私は、WordPressコアやWebサイト上のその他の各種プラグインによって割り当てられたすべてのカスタムフィールドをフェッチ/フィルタリングすることで、ちょっとやりすぎだと感じています。
私は自分のカスタムフィールドのためにPost Metaを保存/参照する方法を変えることだけを考えていました。
各カスタムフィールドに新しいポストメタキーを保存する代わりに、そのポストオブジェクトの1つのポストメタキーにすべてのカスタムフィールドを保存します。
私のアプローチは、すべての$_POST
データを1つの配列にまとめることでした。したがって、メタボックスの入力フィールドは次のようになります。<input type="checkbox" name="mbe_visibility[general][global_visibility]" value="'.$value.'" />
それで今あなたがsave_post
にフックするとき、あなたはただ一つのキーが利用可能であるかどうか調べる必要があります。
if(isset($_POST['mbe_visibility']))
そしてその配列全体を1つのPost Metaキーに保存するだけです。
update_post_meta($post_id, 'mbe_visibility', $_POST['mbe_visibility'])
はおそらく保存前にデータをサニタイズ/検証するべきですが、これは一例です。
PostオブジェクトのPost Metaから私のカスタムフィールドを参照するためにやらなければならないことは、次のとおりです。get_post_meta($post_id, 'mbe_visibility', true)
と、このPostオブジェクトに特に必要なものを用意します。 WordPressのコアやその他の雑多なプラグインからの他のあらゆる種類の不要なポストメタ。
私の長い説明でそれを作ったのなら、質問は:データ管理を容易にするために、すべてのカスタムフィールドを1つのpostメタキーに格納するのは悪い考えですか? VS.各カスタムフィールドの個々の投稿メタキーに各カスタムフィールドを格納する
もちろん、私はあなたの答えを裏付ける推論と共に有効な説明を見たいです。
meta_key
/meta_value
で検索する必要がある場合は、それらを単一のキーに格納しないでください。単一のキーとして保存する場合は、データを serialized
の文字列などの形で保存する必要があります。あなたがそれを検索することができる唯一の方法はおそらくエラーを起こしやすいだろう非効率的な%LIKE%
クエリを介してであろう。あなたの値のいずれかでクエリを並べ替える必要がある場合、似たようなことが当てはまります。シリアル化された文字列から、人間的なアルファベット順または数値順に並べることはできません。データベースレベルで何らかの操作を行う必要があると思われる場合は、個別のmeta_keys
として保存してください。
しかし、必要なのは、meta_keyによってデータをデータベースからモノリシックブロックとして取り出すだけで十分です。