在网站上写一个补充,想要修改购物车中的价格。有以下代码:
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。有人可以帮忙吗?
我忘记了应该参考的解决方案链接。您可以在函数顶部使用它:
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
很可能其他一些插件会挂钩“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 );
}
}
}
}
我已删除自定义计算后的操作。就是这样。
我看到了完全相同的问题 - 我的挂钩函数触发了两次,导致期权价格以成本的两倍添加。我的解决方案是加载产品,从中获取价格,然后添加我的增量成本。
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 );