Php 在woocommerce__计算_总计挂钩之前,设置两次价格计算
我在我的网站上使用Woocommerce和活动门票插件,我必须硬编码一个选择字段,当客户购买门票时,根据他们的选择,价格会相应上涨 它的大部分似乎工作正常,然后选择被保存为购物车数据的一部分。然后,我尝试在他们单击“添加到购物车”按钮后更新产品价格,以便将新的价值添加到产品价格中 下面是我所拥有的,它似乎在更新价格,但令人恼火的是,它将Php 在woocommerce__计算_总计挂钩之前,设置两次价格计算,php,wordpress,woocommerce,cart,product,Php,Wordpress,Woocommerce,Cart,Product,我在我的网站上使用Woocommerce和活动门票插件,我必须硬编码一个选择字段,当客户购买门票时,根据他们的选择,价格会相应上涨 它的大部分似乎工作正常,然后选择被保存为购物车数据的一部分。然后,我尝试在他们单击“添加到购物车”按钮后更新产品价格,以便将新的价值添加到产品价格中 下面是我所拥有的,它似乎在更新价格,但令人恼火的是,它将$picku\u price值添加了两次(因此不是3而是6) 奇怪的是,如果我在basket阶段更改数量并进行更新,它会得到正确的值,而不是最初添加时的值 我做错
$picku\u price
值添加了两次(因此不是3而是6)
奇怪的是,如果我在basket阶段更改数量并进行更新,它会得到正确的值,而不是最初添加时的值
我做错了什么,如何防止这个问题
这是我的密码:
add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 1 );
function add_pickup_cost( $cart_object, $cart_item_data ) {
foreach ( $cart_object->get_cart() as $cart_item ) {
$wc_product = $cart_item['data'];
// My custom field which is returning the additional cost
$pickup_price = $cart_item['pickupOptions'];
$product_price = method_exists( $wc_product, 'get_price' ) ? floatval($wc_product->get_price()) : floatval($wc_product->price);
$new_price = $product_price + $pickup_price;
method_exists( $wc_product, 'set_price' ) ? $wc_product->set_price( $new_price ) : $wc_product->price = $new_price;
}
}
您遗漏了一些小东西,我将您的代码简化了一点:
add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 2 );
function add_pickup_cost( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item ) {
if( isset( $cart_item['pickupOptions'] ) && ! empty( $cart_item['pickupOptions'] ) ){
// WC_Product object instance
$product = $cart_item['data'];
// Get cart item price
$price = method_exists( $product, 'get_price' ) ? floatval($product->get_price()) : floatval($product->price);
$price += (float) $cart_item['pickupOptions']; // Add "Pickup option to the price
// Set the new price
if( method_exists( $product, 'set_price' ) )
$product->set_price( $price )
else
$product->price = $price;
}
}
}
代码位于活动子主题(或主题)的function.php文件或任何插件文件中
已测试并正常工作。@LocicTheAztec感谢您的回复。我尝试过使用您的代码,但不幸的是,它仍然两次添加额外的“pickupOptions”值(因此,不是添加3英镑,而是添加6英镑)。@WillL对我来说,此代码工作正常。没有重复…因此可能是某个特定的地方导致了您的问题。@奇怪的是,当我单击购物车上的“更新购物车”按钮或刷新购物车时,价格会更新到正确的金额。但从最初添加到购物车,当它把我带到那里时,它显示它添加了两倍的价格。知道这是为什么吗?或者我可以在添加到购物车后强制更新/刷新吗?@will这个问题似乎很难解决,因为它可能与您的主题、某个特定插件或其他自定义代码有关。。。