Programmatisch eine WooCommerce-E-Mail-Benachrichtigung „customer_on_hold_order“ erneut senden

Lesezeit: 3 Minuten

Benutzer-Avatar
Bush Al

Mir ist aufgefallen, dass die Kunden-E-Mail für gehaltene Bestellungen nicht verfügbar ist, also habe ich versucht, die Aktionen durch eine einzelne Aktion zu ersetzen, die die entsprechende E-Mail senden würde.

Dies scheint bis auf den Wartezustand zu funktionieren. Ich sehe nicht, was der Unterschied zwischen dem Warteschleifen- und dem Verarbeitungsfall ist, außer dass es nicht in der ist $available_emails in class-wc-meta-box-order-actions.php und ich habe alle anderen entfernt und sie funktionieren immer noch.

Was mache ich falsch? Ist es eine Möglichkeit, dies zu ermöglichen?

Mein Code ist:

    function ulmh_resend1( $actions ) {
    $actions['ulmh_resend'] = __( 'Resend Email', 'text_domain' );
    return $actions;
}
function ulmh_resend2( $order ) {
    $mailer = WC()->mailer();
    $mails = $mailer->get_emails();
    if ($order->has_status( 'on-hold' )) {
    $eml="customer_on_hold_order";    
    }elseif ($order->has_status( 'processing' )) {
    $eml="customer_processing_order"; 
    }elseif ($order->has_status( 'completed' )) {
    $eml="customer_completed_order";  
    } else {
    $eml = "nothing";
    }   
    if ( ! empty( $mails ) ) {
        foreach ( $mails as $mail ) {
            if ( $mail->id == eml ) {
               $mail->trigger( $order->id );
            }
         }
    }
}
function ulmh_resend3( $order_emails ) {
    $remove = array( 'new_order', 'cancelled_order', 'customer_processing_order', 'customer_completed_order', 'customer_invoice' );
    $order_emails = array_diff( $order_emails, $remove );
    return $order_emails;
}   
add_action( 'woocommerce_order_actions', 'ulmh_resend1' );
add_action( 'woocommerce_order_action_ulmh_resend', 'ulmh_resend2' );
add_filter( 'woocommerce_resend_order_emails_available', 'ulmh_resend3' );

  • Was ist die Frage, konkret? Was in Ihrem Code funktioniert / funktioniert nicht?

    – zufälliger_Benutzername

    29. August 2017 um 1:17 Uhr

  • Der Code funktioniert gut, wenn sich die Bestellung in Bearbeitung oder im abgeschlossenen Status befindet, aber keine E-Mail gesendet wird, wenn sie sich im Wartestatus befindet. Es erscheinen keine Meldungen im Debug-Log, es sieht nur so aus, als wäre customer_on_hold_order nicht in $mails, aber die ursprüngliche E-Mail wird korrekt gesendet

    – Busch Al

    29. August 2017 um 1:27 Uhr

  • Entschuldigung, Loic, ich muss das versehentlich gedrückt haben – jetzt wieder angekreuzt. alles gut

    – Busch Al

    31. März 2018 um 21:58 Uhr

Benutzer-Avatar
LoicTheAztec

Ich habe Ihren Code erneut besucht und komprimiert, da dort einige Fehler wie ein Tippfehler enthalten waren if ( $mail->id == eml ){ zum eml als Variablenname… Auch um die Auftrags-ID zu erhalten WC_Order Objekt, das Sie verwenden sollten $order->get_id() Methode statt $order->id.

Hier ist dieser neue Funktionscode:

add_action( 'woocommerce_order_actions', 'ulmh_resend1' );
function ulmh_resend1( $actions ) {
    $actions['ulmh_resend'] = __( 'Resend Email', 'text_domain' );
    return $actions;
}

add_action( 'woocommerce_order_action_ulmh_resend', 'ulmh_resend2' );
function ulmh_resend2( $order ) {
    $wc_emails = WC()->mailer()->get_emails();
    if( empty( $wc_emails ) ) return;

    if ($order->has_status( 'on-hold' ))
        $email_id = 'customer_on_hold_order';
    elseif ($order->has_status( 'processing' ))
        $email_id = 'customer_processing_order';
    elseif ($order->has_status( 'completed' ))
        $email_id = 'customer_completed_order';
    else
        $email_id = "nothing";

    foreach ( $wc_emails as $wc_mail )
        if ( $wc_mail->id == $email_id )
            $wc_mail->trigger( $order->get_id() );
}

add_filter( 'woocommerce_resend_order_emails_available', 'ulmh_resend3' );
function ulmh_resend3( $order_emails ) {
    $remove = array( 'new_order', 'cancelled_order', 'customer_processing_order', 'customer_completed_order', 'customer_invoice' );
    $order_emails = array_diff( $order_emails, $remove );
    return $order_emails;
}

Code geht in die function.php-Datei Ihres aktiven Child-Themes (oder Themes) oder auch in jede Plugin-Datei.

Dieser Code wurde in WooCommerce 3+ und getestet Funktioniert jetzt gut für E-Mail-Benachrichtigungen zum Status von angehaltenen Bestellungen beim erneuten Senden

  • Es funktionierte sehr gut, aber nach dem Update auf WooCommerce 3.5.1 wurden nur neue Bestell-E-Mails nicht ausgelöst. Irgendeine Idee? Irgendein bekannter Fehler (ich habe ihn nicht auf woo git gefunden)?

    – Pankaj Verma

    28. November 2018 um 12:34 Uhr

  • Wow, das hat mir sicher eine gerettet viel Arbeit beim Testen eines Dienstes, der mehr als ein Dutzend E-Mails betrifft! Vielen Dank!

    – mpemburn

    8. November 2019 um 18:06 Uhr

1355300cookie-checkProgrammatisch eine WooCommerce-E-Mail-Benachrichtigung „customer_on_hold_order“ erneut senden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy