update_post_meta 中的错误?换弦

Bug in update_post_meta? String changing

当我尝试执行这段代码时

update_post_meta( $id, "_woocommerce_my_meta", 'a:1:{s:4:"gtin";s:13:"10";}' );

元正在更改为

s:27:"a:1:{s:4:"gtin";s:13:"10";}";

只需将代码更改为

update_post_meta( $id, "_woocommerce_my_meta", ':a:1:{s:4:"gtin";s:13:"10";}' );

在字符串末尾添加一个“:”,有效...

但我不需要这个“:” 这是一个功能错误吗?或者有什么理由吗?或者解决这个问题的方法?

这不是错误。 WordPress 这样做是有原因的。由于 WordPress 自动序列化对象和数组,因此它必须区分数据库 meta_value 是序列化和 meta_value 实际上只是一个看起来像序列化的字符串。要理解这一点,请注意 update_post_meta() 调用 maybe_serialize()

function maybe_serialize( $data ) {
  if ( is_array( $data ) || is_object( $data ) )
    return serialize( $data );

  // Double serialization is required for backward compatibility.
  // See https://core.trac.wordpress.org/ticket/12930
  // Also the world will end. See WP 3.6.1.
  if ( is_serialized( $data, false ) )
    return serialize( $data );

  return $data;
}

请注意,如果元值是序列化字符串,则会再次序列化。

update_post_meta() 和 get_post_meta() 自动处理对象和数组的序列化和反序列化。您确定需要在调用 update_post_meta() 时使用序列化值吗?请注意,get_post_meta() 将反序列化序列化字符串和 return 原始字符串。