$('#_product_color_gallery').val(JSON.stringify(galleryData));
在 JavaScript 中使用JSON.stringify()时,它会将 JavaScript 对象转换为标准的 JSON 字符串格式。例如,对于对象{white: [1392, 1391, 1390]},序列化后的结果就是{“white”:[1392,1391,1390]}。
存储数据库应为PHP 序列化格式
需将 JSON 字符串解析为 PHP 数组后存储
if (isset($_POST['_product_color_gallery'])) {
$json_data = $_POST['_product_color_gallery'];
$array_data = json_decode($json_data, true); // 解析为关联数组
if (json_last_error() === JSON_ERROR_NONE) {
// 解析成功,存储数组(WordPress会自动序列化)
$product->update_meta_data('_product_color_gallery', $array_data);
} else {
// 解析失败,可能数据被篡改,存储原始字符串(需谨慎)
$product->update_meta_data('_product_color_gallery', sanitize_text_field($json_data));
}
}
上面代码提取Json字符串时会被转义,$_POST[‘_product_color_gallery’] 的值
{"white":[1392,1391]}
变成了
{\"white\":[1392,1391]}
导致json_decode($json_data, true) 无法解析

所以要把json解析数组是,需先去掉转义字符
// 去除转义字符
$json_data = stripslashes($json_data);
解析数组成功后,执行$product->update_meta_data,数据库存储时,WordPress会自动将其序列化。查询sql如下:
select * from xs_postmeta where post_id = 1316;

get_meta()读取时,Wordpress会自动将其反序列化而成为数组
使用get_meta()读取时,得到的是反序列化后的数组,它既不是 JSON 字符串,也不是 PHP 序列化格式。
这时,如果使用woocommerce_wp_hidden_input输出隐藏的html,
在输出隐藏字段时,WordPress 期望_product_color_gallery的值是一个字符串,以便赋值于<input>标签属性value。但实际接收到的是一个数组,就会解析错误。
所以,确保在输出隐藏字段之前,先截取get_meta获取的数据,将数组序列化为 JSON,如下:
global $product_object;
// 获取元数据
$color_gallery = $product_object->get_meta('_product_color_gallery');
// 如果是数组,序列化为JSON字符串
if (is_array($color_gallery)) {
$color_gallery = json_encode($color_gallery);
}
woocommerce_wp_hidden_input(array(
'id' => '_product_color_gallery',
'class' => 'product-color-gallery-data',
'value' => $color_gallery
));
