如何将PHP变量传入add_cart_item_data函数修改WooCommerce商品价格
问题原因
- 你的代码中
$num的赋值逻辑位于某段函数内部(从代码里多余的闭合}可判断),即便声明global,当woocommerce_add_cart_item_data钩子执行时,你之前赋值$num的代码段大概率没有被执行,全局作用域下的$num始终为空。 global关键字的正确用法是先在作用域内声明、再赋值,你当前先赋值再写global $num的写法本身无效。- 数据库取出的
TextBox3字段值默认是字符串类型,未做类型转换直接做数学运算也可能导致结果异常。
解决方案
最稳妥的方式是把获取$num的查询逻辑直接写到钩子函数内部,完全规避跨作用域传值的问题,同时增加异常判断和类型转换:
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 3 ); function add_cart_item_data( $cart_item_data, $product_id, $variation_id ) { // 引入全局pdo实例,同时给$num设置默认值避免查询失败报错 global $pdo; $num = 0; if ($pdo) { $sth = $pdo->prepare("SELECT TextBox3 FROM wprd1 ORDER BY id DESC LIMIT 1"); $sth->execute(); $result = $sth->fetch(PDO::FETCH_ASSOC); if ($result && isset($result['TextBox3'])) { $num = (float)$result['TextBox3']; // 强制转换为数值类型 } } $product = wc_get_product( $product_id ); $price = $product->get_price(); if( ! empty( $_POST['extra_pack'] ) ) { $cart_item_data['new_price'] = $price + 15 + $num; } return $cart_item_data; }
修改后原来外部的$num查询赋值代码可以直接删除。
补充优化
如果需要在多处复用这个费用值,不想重复写SQL,可以封装成独立的辅助函数:
function get_custom_extra_fee() { global $pdo; $num = 0; if ($pdo) { $sth = $pdo->prepare("SELECT TextBox3 FROM wprd1 ORDER BY id DESC LIMIT 1"); $sth->execute(); $result = $sth->fetch(PDO::FETCH_ASSOC); $num = $result ? (float)$result['TextBox3'] : 0; } return $num; }
后续需要用到该数值的地方直接调用get_custom_extra_fee()即可。
内容的提问来源于stack exchange,提问作者hexphp111
相关产品推荐
相关产品推荐

