2017-07-03 98 views
0

我有一个正常工作的功能,除了在购物车中显示两次通知而不是一次。该功能应用折扣并显示通知。该函数查找特定类别的项目会增加总额,如果它符合折扣金额,则应用折扣并显示通知。现在,即使购物车中只有一件商品,它也会显示两次通知。Woocommerce购物车提示多次显示

我试过添加wc_clear_notices(),但是会清除我需要的其他通知,例如类别上最小订单金额的最小最大通知。如果我在函数的开始处或任何foreach语句中添加wc_clear_notices(),它将在其显示前清除其他最小/最大通知。

这里有一些问题我已经看过,但只是说使用wc_clear_notices()这是行不通的,因为其他通知被清除:

WooCommerce Notice, run only once

Show wc_add_notice only one time

下面的代码我目前有正确的折扣项目和显示通知,但显示通知两次而不是一次:

//apply discounts to foil and seal product categories 
add_action('woocommerce_before_calculate_totals', 'cart_count_foil_seal_items',10,1); 

function cart_count_foil_seal_items($cart_object) { 
$seal_prod_tally = 0; 
$foil_prod_tally = 0; 
// Iterating through each item in cart 
foreach ($cart_object->get_cart() as $item_values) { 
    // Get cart item data 
    $item_id = $item_values['data']->get_id(); // Product ID 
    $item_qty = $item_values['quantity']; // Item quantity 

    // Getting the object 
    $product = new WC_Product($item_id); 
    $prod_cat = wp_get_post_terms($product->get_id(),'product_cat',array('fields'=>'slugs')); 

    //tally total 
    if (in_array('seal-stickers', $prod_cat)){ 
     $seal_prod_tally += $item_qty; 
    }else if(in_array('foil-badges', $prod_cat)){ 
     $foil_prod_tally += $item_qty; 
    } 
} 

foreach ($cart_object->get_cart() as $item_values) { 

    //Get cart item data 
    $item_id = $item_values['data']->get_id(); // Product ID 
    $item_qty = $item_values['quantity']; // Item quantity 

    // Getting the object 
    $product = new WC_Product($item_id); 
    $prod_cat2 = wp_get_post_terms($product->get_id(),'product_cat',array('fields'=>'slugs'));   

    //apply discount to each item within category 

     if (in_array('seal-stickers',$prod_cat2)){ 

     switch ($seal_prod_tally){ 
      case 20000: 
       $item_values['data']->set_price(1327.01/20000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 20,000 at $1327.01.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      case 30000: 
       $item_values['data']->set_price(1578.65/30000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 30,000 at $1578.65.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      case 40000: 
       $item_values['data']->set_price(1853.05/40000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 40,000 at $1853.05.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      case 50000: 
       $item_values['data']->set_price(2126.76/50000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 50,000 at $2126.76.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      case 60000: 
       $item_values['data']->set_price(2405.98/60000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 60,000 at $2405.98.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      default: 
       break; 
     }   
    }else if (in_array('foil-badges',$prod_cat2)){ 
     switch ($foil_prod_tally){ 
      case 25000: 
       $item_values['data']->set_price(5872.63/25000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 25,000 at $5872.63.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      case 50000: 
       $item_values['data']->set_price(10815.47/50000); 
       if(!is_checkout()){ 
        wc_add_notice( 
          sprintf('Quantity discount has been applied to item %s: 50,000 at $10815.47.', $item_values['data']->get_title() 
          ), 'notice' 
        ); 
       } 
       break; 
      default: 
       break; 
     }    
    }  
} 

} 

Screenshot of Duplicated Notice in Cart

+0

感谢您澄清。它看起来像它添加费用显示的通知实际上低于购物车的运费,这不会起作用,特别是如果我有多个通知。 :/ [计算费用通知的屏幕截图](https://i.gyazo.com/8300cc90915c83ca3ae73723b63e3b3c.png) – Mark

+0

看起来我需要检查在此函数运行后是否应用了折扣,然后显示通知?你有什么想法吗?也许一个会话变量绑在购物车中? – Mark

+0

如果我不清楚,我很抱歉。我没有使用你的代码示例。 add_fee()添加低于运费的折扣,这是不起作用的。我在问,除了add_fee()例子之外,你是否还有其他选择。 – Mark

回答

0

当客户使用更新购物车按钮更新购物车时发生多个通知,因此每次客户点击更新购物车按钮时,快速解决方案都会简单地清除通知。

最好从源头上解决问题,找到一种不重复的方式显示通知,但在此之前这会得到预期的效果。

//clear notices on cart update 
function clear_notices_on_cart_update() { 
    wc_clear_notices(); 
}; 

// add the filter 
add_filter('woocommerce_update_cart_action_cart_updated', 'clear_notices_on_cart_update', 10, 1); 
相关问题