首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类validate_product_categories的is_valid函数核心代码中绕过WC_Coupon ()

在类validate_product_categories的is_valid函数核心代码中绕过WC_Coupon ()
EN

Stack Overflow用户
提问于 2017-04-04 12:09:16
回答 1查看 1.2K关注 0票数 2

如何在不编辑插件的情况下删除$this->validate_product_categories();is_valid函数中的WooCommerce class-wc-coupon.php文件?

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

以下是class-wc-coupon.php的源代码

代码语言:javascript
复制
/**
     * 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;
    }

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-04-04 17:01:57

更新的

这是一个有效的测试代码(类别没有优惠券限制),所以您必须从您的优惠券中删除这些类别设置。此代码将检查和删除优惠券,如果它不匹配产品Id添加到购物车(因为你只有6个产品,在2个类别)。

这是代码:

代码语言:javascript
复制
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()情况下的优惠券验证:

代码语言:javascript
复制
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文件中,或者在任何插件文件中。

这段代码应该能用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43206853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档