問題描述
看 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 資料對,也就是使用一個陣列或一個元鍵的物件,可以很容易地理解。
成像一輛汽車作為物件。您可以設定多個元值來描述汽車,例如 color 和 fuel 。您可以序列化資料並將其儲存在一個元欄位 (僅一個元鍵) 中:
$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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。