woocommerce_after_calculate_totals无法更新购物车项目价格

时间:2020-08-27 14:05:33

标签: php wordpress woocommerce

我要达到的目标是,如果用户在购物车中添加了特殊产品,其价格应更改为零

这是我用来更新购物车价格的简单代码段,但

add_action('woocommerce_before_calculate_totals','set_bonus_product_pice');
function set_bonus_product_pice($cart_object){
     if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;

       $free_product_ID = 10;
       foreach ( $cart_object->cart_contents as $key=>$cart_item) { 
           if($cart_item['product_id'] == $free_product_ID){
                 $cart_item['data']->set_price(0);
                 break;
           }
        }
 }

Woocommerce版本为4.3

在上面的代码中,如果条件和价格被正确调用,并且调用价格在产品对象的更改键下设置新价格,则进入内部,进一步调试它可以正常工作,直到在class-wc-cart.php中调用wc_get_price_exception_tax方法为止文件,以及wc_get_price_clusion_tax方法如何从产品对象中删除更改。

我也尝试了各种变化,例如,而不是使用 直接使用$ cart_object我使用$ woocommerce-> get_cart()。 相同的解决方案以前对我有用,但不确定是否是由于最新版本的woocommerce的更改

1 个答案:

答案 0 :(得分:0)

更改$ cart_item ['data']-> set_price(0);改为$ value ['data']-> price = $ custom_price;

检查以下代码。

add_action( 'woocommerce_before_calculate_totals', 'set_bonus_product_pice', 20, 1 );
function set_bonus_product_pice( $cart_object ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $custom_price    = 10; // This will be your custome price  
    $free_product_ID = 10;
    
    foreach ( $cart_object->get_cart() as $item ) {
        if ( $item['product_id'] == $free_product_ID ) {
            $item['data']->set_price( $custom_price );
        }
    }
}