web-dev-qa-db-ja.com

Get_post_metaの$ singleパラメータのポイントは何ですか?

get_post_meta() を見て、私は常に$singleパラメータをtrueに設定することを忘れないでください。私は一般的に値を設定していると思いますし、その値を取り戻すことを期待しています。

投稿の投稿メタフィールドを取得します。

  • $ post_id (int)(必須)投稿ID。
  • $ key (文字列)(オプション)取得するメタキー。デフォルトでは、すべてのキーのデータを返します。デフォルト値: ''
  • $ single (ブール値)(オプション)単一の値を返すかどうか。デフォルト値:false

私はこれが理由の選択肢として存在すべきであることを知っていますが、それがなぜなのか私は個人的に知りません。なぜこれがデフォルトで値のarrayを返すのか、誰かが説明できますか?後方互換性の観点からは意味がありますが、事態は進化したのでしょうか。または私が気付いていない効率のためにこのようにすることを必要とするコア機能がありますか。

update_post_meta()$prev_valueを追加すると、配列要素として履歴が作成されますか?

falseに設定されていることが意味を成す場合の working の例を感謝します。それは私がテストできるコードを意味します。に加えて、本当によく考え抜かれた答えを答えました。それは私がTLCがスクラブを望んでいるように私がコメントを欲していることを意味します。

6
jgraup

一般的に、PHPシリアル化されたデータを悪い考えでデータベースに保存。 1つのフィールド行で複数のキーと値のデータのペアを使用する場合、つまり、1つのメタキーを持つ配列またはオブジェクトを使用する場合、簡単に理解できます。

車をオブジェクトとしてイメージングします。 colorfuelなど、複数のメタ値を設定して車を説明できます。データをシリアル化し、1つのメタフィールド(1つのメタキーのみ)に保存できます。

$metadata = array(
    'color' => 'white',
    'fuel'  => 'diesel'
);
// as it is an array, $metadata will be serialized automatically by WordPRess
update_post_meta( 458, 'car_meta', $metadata );

この例では、3番目のパラメーターをfalseに設定してget_post_meta()を使用できます。

$carmeta = get_post_meta( 458, 'car_meta', false );
// Serialized meta is unserialized automatically by WordPress
echo $carmeta[0]['color'];
echo $carmeta[0]['fuel'];

または、trueで使用できますが、大きな違いはありません。

$carmeta = get_post_meta( 458, 'car_meta', true );
echo $carmeta['color'];
echo $carmeta['fuel'];

今、あなたはディーゼルを走らせる赤い車だけを手に入れたいと思っています。 すべての車とそのメタデータをデータベースから取得し、すべての車をループし、メタデータのシリアル化を解除し、ディーゼルを実行する白い車を検索する必要があります。これは本当に悪いです。

一方、各メタデータにメタキーを使用する場合、たとえば:

$metadata = array(
    'car_color' => 'white',
    'car_fuel'  => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

探しているものをデータベースから直接取得できます。

$args = array(
    'meta_query' => array(
        'relation'  => 'AND',
         array(
             'key'   => 'car_color',
             'value' => 'red'
         ),
         array(
             'key'   => 'car_fuel',
             'value' => 'diesel'
         )
    )
);

$query = new WP_Query( $args );

車が複数の色で利用可能になりうることをイメージして、これを行うことができます:

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}

これで、シリアル化された配列を持つcar_colorsメタキーができました。 1つの色で利用可能な車のみを照会する場合、前述の同じ問題に直面します。そのため、色をリピーターメタフィールドとして保存することをお勧めします。

$metadata = array(
    'car_colors' => array( 'red', 'white' ),
    'car_fuel'   => 'diesel'
);
foreach( $metadata as $key => $value ) {
    if( is_array( $value ) ) {
        foreach( $value as $val ) {
            // We add multiiple meta fields with the same meta key
            add_post_meta( 458, $key, $val );
        }
    } else {
        update_post_meta( 458, $key, $value );
    }
}

車の利用可能なすべての色を取得したい場合は、get_post_meta()の3番目のパラメーターをfalseに設定が必要です。trueに設定すると、最初の利用可能な色のみが取得されますその車のデータベースで見つかりました。

// This gets only the first car_colors entry found in database for car 458
$available_colors = get_post_meta( 458, 'car_colors', true );
// This gets all the car_colors entries for car 458
$available_colors = get_post_meta( 458, 'car_colors', false );

これは非常に基本的な例ですが、get_post_meta()の3番目のパラメーターが意味をなすユースケースを示していると思うので、これがあなたの質問に答えることを望みます。

別の例としては、映画館の映画など、1日に数回行われるショーに関する別の回答で公開されたものがあります。 「開始時間」は、すべての開始時間がシリアル化されたデータとして保存される1つのフィールドではなく、リピーターフィールドにする必要があります。

他の質問について:$prev_valueupdate_post_meta()に追加すると、配列要素として履歴が作成されますか?いいえ。$prev_valueupdate_post_meta()に渡すと、その値を持つデータベース内の既存の行のみが更新されます。 $pre_valueが設定されていない場合、メタキーのすべての行が更新されます。

最後に、車の使用可能なすべての色を削除する場合:

delete_post_meta( 458, 'car_colors' );

また、特定の値を持つエントリを1つだけ削除する場合:

delete_post_meta( 458, 'car_colors', 'white' );
11
cybmeta