2017-04-04 36 views
2

is_valid功能核心代码如何删除is_valid功能$this->validate_product_categories();在WooCommerce class-wc-coupon.php文件,而无需编辑插件?旁路validate_product_categories()在类WC_Coupon

在functions.php中有这样做的钩子吗?

这里是class-wc-coupon.php的源代码:

/** 
    * Check if a coupon is valid. 
    * 
    * @return boolean validity 
    * @throws Exception 
    */ 
    public function is_valid() { 
     try { 
      $this->validate_exists(); 
      $this->validate_usage_limit(); 
      $this->validate_user_usage_limit(); 
      $this->validate_expiry_date(); 
      $this->validate_minimum_amount(); 
      $this->validate_maximum_amount(); 
      $this->validate_product_ids(); 
      $this->validate_product_categories(); 
      $this->validate_sale_items(); 
      $this->validate_excluded_items(); 
      $this->validate_cart_excluded_items(); 

      if (! apply_filters('woocommerce_coupon_is_valid', true, $this)) { 
       throw new Exception(self::E_WC_COUPON_INVALID_FILTERED); 
      } 
     } catch (Exception $e) { 
      echo $this->error_message = $this->get_coupon_error($e->getMessage()); 
      return false; 
     } 

     return true; 
    } 

感谢

+0

为什么要删除它?你可以更新插件,并检查是否有任何问题,并可以联系支持论坛的问题。强烈推荐。 –

+0

回到你的问题的解决方案,在你的* functions.php *我想你需要覆盖这个功能。像这样的http://hookr.io/filters/woocommerce_coupon_is_valid/不知道。 –

+0

也检查这一次http://stackoverflow.com/questions/21397325/want-to-overwrite-functions-written-in-woocommerce-functions-php-file –

回答

1

更新

这是一个工作的测试代码(不用于类优惠券限制),所以你会必须从您的优惠券中删除这些类别设置。此代码将检查和删除优惠券,如果它不符合产品编号添加到购物车(因为你只有6种产品在2类)。

这里是代码:

add_action('woocommerce_before_calculate_totals', 'custom_check_coupons', 10, 1); 
function custom_check_coupons($cart_obj) { 
    $coupons_in_cart = $cart_obj->get_applied_coupons(); 

    if(! empty($coupons_in_cart)){ 

     // Set below your coupon slugs and your corresponding product IDs 
     $coupon1 = 'couponslug1'; // Coupon group 1 
     $product_ids_1 = array(56, 53, 50); // Product Ids for coupon group 1 
     $coupon2 = 'couponslug2'; // Coupon group 2 
     $product_ids_2 = array(24, 38, 44); // Product Ids for coupon group 2 

     $coupon_match = false; 

     foreach($cart_obj->get_cart() as $cart_item_key => $cart_item_values) { 
      $product_id = $cart_item_values['product_id']; 
      if (in_array($product_id, $product_ids_1)){ 
       if(in_array($coupon1, $coupons_in_cart)){ 
        $coupon_match = true; 
       } 
      } elseif (in_array($product_id, $product_ids_2)){ 
       if(in_array($coupon2, $coupons_in_cart)){ 
        $coupon_match = true; 
       } 
      } 
     } 
     if(! $coupon_match){ 
      foreach($coupons_in_cart as $coupon){ 
       $cart_obj->remove_coupons($coupon); 
       break; 
      } 
      // (optional) displaying a notice 
      wc_add_notice(__('The coupon "'.$coupon.'" can’t be used and has been removed', 'woocoommerce'), 'error'); 
     } 
    } 
} 

的代码放在你的活跃儿童主题(或主题)的function.php文件或也以任何插件文件。


你应该尝试使用woocommerce_coupon_is_valid过滤钩子钩住这个自定义函数,除去优惠券验证为$this->validate_product_categories()情况:

add_filter('woocommerce_coupon_is_valid', 'remove_product_cat_coupon_validation', 1, 2); 
function remove_product_cat_coupon_validation($valid, $coupon){ 
    if(! $coupon->validate_product_categories()) $valid = true; 
} 

的代码放在function.php文件您的活动孩子主题(或主题)或任何插件文件中。

此代码应该工作。

+0

它不是为我工作 – sarun

+0

不适合我的工作我想删除从私有函数validate_product_categories)抛出新的异常(如果(!$ valid_for_cart){ \t \t \t \t抛出新的异常( self :: E_WC_COUPON_NOT_APPLICABLE); \t \t \t} – sarun