Woocommerce购物车物品折扣在结帐时重置

时间:2019-02-04 11:09:25

标签: php wordpress woocommerce cart discount

我一直在尝试使用以下代码在我的商店中实现折扣:

add_action('woocommerce_before_calculate_totals', 'set_discount', 10 );

function set_discount( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    // Loop Through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // 50% items discount
        $cart_item['data']->set_price( $cart_item['data']->get_price() / 2 ); 
    }
}
  • 该代码在购物车页面上有效,可以享受折扣
  • 该代码在结帐页面上运行一两秒钟,但是当装货微调器最终确定折扣时,代码消失了,并显示了原始价格

似乎在结帐时,某些重复使用原始价格的标准AJAX请求覆盖了设置价格。我尝试使用具有相同结果的add_fee(),也尝试停用所有插件(当然,woocommerce除外),并且尝试切换到另一个主题-无效!

使用Wordpress 5.0.3,Woocommerce 3.5.4,Storefront 2.4.2的子主题


更新:添加了屏幕截图

1)这是在结帐时显示的内容,显示时间约为1-2秒:

SCREENSHOT 1


2)这是装载微调器完成后显示的内容-原始价格:

SCREENSHOT 2

2 个答案:

答案 0 :(得分:1)

自Woocommerce 3.2+起避免出现问题和错误的正确代码是:

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 );
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试并可以正常运行(在最新版本上进行了测试:Wordpress 5.0.x | Woocommerce 3.5.x | Storefront 2.4.x)

  

如果它不起作用,那是因为其他一些东西或自定义项正在与之交互。您需要首先检查Woocommerce>状态中是否有红色项目(其中所有被覆盖的模板最后都必须是最新的)

请参阅:Change cart item prices in Woocommerce 3

答案 1 :(得分:0)

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );

function add_custom_price( $cart_object ) {
    $custom_price = 10; // This will be your custome price  
    foreach ( $cart_object->cart_contents as $key => $value ) {
        $custom_price = ($value['data']->price)/2;
        //$value['data']->price = $custom_price;
        // for WooCommerce version 3+ use: 
         $value['data']->set_price($custom_price);
    }
}