woocommerce_before_calculate_totals 触发两次

问题描述 投票:0回答:3

在网站上写一个补充,想要修改购物车中的价格。有以下代码:

function apd_product_custom_price($cart_item_data, $product_id)
{
    if (isset($_POST['use_rewards']) && !empty($_POST['use_rewards'])) 
    {
       $cart_item_data['use_rewards'] = $_POST['use_rewards'];
    }
    return $cart_item_data;
}

add_filter('woocommerce_add_cart_item_data', 'apd_product_custom_price', 99, 2);

function apd_apply_custom_price_to_cart_item($cart_object)
{
   if( !WC()->session->__isset( 'reload_checkout' )) {
        foreach ($cart_object->cart_contents as $value) {
            if(isset($value['use_rewards'])) {
                $price = $value['data']->get_price() - 
   $value['use_rewards'];
                $value['data']->set_price($price);
            }
        }
    }

}
add_action('woocommerce_before_calculate_totals', 'apd_apply_custom_price_to_cart_item',10);

由于某种原因,钩子 woocommerce_before_calculate_totals 触发了两次。如果我用 echo 1 替换函数 apd_apply_custom_price_to_cart_item($cart_object) 中的代码;它在购物车页面中显示 11。有人可以帮忙吗?

php wordpress woocommerce
3个回答
5
投票

我忘记了应该参考的解决方案链接。您可以在函数顶部使用它:

if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
    return;

2
投票

很可能其他一些插件会挂钩“woocommerce_before_calculate_totals”操作。

尝试逐一禁用插件,看看是哪个插件导致了这种行为。

就我而言,我发现 WooCommerce 多语言插件与 woocommerce_before_calculate_totals 操作挂钩。

所以我这样做了:

add_action( 'woocommerce_before_calculate_totals', '_wm_ponc_upte_prc', 99 );
function _wm_ponc_upte_prc( $cart_object ) {
    if ( !WC()->session->__isset( "reload_checkout" ) ) {
        foreach ( WC()->cart->get_cart() as $key => $value ) {
            // checking if user checked checkbox (optional)
            if ( isset( $value['wm_ponc_fee'] ) && ( $value[ 'wm_ponc_fee' ] === 'yes' ) ) {
                // your calculations ....
                // and Remove your action after you are done.
                remove_action( 'woocommerce_before_calculate_totals', '_wm_ponc_upte_prc', 99 );
            }
        }
    }
}

我已删除自定义计算后的操作。就是这样。


1
投票

我看到了完全相同的问题 - 我的挂钩函数触发了两次,导致期权价格以成本的两倍添加。我的解决方案是加载产品,从中获取价格,然后添加我的增量成本。

function tbk_woo_update_option_price( $cart_object ) {

    $option_price = 3.50;
    foreach ( $cart_object->get_cart() as $cart_item_key => $cart_item ) {

            $item_id = $cart_item['data']->id;
            //Hook seems to be firing twice for some reason... Get the price from the original product data, not from the cart...
            $product = wc_get_product( $item_id );
            $original_price = $product->get_price();
            $new_price = $original_price + $option_price;
            $cart_item['data']->set_price( $new_price );
    }
}
add_action( 'woocommerce_before_calculate_totals', 'tbk_woo_update_option_price', 1000, 1 );
© www.soinside.com 2019 - 2024. All rights reserved.