
本文详解如何在 WordPress 中正确获取存储为 JSON 字符串的自定义字段(meta)值,重点解决因未解析 JSON 导致 get_post_meta() 返回空或错误数据的问题,并提供安全、健壮的解码与取值方案。
本文详解如何在 wordpress 中正确获取存储为 json 字符串的自定义字段(meta)值,重点解决因未解析 json 导致 `get_post_meta()` 返回空或错误数据的问题,并提供安全、健壮的解码与取值方案。
你遇到的问题很典型:festiUserRolePrices 这个 meta key 存储的并非纯字符串或数字,而是一个 JSON 格式的字符串(如 {"cash_elit_car":"445", ...})。但你在代码中直接用 get_post_meta($product->get_id(), 'cash_elit_car', true) 去查——这相当于在数据库里找一个叫 'cash_elit_car' 的独立 meta key,而实际上它只是 JSON 内部的一个字段名,并非数据库中的真实键名。
✅ 正确做法是:
- 先通过
get_post_meta()获取完整的 JSON 字符串(使用正确的 meta key:'festiUserRolePrices'); - 再用
json_decode()解析为 PHP 对象或数组; - 最后从中提取
cash_elit_car的值。
以下是推荐的完整实现(含错误处理,生产环境可用):
// ✅ 正确获取并解析 JSON meta 值
$raw_json = get_post_meta($product->get_id(), 'festiUserRolePrices', true);
// 检查 meta 是否存在且非空
if (empty($raw_json)) {
$cash_elit_car = ''; // 或设默认价格,如 $product->get_price()
} else {
// 安全解码:true → 转为关联数组;false(默认)→ 转为 stdClass 对象
$data = json_decode($raw_json, true);
// 检查 JSON 解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('Invalid JSON in festiUserRolePrices for product ID: ' . $product->get_id());
$cash_elit_car = '';
} else {
// 安全取值:使用 null 合并操作符(PHP 7.4+)或 array_key_exists()
$cash_elit_car = $data['cash_elit_car'] ?? '';
// 或兼容旧版写法:
// $cash_elit_car = !empty($data['cash_elit_car']) ? $data['cash_elit_car'] : '';
}
}? 关键注意事项:
- ❌ 错误示范:
get_post_meta($id, 'cash_elit_car', true)—— 此 key 在数据库中并不存在,必然返回空; - ✅ 正确 key 是
'festiUserRolePrices',它是 JSON 的容器; - ? 始终校验
json_decode()结果,避免null或解析失败导致 Notice/Waring; - ? 若需频繁访问多个字段(如
elite_car、salePrice.cash_elit_car),可封装为复用函数; - ⚠️ JSON 中的数值以字符串形式存储(如
"445"),如需参与数学运算,请显式转换:(float) $cash_elit_car。
总结:WordPress 自定义字段本身不支持嵌套结构,JSON 是常见变通方案,但开发者必须主动承担「序列化 ↔ 解析」的责任。掌握 json_decode() + 空值防护,即可稳健提取任意层级的数据。


















