如何在不编辑插件的情况下删除WooCommerce class-wc-coupon.php
文件中is_valid
函数中的$this->validate_product_categories();
?
在函数中是否有任何钩子可以做到这一点.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;
}
谢谢
已更新
这是一个经过工作测试的代码(类别没有优惠券限制(,因此您必须从优惠券中删除这些类别设置。如果优惠券与添加到购物车的产品ID不匹配,则此代码将检查并删除优惠券(因为您只有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' );
}
}
}
代码进入功能.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;
}
代码进入功能.php活动子主题(或主题(的文件或任何插件文件中。
此代码应该有效。