Стоимость единовременной подписки на WooCommerce

Я использую плагин подписок WooCommerce в WooCommerce. Я пытаюсь написать функцию для предоставления 10% скидки на обычные продукты, когда выполняется одно из следующих условий:

  1. У пользователя активная подписка
  2. У пользователя в корзине есть продукт по подписке.
function vip_discount() {

    $woocommerce = WC();
    $items = $woocommerce->cart->get_cart();
    $vip_product_id = get_subscription_product_id();
    $is_vip_in_cart = is_in_cart($vip_product_id);
    $vip_product_price = 0;

    foreach ($items as $item) {
        if( $item['variation_id'] === get_subscription_variation_id('monthly') || $item['variation_id'] === get_subscription_variation_id('quarterly') || $item['variation_id'] === get_subscription_variation_id('annually') ) {
            $vip_product_price = $item['line_total'];
        }
    }

    if ( wcs_user_has_subscription( '', '', 'active' ) || $is_vip_in_cart ) {
        // Make sure that the calculation is a negative number at the end ALWAYS!
        $discount = -( 10 / 100 ) * ( $woocommerce->cart->get_displayed_subtotal() - $vip_product_price);
        print_r($discount);
        $woocommerce->cart->add_fee( 'VIP Discount', $discount );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'vip_discount' );

Проблема в том, что этот хук почему-то запускается дважды. Также не применяется правильная плата. Предполагается, что сумма повторяющихся элементов будет вычтена из отрицательно примененной комиссии, вместо этого комиссия будет равна стоимости самой подписки (повторяющейся).

Любая дополнительная информация или помощь приветствуются.


person Nicholas Koskowski    schedule 20.12.2017    source источник


Ответы (1)


Во-первых, если вы используете $woocommerce, вам нужно сначала global $woocommerce;. Лучше использовать WC(), поскольку это реальный способ сделать то же самое.

С обработчиком действия woocommerce_cart_calculate_fees в вашей подключенной функции отсутствует аргумент $cart (объект WC_Cart).

Функция get_subscription_product_id() не завершается, так что это может быть пользовательская функция ... Я заменил ее чем-то другим.

Вам нужно будет использовать cart_contents_total вместо отображаемого промежуточного итога, поскольку этот хук запускается перед вычислением итогов.

Попробуйте вместо этого повторить аналогичный код:

add_action( 'woocommerce_cart_calculate_fees', 'vip_discount', 10, 1 );
function vip_discount( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return; // Exit

    // Here the rate percentage of 10% to be applied
    $rate = .10;

    // Initializing variables
    $vip_price = $discount = 0;
    $subscription_in_cart = false;

    // Loop through the cart items
    foreach ($cart->get_cart() as $cart_item) {
        if( $cart_item['variation_id'] === get_subscription_variation_id('monthly') || $cart_item['variation_id'] === get_subscription_variation_id('quarterly') || $cart_item['variation_id'] === get_subscription_variation_id('annually') ) {
            $vip_price += $cart_item['line_total'];
        }

        // Get an instance of the parent product object (if not parent the product object)
        $product = wc_get_product( $cart_item['product_id']);

        // Check for simple or variable "subscription" products
        if( $product->is_type('subscription') || $product->is_type('variable-subscription') ){
            $subscription_in_cart = true;
        }
    }

    // If customer has an active subscription or a product subscription in cart
    if ( wcs_user_has_subscription( '', '', 'active' ) || $subscription_in_cart ) {

        // The discount calculation
        $discount = ( $cart->cart_contents_total - $vip_product_price ) * $rate;

        if( $discount > 0 ){
            // Add a negative fee (a discount)
            $cart->add_fee( __("VIP Discount"), -$discount ); // not taxable here
        }
    }
}

Этот код находится в файле function.php вашей активной дочерней темы (или темы) или также в любом файле плагина.

Это должно сработать.

person LoicTheAztec    schedule 20.12.2017