一段时间以来,我一直在尝试在WooCommerce商店上实施自定义折扣,方法是循环所有产品并使用set_price()
设置新价格,或者通过使用add_fee()
添加负费用。两种方法都可以在购物车页面上使用,但是在结帐时,我可以看到几秒钟的折扣价,但是当纺车最终确定旧的正常价格时,它取代了折扣(费用完全消失了)。
我在childs functions.php中尝试过的许多代码示例:
add_action('woocommerce_before_calculate_totals', 'cart_item_discount', 10, 1 );
function cart_item_discount( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Loop Through cart items
foreach ( $cart->get_cart() as $cart_item ) {
$original_price = $cart_item['data']->get_price(); // Get original product price
$discounted_price = $original_price / 2; // 50 % of discount
$cart_item['data']->set_price( $discounted_price );
}
}
我一直在进行故障排除,据我所知,进入结帐后的1-2秒内,通过?wc-ajax=update_order_review
进行AJAX调用,这是导致覆盖的原因。呼叫返回状态200,其中包含片段,这些片段包含旧的常规价格而不是新的常规价格。
如何在结帐页面上禁用此AJAX通话,以便折扣代码正常工作?
我在本地和生产服务器上都尝试过。我尝试用新数据库安装新的全新WordPress / WooCommerce安装,删除了所有其他插件。使用WordPress 5.0.3,WooCommerce 3.5.4,Storefront 2.4.2的子主题。