【问题标题】:WooCommerce: Exclude bundles from all couponsWooCommerce:从所有优惠券中排除捆绑包
【发布时间】:2021-12-30 02:26:33
【问题描述】:

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

代码主要基于该答案:https://*.com/a/47603782/1788961

您可以在此处查看后端复选框:

到目前为止一切正常。

但在我们更改捆绑包以单独定价捆绑产品后,该复选框不再起作用。

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

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

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

有没有办法检查购物车商品的产品类型并禁用捆绑产品的优惠券?

我知道如何检查产品类型并尝试了一些方法。但到目前为止没有任何效果。

我在下面的答案中尝试了一些东西和来自 Howard E 的代码。不幸的是,目前没有任何效果。

但我意识到了一些事情。

如果捆绑包具有正常价格和促销价,则一切正常。但是,如果捆绑产品是单独的(如下面的屏幕所示),代码就不再起作用了。

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

【问题讨论】:

    标签: php wordpress woocommerce coupon woocommerce-product-bundles


    【解决方案1】:

    我无法对此进行测试,但似乎以下应该可以工作。

    // 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】:

    我找到了解决办法!

    我将 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,我可以检查购物车中的商品是否是捆绑商品的一部分,并从任何优惠券中排除该商品。

    【讨论】: