Подписки WooCommerce: установить пробную длину подписки для каждой корзины? - PullRequest
0 голосов
/ 21 сентября 2019

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

Для одного варианта продукта есть возможность либо заплатить немедленно, либо отложить первый платеж до начала нового года.Эта опция выбирается через настраиваемое поле переключателя.Для всех других вариантов продукта оплата автоматически откладывается.

Достаточно просто установить пробную длину по умолчанию для самого продукта, используя

add_filter( 'woocommerce_subscriptions_product_trial_length', 'stc_woocommerce_subscriptions_product_trial_length', 10, 2 );
function stc_woocommerce_subscriptions_product_trial_length( $subscription_trial_length, $product ){
    // Do the calculations based on the current date, product_id, &c. and return a revised $subscription_trial_length as needed
}

, но я не могу понять, как настроитьпараметр trial_length to zero для опции "немедленно оплатить".

Наиболее вероятным инструментом для установки / обновления subscription_trial_length является wcs_set_objects_property, хотя я пробовал множество других вещей.Я просто продолжаю ходить по кругу.

Вот упрощенная версия функции, над которой я работаю:


function make_my_cart_revisions( $cart_obj ) {

    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) )  ) { return; }

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) { return; }

        foreach( $cart_obj->get_cart() as $cart_item) {

            // First check to see if the cart item is a subscription product or a variation thereof. Skip any other items.
            if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {

                $subscription_trial_length = WC_Subscriptions_Product::get_trial_length( $cart_item['data'] );

                $pa_pledge_year = $cart_item['variation']['attribute_pa_pledge_year'];
                $pledge_year = substr($pa_pledge_year, 0, 4);
                $current_year = date("Y"); // numeric representation of current year, four digits
                $billing_period = $cart_item['variation']['attribute_pa_billing_period'];               
                $pledge_payment_schedule = $cart_item['pledge_payment_schedule']; // Custom product field: "defer-payment" or "pay-immediately"

                if ( $pledge_year !== $current_year && $billing_period == 'onetime-payment' && $pledge_payment_schedule == 'pay-immediately' && $subscription_trial_length > 0 ) {

                    $subscription_trial_length = 0;

                    // Trying to update the subscription length with the following:
                    wcs_set_objects_property( $cart_item['data'], 'subscription_trial_length', $subscription_trial_length, 'set_prop_only' );

                    // Also tried these different approaches to saving the revised trial length:
                    //$cart_item['data']->update_meta_data( '_subscription_trial_length', $subscription_trial_length );
                    //$cart_item['data']->set_subscription_trial_length( $subscription_trial_length );

                }

            } // end check for subscription product/variation


        } // end foreach

}

Я вижу из своего журнала отладки, что вычисляется правильная subscription_trial_lengthоснованный на деталях cart_item, но все мои попытки сохранить значение, чтобы оно правильно отображалось в итоговых данных корзины, провалились.Например, продукт, для которого я выбрал опцию «немедленно оплатить», все еще отображается в текущих итогах, но не в суммах, причитающихся немедленно.

В качестве альтернативы я попытался использовать НЕТ по умолчанию trial_length ивместо этого установив ненулевую сумму для продуктов с опцией отсроченного платежа (таким образом исключая этап подключения к фильтру woocommerce_subscriptions_product_trial_length), но проблема осталась: я не могу получить новое значение trial_length, которое будет успешно установлено дляcart_item.

Любая помощь будет высоко ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...