woocommerce永不打折商品

在woocommerce中,我们可以设置优惠券,当优惠券过多时,我们不知道怎么限制某些分类下不能使用优惠券,一个个设置的话又太慢了,就比如我们公司的一个网站上,有700多个优惠券,在后面又新建了个分类用来存放补差价的产品,这几个产品不能使用优惠券,但是700多个优惠券回头来设置的话就相当耗时了。

发现网上找的都不能用,最后查阅woocommerce源码,发现woocommerce中的优惠券其实是分三种的,一种是购物车优惠券;一种是产品优惠券;还有一种是百分比优惠券,网上所给的代码都是以产品优惠券为例写的,适用于产品优惠券和百分比优惠券;而对于购物车优惠券是没有任何作用。

自己写的(对Fixed cart discount和Fixed product discount以及百分比类型的优惠券有效):

思路,找到应用优惠券的函数,叫做apply_coupon,大概在\woocommerce\includes\class-wc-discounts.php下,$is_coupon_valid = $validate ? $this->is_coupon_valid( $coupon ) : true;中的is_coupon_valid有个钩子叫做apply_filters( ‘woocommerce_coupon_is_valid’, true, $coupon, $this );

我的最终代码(1936是我的分类,当然也可以以产品ID、标签、属性等作为限制条件):

add_filter("woocommerce_coupon_is_valid",function($valid, $coupon,$function){
    foreach ( $function->get_items_to_validate() as $item ) {
        $product_cats = wc_get_product_cat_ids( $item->product->get_id() );
        foreach ($product_cats as $product_cat){
            if($product_cat == 1936){
                add_filter("woocommerce_coupon_error",function(){return "Shipping Cost For Doll Cannot use coupon!";});
                return false;
            }
        }
    }
    return $valid;
},99,3);

网上找到的(只对Fixed product discount类型的优惠券有效):

1、以代码方式判断分类,并调整,可以是分类名称、分类ID、产品ID、产品属性、产品标签等。

//优惠券不能用于此类商品
add_filter( 'woocommerce_coupon_is_valid_for_product', 'quadlayers_exclude_product_from_product_promotions', 9999, 4 );
function quadlayers_exclude_product_from_product_promotions( $valid, $product, $coupon, $values ) {
    $id = $product->get_id();
    $categories = wp_get_post_terms($id, 'product_cat');
    foreach ($categories as $categorie){
        $term_name = $categorie->name;
        if(($term_name == "wwww")){
            $valid = false;
            break;
        }
    }
return $valid;

代码以产品分类名称作为判断条件,你也可以根据分类ID之类的进行判断。或者直接不要循环,以产品ID作为判断条件。

2、通过代码的形式,在产品中生成一个选项,开启则用不打折这个产品,代码如下:


// Create and display the custom field in product general setting tab
add_action( 'woocommerce_product_options_general_product_data', 'add_custom_field_general_product_fields' );
function add_custom_field_general_product_fields(){
    global $post;

    echo '<div class="product_custom_field">';

    // Custom Product Checkbox Field
    woocommerce_wp_checkbox( array(
        'id'        => '_disabled_for_coupons',
        'label'     => __('Disabled for coupons', 'woocommerce'),
        'description' => __('Disable this products from coupon discounts', 'woocommerce'),
        'desc_tip'  => 'true',
    ) );

    echo '</div>';;
}

// Save the custom field and update all excluded product Ids in option WP settings
add_action( 'woocommerce_process_product_meta', 'save_custom_field_general_product_fields', 10, 1 );
function save_custom_field_general_product_fields( $post_id ){

    $current_disabled = isset( $_POST['_disabled_for_coupons'] ) ? 'yes' : 'no';

    $disabled_products = get_option( '_products_disabled_for_coupons' );
    if( empty($disabled_products) ) {
        if( $current_disabled == 'yes' )
            $disabled_products = array( $post_id );
    } else {
        if( $current_disabled == 'yes' ) {
            $disabled_products[] = $post_id;
            $disabled_products = array_unique( $disabled_products );
        } else {
            if ( ( $key = array_search( $post_id, $disabled_products ) ) !== false )
                unset( $disabled_products[$key] );
        }
    }

    update_post_meta( $post_id, '_disabled_for_coupons', $current_disabled );
    update_option( '_products_disabled_for_coupons', $disabled_products );
}

// Make coupons invalid at product level
add_filter('woocommerce_coupon_is_valid_for_product', 'set_coupon_validity_for_excluded_products', 12, 4);
function set_coupon_validity_for_excluded_products($valid, $product, $coupon, $values ){
    if( ! count(get_option( '_products_disabled_for_coupons' )) > 0 ) return $valid;

    $disabled_products = get_option( '_products_disabled_for_coupons' );
    if( in_array( $product->get_id(), $disabled_products ) )
        $valid = false;

    return $valid;
}

// Set the product discount amount to zero
add_filter( 'woocommerce_coupon_get_discount_amount', 'zero_discount_for_excluded_products', 12, 5 );
function zero_discount_for_excluded_products($discount, $discounting_amount, $cart_item, $single, $coupon ){
    if( ! count(get_option( '_products_disabled_for_coupons' )) > 0 ) return $discount;

    $disabled_products = get_option( '_products_disabled_for_coupons' );
    if( in_array( $cart_item['product_id'], $disabled_products ) )
        $discount = 0;

    return $discount;
}
© 版权声明
WWW.ANXKJ.TOP
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容