Staram się niezrozernować domyślne zamówienie WOOCommerce Wypełnij pocztę, gdy klient kupuje subskrypcję. WooCommerce tworzy zlecenie macierzyste dla tej subskrypcji. Kiedy zamykamy ten porządek nadrzędny, klient otrzyma zamówienie zakończone pocztą. Następnie nie próbujemy bloku, ale tylko na kolejności nadrzędnej na subskrypcje.

Znalazłem Ta odpowiedź ale jest to do odnowienia zakończonych maili.

Istnieje informacje order_type, które powinny przechowywać informacje, jeśli jest to kolejność nadrzędna subskrypcji, czy nie, w jaki sposób można uzyskać dostęp do wartości?

Może być może sposób sprawdzenia przez wcs_order_contains_subscription() Jeśli jest to kolejność subskrypcji nadrzędną. (https://docs.woocommerce.com/document/ Subskrypcje / Opracowanie / Funkcje / Zamówienie-Koszyk /)

Coś takiego: wcs_order_contains_subscription( $order, $order_type )

Aktualizacja : Dzięki nowej informacji jest to aktualny status:

// Conditionally remove action to send order completed email for subscription parent order

function unhook_order_complete_email_subscription_parent($email_class) {

    // Check whether to send the parent order completed email or not
    $send_parent_completed_email = order_type(parent);

    if (!$send_parent_completed_email) {

        // Remove action to prevent email from being sent
        remove_action(
            "woocommerce_order_status_completed_notification",
            array(
                $email_class->emails["WC_Email_Customer_Completed_Order"],
                "trigger"
            )
        );
    }
}

add_action("woocommerce_order_status_changed", "unhook_order_complete_email_subscription_parent");
0
Nik7 25 luty 2021, 03:08

1 odpowiedź

Najlepsza odpowiedź

Nie ma funkcji takiej jak order_type(). To powinno naprawić problem:

// Conditionally remove action to send order completed email for subscription parent order

function unhook_order_complete_email_subscription_parent($order_id) {
    $email_class = wc()->mailer()->get_emails();
    
    // Check whether to send the parent order completed email or not
    $order = wc_get_order($order_id);
    if ($order && !$order->get_parent_id()) {
        // Remove action to prevent email from being sent
        remove_action(
            "woocommerce_order_status_completed_notification",
            array(
                $email_class->emails["WC_Email_Customer_Completed_Order"],
                "trigger"
            )
        );
    }
}

add_action("woocommerce_order_status_changed", "unhook_order_complete_email_subscription_parent");

EDYTUJ:

To lepsze podejście, które działa. get_parent_id() powróci 0, jeśli zamówienie jest rodzicem, w przeciwnym razie zwróci parent_id, jeśli jest dzieckiem.

function enable_email($order) {
    // We have to restore the configuration of what we disabled after we are done with our hack
    if ($order->get_parent_id() != 0 && ($status = get_transient( "tmp_completed_order_email" )) !== false) {
        wc()->mailer()->emails['WC_Email_Customer_Completed_Order']->enabled = $status;        
    }
}

function disable_email($order)
{
    if ($order->get_parent_id() != 0) { // It is a child
        // Store the current configuration in a temporary place.
        $current_status = wc()->mailer()->emails['WC_Email_Customer_Completed_Order']->enabled;

        // Everything should be done in 10 seconds. Lets keep the data till then
        set_transient( 'tmp_completed_order_email', $current_status, 10 );

        // Disabled completed order email
        wc()->mailer()->emails['WC_Email_Customer_Completed_Order']->enabled = 'no';
    }
}
add_action("woocommerce_before_order_object_save", "disable_email");
add_action("woocommerce_after_order_object_save", "enable_email");
1
James John 1 marzec 2021, 17:48