问题描述
看 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。