Beim Kauf eines Produkts in WooCommerce werden standardmäßig mehrere E-Mails versendet. Dies verzögert den eigentlichen Vorgang, der ohnehin schon sehr lange dauern kann. Daher ist es sinnvoll, diese E-Mails asynchron über einen Cron-Job zu versenden.

Was ist ein Cron Job?

Ein Cron-Job ist eine Aufgabe, die zu einem bestimmten Zeitpunkt ausgeführt wird. WordPress ermöglicht es, sowohl wiederkehrende Aufgaben als auch einmalige Ereignisse zu definieren (wir nutzen hier Letzteres für jede E-Mail). Standardmäßig wird er durch eine asynchrone Anfrage eines beliebigen Benutzers im Frontend ausgelöst, die die Datei /wp-cron.php aufruft.

Auf einer stark frequentierten Website (oder wenn du den genauen Zeitpunkt der Ausführung der Cron-Jobs steuern willst) solltest du diesen integrierten Mechanismus wahrscheinlich über \define( 'DISABLE_WP_CRON', true ) in deiner wp-config.php deaktivieren und einen System-Cron-Job oder -Timer einrichten, der die Datei regelmäßig abruft (oder WP-CLI verwenden).

Die Lösung

Zum Glück müssen wir das Rad gar nicht neu erfinden, denn die Lösung ist bereits seit 2015 auf Stack Overflow verfügbar. Diese beschränkt sich nicht nur auf WooCommerce-E-Mails, sondern sorgt dafür, dass alle E-Mails erst über einen Cron-Job versendet werden.

<?php
/**
 * Email Async.
 *
 * We override the wp_mail function for all non-cron requests with a function that simply
 * captures the arguments and schedules a cron event to send the email.
 */
if ( ! \defined( 'DOING_CRON' ) || ( \defined( 'DOING_CRON' ) && ! \DOING_CRON ) ) {
    function wp_mail() {
        // Get the args passed to the wp_mail function
        $args = \func_get_args();
        // Add a random value to work around that fact that identical events scheduled within 10 minutes of each other
        // will not work. See: http://codex.wordpress.org/Function_Reference/wp_schedule_single_event
        $args[] = \mt_rand();

        // Schedule the email to be sent
        \wp_schedule_single_event( \time() + 5, 'cron_send_mail', $args );
    }
}

/**
 * This function runs during cron requests to send emails previously scheduled by our
 * overrided wp_mail function. We remove the last argument because it is just a random
 * value added to make sure the cron job schedules correctly.
 *
 * @hook    cron_send_mail  10
 */
function example_cron_send_mail() {
    $args = \func_get_args();

    // Remove the random number that was added to the arguments
    \array_pop( $args );
    \call_user_func_array( 'wp_mail', $args );
}

/**
 * Hook the mail sender. We accept more arguments than wp_mail currently takes just in case
 * they add more in the future.
 */
\add_action( 'cron_send_mail', 'example_cron_send_mail', 10, 10 );
Code-Sprache: PHP (php)

Speichere diesen Code einfach und füge ihn in die Datei /wp-content/mu-plugins/asynchronous-emails.php ein (falls das Verzeichnis nicht existiert, erstelle es). Er wird dann von WordPress automatisch als „Must-Use“-Plugin ausgeführt. Auf diese Weise kannst du beim Bezahlvorgang etwa eine Sekunde Zeit sparen.

Neuveröffentlichungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Um auf deiner eigenen Website zu antworten, gib die URL deiner Antwort ein, die einen Link zur Permalink-URL dieses Beitrags enthalten sollte. Deine Antwort wird dann (möglicherweise nach der Moderation) auf dieser Seite erscheinen. Möchtest du deine Antwort aktualisieren oder entfernen? Aktualisiere oder lösche deinen Beitrag und gib die URL deines Beitrags noch einmal ein. (Mehr über die Funktion von Webmentions erfahren)