WordPress

wtyczki – Zaplanuj przyszłą obniżkę dla planu subskrypcji Easy Digital Downloads

  • 9 lipca, 2024
  • 4 min read
wtyczki – Zaplanuj przyszłą obniżkę dla planu subskrypcji Easy Digital Downloads


Pracuję nad wdrożeniem funkcji obniżania subskrypcji w Easy Digital Downloads (EDD), która umożliwia użytkownikom zaplanowanie obniżenia na przyszłą datę. Obecnie, gdy użytkownik obniża swój plan, natychmiast traci dostęp do funkcji swojego wyższego poziomu planu. Chcę zmodyfikować to zachowanie, aby użytkownicy mogli ukończyć proces obniżania, w tym finalizację zakupu, ale obniżenie zacznie obowiązywać dopiero pod koniec bieżącego okresu subskrypcji.

Dodatkowo użytkownicy powinni mieć możliwość anulowania zaplanowanej obniżki wersji w dowolnym momencie przed jej wejściem w życie i kontynuowania korzystania z bieżącego planu.

Oto podejście, które stosuję:

Utwórz oczekujące zamówienie na obniżenie wersji. Zaplanuj wykonanie obniżenia wersji na koniec bieżącego okresu subskrypcji. Zezwól użytkownikom na anulowanie oczekującego obniżenia wersji przed jego wykonaniem. Poniżej znajduje się kod, który napisałem do tej pory:

    // Function to create a pending downgrade order
    function edd_custom_subscription_create_pending_downgrade($customer_id, $current_payment_id, $new_plan_id) {
        edd_debug_log('--- EDD Custom Subscription Downgrade Creation Log ---');
        edd_debug_log('EDD Custom Subscription: Creating new pending downgrade for customer ID: ' . $customer_id);

    // Create a new payment using EDD_Payment class
    $payment = new EDD_Payment();
    $payment->customer_id = $customer_id;
    $payment->email = $customer_email;
    $payment->status="pending";
    $payment->add_download($new_plan_id);
    $payment->parent_payment = $current_payment_id;

    // Set payment details
    $payment->date = date('Y-m-d H:i:s');
    $payment->total = edd_get_download_price($new_plan_id);
    $payment->currency = edd_get_currency();
    $payment->user_info = array(
        'id' => $customer_id,
        'email' => $customer_email,
        'first_name' => get_user_meta($customer_id, 'first_name', true),
        'last_name' => get_user_meta($customer_id, 'last_name', true),
        'discount' => 'none'
    );
    $payment->gateway = edd_get_option('gateway', 'stripe');

    // Debugging additional information
    edd_debug_log('EDD Custom Subscription: Downgrade payment details before save: ' . print_r($payment, true));

    // Save the payment
    $payment_id = $payment->save();

    if ($payment_id) {
        edd_debug_log('EDD Custom Subscription: New pending downgrade created with Payment ID: ' . $payment_id);
    } else {
        edd_debug_log('EDD Custom Subscription: Failed to create pending downgrade for customer ID: ' . $customer_id);
    }
}
add_action('edd_custom_subscription_create_pending_downgrade', 'edd_custom_subscription_create_pending_downgrade', 10, 3);

// Function to complete the downgrade
function edd_custom_subscription_complete_downgrade($payment_id) {
    edd_debug_log('--- EDD Custom Subscription Downgrade Completion Log ---');
    edd_debug_log('EDD Custom Subscription: Completing downgrade with Payment ID: ' . $payment_id);

    $payment = new EDD_Payment($payment_id);
    edd_debug_log('EDD Custom Subscription: Downgrade payment status before completion: ' . $payment->status);

    if ($payment && $payment->status == 'pending') {
        $payment->status="complete";
        $payment->save();

        // Process payment through the gateway
        edd_debug_log('EDD Custom Subscription: Initiating downgrade processing through gateway: ' . $payment->gateway);
        $gateway = edd_get_gateway_class($payment->gateway);
        if ($gateway) {
            $gateway->process_payment($payment->ID);
            edd_debug_log('EDD Custom Subscription: Downgrade processed through gateway: ' . $payment->gateway);
        } else {
            edd_debug_log('EDD Custom Subscription: Gateway not found: ' . $payment->gateway);
        }
    } else {
        edd_debug_log('EDD Custom Subscription: Downgrade with Payment ID ' . $payment_id . ' is not pending.');
    }
}
add_action('edd_custom_subscription_complete_downgrade', 'edd_custom_subscription_complete_downgrade', 10, 1);

// Function to cancel a pending downgrade
function edd_custom_subscription_cancel_downgrade($payment_id) {
    edd_debug_log('--- EDD Custom Subscription Downgrade Cancellation Log ---');
    edd_debug_log('EDD Custom Subscription: Cancelling downgrade with Payment ID: ' . $payment_id);

    $payment = new EDD_Payment($payment_id);
    if ($payment && $payment->status == 'pending') {
        $payment->status="cancelled";
        $payment->save();
        edd_debug_log('EDD Custom Subscription: Downgrade with Payment ID ' . $payment_id . ' has been cancelled.');
    } else {
        edd_debug_log('EDD Custom Subscription: Downgrade with Payment ID ' . $payment_id . ' is not pending or already processed.');
    }
}
add_action('edd_custom_subscription_cancel_downgrade', 'edd_custom_subscription_cancel_downgrade', 10, 1);

Problem polega na tym, że EDD uruchamia specjalną procedurę podczas procesu downgrade, która przenosi ustawienia z wyższego planu do niższego planu (np. gdy licencjonowanie jest włączone). Jakie jest prawidłowe podejście do zaplanowania downgrade pod koniec bieżącego okresu subskrypcji? Wszelkie sugestie dotyczące usprawnienia tego procesu byłyby mile widziane.

Warto przeczytać!  admin — Wyświetl powiadomienie w edytorze bloków po haku wp_insert_post_data


Źródło