代码之家  ›  专栏  ›  技术社区  ›  Cray

WooCommerce:从所有优惠券中排除捆绑包

  •  0
  • Cray  · 技术社区  · 3 年前

    我正在使用自定义代码来阻止所有优惠券中的产品。 为此,每个产品在后端都有一个额外的复选框。

    代码主要基于以下答案: https://stackoverflow.com/a/47603782/1788961

    custom checkbox in product general settings metabox

    到目前为止一切正常。

    我猜代码不适用于捆绑包中的产品。

    这是使优惠券在产品级别无效并将产品折扣金额设置为零的代码:

    // 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;
    }
    

    是否有办法检查购物车项目的产品类型并禁用捆绑产品的优惠券?

    我尝试了一些东西,并从 霍华德E

    但我意识到了一些事情。

    如果捆绑包有固定价格和销售价格,则一切正常。但是如果捆绑产品是单独拍照的(如下面的屏幕所示),代码就不再工作了。

    我想我必须检查一个项目是否是父捆绑项目的一部分? 在购物车里可以吗?

    enter image description here

    0 回复  |  直到 3 年前
        1
  •  1
  •   Howard E    3 年前

    我无法测试这一点,但似乎下面的方法应该可以工作。

    // 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 ( 'bundle' === $product->get_type() ) {
            $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 ) {
    
        $product = wc_get_product( $cart_item['product_id'] );
    
        if ( 'bundle' === $product->get_type() ) {
            $discount = 0;
        }
    
        return $discount;
    }
    
        2
  •  0
  •   Cray    3 年前

    我找到了解决办法!

    我将if语句更改为以下代码:

    if( in_array( $product->get_id(), $disabled_products ) or wc_pb_is_bundled_cart_item($cart_item) === true )
    

    以及:

    if( in_array( $cart_item['product_id'], $disabled_products ) or wc_pb_is_bundled_cart_item($cart_item) === true )
    

    加入 wc_pb_is_bundled_cart_item($cart_item) === true