問題描述

get_post_meta()我總是記得將 $single 參數設置為 true 。我一般假設我正在設定一個價值,我期望得到這個價值。

Retrieve post meta field for a post.

  • $post_id (int) (Required) Post ID.
  • $key (string) (Optional) The meta key to retrieve. By default, returns data for all keys. Default value: ”
  • $single (bool) (Optional) Whether to return a single value. Default value: false

我知道這應該是一個理由存在的選擇,但我不知道為什麼會這樣。有人可以解釋為什麼默認情況下返回值為 array 嗎?從後向兼容性的角度看,是否有意義?或者有核心功能,要求它是這樣的效率,我不知道。

$prev_value 添加到 update_post_meta()可以創建數組元素的歷史嗎?

我會感激一個工作的例子,當這個,被設置為 false,是有道理的。這意味着代碼我可以測試。除了一個真正深思熟慮和研究的答案。這意味着我想要評論,如 TLC 想要磨砂。

最佳解決方案

一般來説,將數據庫中的 PHP 序列化數據存儲在一個壞主意中。如果您在一個字段行中使用多個 key-value 數據對,也就是使用一個數組或一個元鍵的對象,可以很容易地理解。

成像一輛汽車作為對象。您可以設置多個元值來描述汽車,例如 colorfuel 。您可以序列化數據並將其存儲在一個元字段 (僅一個元鍵) 中:

$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 );

在本示例中,您可以使用 get_post_meta()將第三個參數設置為 false;

$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'];

現在成像你想得到只有紅色的汽車 thar 運行柴油。您需要從數據庫中獲得所有車輛及其元數據,並循環遍歷所有車輛,將元數據排序,並搜索運行柴油的白車。這真的很糟糕

另一方面,如果您為每個元數據使用元鍵,例如:

$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 元鍵與序列化的數組。如果我們只想查詢一種可用的一種顏色的汽車,我們面臨着前面描述的相同問題。所以,最好將顏色存儲為轉發器元字段:

$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()的第三個參數設置為 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()的第三個參數是有意義的用例,所以我希望這回答你的問題。

另一個例子可能是在另一個答案中暴露的一些表演,在一天內進行了幾次,例如電影中的電影。您希望”starting times” 成為中繼器字段,而不是一個字段,所有的起始時間都存儲為序列化數據。

關於其他 quesiotn:將 $prev_value 添加到 update_post_meta()是否創建一個數組元素的歷史記錄?否。如果將 $prev_value 傳遞給 update_post_meta(),則只有具有該值的數據庫中的現有行將被更新; 如果未設置 $pre_value,則元鍵的所有行將被更新。

最後,如果要刪除汽車的所有可用顏色:

delete_post_meta( 458, 'car_colors' );

如果您只想刪除一個具有特定值的條目:

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。