将WooCommerce促销价格元数据复制到自定义字段报错求助
问题分析与代码修正
你遇到的问题核心是语法错误、逻辑运算符优先级问题以及WooCommerce对象数据持久化的遗漏,以下是具体问题拆解和修正方案:
一、第一段代码(获取canada_sale_price)的错误与修正
原代码存在三个关键问题:
- 括号不匹配:
if语句的条件括号未闭合,少了一个) - 逻辑运算符优先级错误:
$value = $product->get_meta(...) && !$product->get_meta(...)中,&&优先级高于=,导致实际是将逻辑判断的布尔值赋值给$value,而非获取到的元数据值 - 遗漏数据持久化:调用
update_meta_data后未执行save(),元数据不会写入数据库
修正后的代码:
// 先验证$product是有效的WC_Product对象 if ( is_a( $product, 'WC_Product' ) ) { // 用括号包裹赋值操作,确保先获取元数据再做逻辑判断 if ( ( $value = $product->get_meta( 'canada_sale_price', true ) ) && ! $product->get_meta( 'customfieldprice', true ) ) { $product->update_meta_data( 'customfieldprice', $value ); // 必须调用save()才能将修改写入数据库 $product->save(); } }
二、第二段代码(原生价格方法)的错误与修正
原代码的问题:
- 逻辑短路问题:
$value = $product->get_price() || $value = $product->get_regular_price()中,||是逻辑或,只要get_price()返回非空值,第二个赋值就不会执行,且最终$value是布尔值而非价格数值 - 数据持久化遗漏:同样未调用
save(),修改不会生效 - 方法选择问题:
get_price()返回的是当前生效的最终价格(可能已应用各种折扣),如果要区分促销价和常规价,应该用get_sale_price()和get_regular_price()
修正后的代码:
if ( is_a( $product, 'WC_Product' ) ) { // 优先获取促销价,无促销价则取常规价格 $value = $product->get_sale_price(); if ( empty( $value ) ) { $value = $product->get_regular_price(); } // 确保价格存在且目标字段为空时执行更新 if ( ! empty( $value ) && ! $product->get_meta( 'customfieldprice', true ) ) { $product->update_meta_data( 'customfieldprice', $value ); $product->save(); } }
关键注意事项
get_meta()的第二个参数设为true(默认值),确保返回单个元数据值而非数组- 所有对
WC_Product对象的元数据修改,必须调用$product->save()才能持久化到数据库 - 避免在条件判断中直接混用赋值和逻辑运算符,优先将赋值操作单独处理,避免优先级导致的意外结果
内容的提问来源于stack exchange,提问作者Oliver Bigras-Morin
相关产品推荐
相关产品推荐

