为什么 update_post_meta 会更改我的元键值?
Why does update_post_meta change the value of my meta key?
当我使用 update_post_meta() 函数更改键的值时:
- 当它是一个普通的字符串时它可以工作
- 但是当字符串与 JSON 文件相同时,它会附加一些额外的字符串。
例如,当我保存这个字符串时:
a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}
它保存在 wp_postmeta table 上为:
s:162;"a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}"
当我使用短字符串时没有问题。如何解决这个问题?
我的代码:
$edd_files='a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}';
update_post_meta($download_id,'edd_download_files',$edd_files);
发生这种情况的原因是因为 update_post_meta()
序列化了您作为第三个参数传递的值(参见 update_metadata())。
您的 $edd_files
变量是一个 serialized 数组 - 不是“JSON 文件”- update_post_meta()
正在再次序列化它 在将其保存到数据库之前,因此您的序列化字符串会发生这样的变化。
我不知道你为什么要分配 $edd_files
序列化字符串,但你可以在将其保存为 post 之前使用 maybe_unserialize() 函数将其转换回数组meta 然后该值将按预期作为序列化字符串保存在数据库中:
$edd_files = 'a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}';
// Convert serialized string back into an array
$edd_files = maybe_unserialize($edd_files);
update_post_meta($download_id, 'edd_download_files', $edd_files);
结果:
当我使用 update_post_meta() 函数更改键的值时:
- 当它是一个普通的字符串时它可以工作
- 但是当字符串与 JSON 文件相同时,它会附加一些额外的字符串。
例如,当我保存这个字符串时:
a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}
它保存在 wp_postmeta table 上为:
s:162;"a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}"
当我使用短字符串时没有问题。如何解决这个问题?
我的代码:
$edd_files='a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}';
update_post_meta($download_id,'edd_download_files',$edd_files);
发生这种情况的原因是因为 update_post_meta()
序列化了您作为第三个参数传递的值(参见 update_metadata())。
您的 $edd_files
变量是一个 serialized 数组 - 不是“JSON 文件”- update_post_meta()
正在再次序列化它 在将其保存到数据库之前,因此您的序列化字符串会发生这样的变化。
我不知道你为什么要分配 $edd_files
序列化字符串,但你可以在将其保存为 post 之前使用 maybe_unserialize() 函数将其转换回数组meta 然后该值将按预期作为序列化字符串保存在数据库中:
$edd_files = 'a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}';
// Convert serialized string back into an array
$edd_files = maybe_unserialize($edd_files);
update_post_meta($download_id, 'edd_download_files', $edd_files);
结果: