一般来说storing PHP serialized data in database in a bad idea. 如果在一个字段行中使用多个键值对的数据,也就是说,使用一个数组或一个具有一个元键的对象,就很容易理解。
将汽车成像为对象。例如,您可以设置多个元值来描述汽车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\'];
现在想象一下,你只想买红色的柴油车。你需要
all cars 他们的元数据来自数据库,并在所有汽车上循环,取消元数据的序列化并搜索运行柴油的白色汽车。这是
really bad.
另一方面,如果对每个元数据使用一个元键,例如:
$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 );
现在想象一辆车可以
available in multiple colors, 您可以这样做:
$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 );
}
}
现在,如果您想获得汽车的所有可用颜色,您需要
third parameter of get_post_meta()
set to 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 );
这是一个非常基本的例子,但我认为它说明了
use case where third parameter of get_post_meta()
makes sense, 所以我希望这能回答你的问题。
另一个例子可能是在另一个答案中披露的关于一天内演出几次的节目,例如电影院中的电影。您希望“开始时间”是一个转发器字段,而不是一个所有开始时间都存储为序列化数据的字段。
关于另一个问题:添加$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\' );