如何将自定义优惠券应用于WooCommerce订阅经常性金额?

时间:2019-04-18 作者:Laurence Cope

我需要创建一张用于WooCommerce订阅的自定义优惠券,因为出于某种原因,您可以在注册费上有一张优惠券,也可以在经常性金额上有一张优惠券,但我需要将优惠券应用于两者,但没有选择。

我已经使用筛选woocommerce\\u优惠券\\u折扣类型创建了一个自定义优惠券,但随后在购物车中实现此优惠券的筛选woocommerce\\u优惠券\\u get\\u折扣金额不会将其添加到定期金额中,只会将其添加到注册费中。

如何将优惠券应用于经常性费用?

function dhti_coupon_get_discount_amount($discount, $discounting_amount, $cart_item, $single, $coupon)
{
    if ($coupon->discount_type == \'sign_up_and_recurring_percent\')
    {
        $discount = $discounting_amount * $coupon->amount / 100;
        return $discount;
    }
    else
    {
        return $discount;
    }
}
add_filter(\'woocommerce_coupon_get_discount_amount\', \'dhti_coupon_get_discount_amount\', 10, 5);

enter image description here

1 个回复
SO网友:Laurence Cope

我已经找到了一种方法,但欢迎有更好的方法。

如OP注释中所述,函数remove\\u coups()位于文件woocommerce Subscriptions/includes/class WC Subscriptions-Coupon中的class WC\\u Subscriptions\\u-Coupon中。php正在删除不是“Recurtive\\u fee”或“Recurtive\\u percent”的优惠券。没有添加我们可以点击的过滤器来分配我们自己的定制优惠券类型,因此似乎没有任何机会超越这一点。

为了解决这个问题,我们可以使用与remove\\u tuops()方法相同的代码创建自己的过滤器,在本例中称为remove\\u tuops\\u custom(),然后以与原始类中相同的方式添加此过滤器。

但原始方法仍在运行,并将删除我们的优惠券,因此我们需要通过添加remove\\u操作(“woocommerce\\u before\\u calculate\\u totals”,“WC\\u Subscriptions\\u优惠券::remove\\u优惠券”,10)从运行中删除原始筛选器;在新功能的顶部。

我不喜欢这种方法,以防原始代码的更改程度会中断或停止我们的工作,但这是目前我能看到的唯一方法,除非修改原始代码以添加我们可以使用的过滤器来添加我们自己的自定义类型。

function remove_coupons_custom( $cart )
{
    // Remove original action added by WC_Subscriptions_Coupon class
    remove_action( \'woocommerce_before_calculate_totals\', \'WC_Subscriptions_Coupon::remove_coupons\', 10 );

    // Create WC_Subscriptions_Coupon instance so we can replace self reference below in original method
    $WC_Subscriptions_Coupon = new WC_Subscriptions_Coupon;

    $calculation_type = WC_Subscriptions_Cart::get_calculation_type();

    // Only hook when totals are being calculated completely (on cart & checkout pages)
    if ( \'none\' == $calculation_type || ! WC_Subscriptions_Cart::cart_contains_subscription() || ( ! is_checkout() && ! is_cart() && ! defined( \'WOOCOMMERCE_CHECKOUT\' ) && ! defined( \'WOOCOMMERCE_CART\' ) ) ) {
        return;
    }

    $applied_coupons = $cart->get_applied_coupons();

    // If we\'re calculating a sign-up fee or recurring fee only amount, remove irrelevant coupons
    if ( ! empty( $applied_coupons ) ) {

        // Keep track of which coupons, if any, need to be reapplied immediately
        $coupons_to_reapply = array();

        foreach ( $applied_coupons as $coupon_code ) {

            $coupon      = new WC_Coupon( $coupon_code );
            $coupon_type = wcs_get_coupon_property( $coupon, \'discount_type\' );

            if ( in_array( $coupon_type, array( \'recurring_fee\', \'recurring_percent\', \'sign_up_and_recurring_percent\' ) ) ) {  // always apply coupons to their specific calculation case
                if ( \'recurring_total\' == $calculation_type ) {
                    $coupons_to_reapply[] = $coupon_code;
                } elseif ( \'none\' == $calculation_type && ! WC_Subscriptions_Cart::all_cart_items_have_free_trial() ) { // sometimes apply recurring coupons to initial total
                    $coupons_to_reapply[] = $coupon_code;
                } else {
                    $WC_Subscriptions_Coupon::$removed_coupons[] = $coupon_code;
                }
            } elseif ( ( \'none\' == $calculation_type ) && ! in_array( $coupon_type, array( \'recurring_fee\', \'recurring_percent\' ) ) ) { // apply all coupons to the first payment
                $coupons_to_reapply[] = $coupon_code;
            } else {
                $WC_Subscriptions_Coupon::$removed_coupons[] = $coupon_code;
            }
        }
        // Now remove all coupons (WC only provides a function to remove all coupons)
        $cart->remove_coupons();

        // And re-apply those which relate to this calculation
        $cart->applied_coupons = $coupons_to_reapply;

        if ( isset( $cart->coupons ) ) { // WC 2.3+
            $cart->coupons = $cart->get_coupons();
        }
    }
}
add_action( \'woocommerce_before_calculate_totals\', \'remove_coupons_custom\', 10 );

enter image description here

相关推荐

Subscription list function

我创建了一个功能,可以自动将具有参与者角色的用户添加到一个列表中,在该列表中,他们将通过电子邮件接收论坛(修改后的mingleforum插件)更新。我的问题是,“is\\u player\\u subscribed()”函数调用的函数似乎工作不正常,因为它每次用户注册时都会有效地添加整个列表。add_action( \'user_register\', \'call_forum_subscribe_member_player\' ); function forum_subscribe_m