You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 18:06:08