0

当我尝试执行此代码时

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";}' );

在字符串末尾添加“:”,它可以工作......

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

4

1 回答 1

1

这不是一个错误。WordPress 有这样做的理由。因为,WordPress 自动序列化对象和数组,它必须区分作为序列化的数据库元值和实际上只是看起来像序列化的字符串的元值。要理解这个注释 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() 将反序列化序列化的字符串并返回原始字符串。

于 2017-10-04T00:17:14.593 回答