问题描述

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