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

WooCommerce: Exclude bundles from all coupons

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

代码主要基于该答案:

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

到目前为止一切正常。

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

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

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

// 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 的代码。不幸的是,目前没有任何效果。

但我意识到了一些事情。

如果捆绑包有正常价格和促销价,则一切正常。但是,如果捆绑产品是单独拼装的(如下图所示),代码将不再有效。

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

我无法对此进行测试,但似乎以下内容应该有效。

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

我找到了解决办法!

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