it-swarm.com.de

Verwenden von wp_schedule_single_event mit Argumenten zum Senden von E-Mails

Ich versuche, mithilfe eines WordPress-Plugins einen Pseudo-Cron-Job so zu planen, dass nach einer festgelegten Zeit eine E-Mail gesendet wird.

Bisher konnte ich diesen Code ausführen, wenn ich die E-Mail-Adresse und die Nachricht in der Funktion email_about_coupon() fest codierte. Wenn ich jedoch versuche, die Argumente an die Funktion zu senden, wird die E-Mail nie gesendet.

Mithilfe des Cron-GUI-Plugins kann ich feststellen, dass der Cron-Job auch mit den Argumenten registriert ist. Ich glaube, dass ich etwas falsch mache, das es nicht erlaubt, die Argumente in der Funktion zum Zeitpunkt der Ausführung richtig zu verwenden.

Folgendes habe ich:

function schedule_email_cron($post_id)
{
    // Get the UNIX 30 days from now time
    $thirty_days = time() + 60; // (30 * 24 * 60 * 60)
    $post = get_post($post_id);
    $email = get_the_author_meta('user_email', $post->post_author);
    $args = array('email' => $email, 'title' => $post->post_title);
    wp_schedule_single_event($thirty_days, 'email_about_coupon_action', $args); 
}

add_action('save_post', 'schedule_email_cron', 1, 1);

add_action('email_about_coupon_action', 'email_about_coupon', 1, 1);

function email_about_coupon($args)
{
    // Email text
    $text = "<html><body><p>Your coupon titled, ".$args['title']." is expiring soon. Please visit <a href=\"\">".get_bloginfo('siteurl')."/registered/</a> ".get_bloginfo('siteurl')."/registered/ to renew your coupon.</p></body></html>";

    // Email headers
    $headers = array(
        'From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>',
        "Content-Type: text/html"
    );
    $h = implode("\r\n",$headers) . "\r\n";

    // Send email
    wp_mail($args['email'], 'Renew Your Coupon Now!', $text, $h);
}

Vielen Dank für Ihre Hilfe!

6
tollmanz

Ich denke, Sie stimmen nicht darin überein, wie Sie Argumente übergeben und wie Sie erwarten, dass es funktioniert. Sie übergeben ein Array von Argumenten an den Zeitplan und erwarten, dass Ihre Hook-Funktion ein identisches Array von Argumenten empfängt. Das ist nicht der Fall.

Cron-Ereignisse werden von do_action_ref_array() verarbeitet, das wiederum Argumente über call_user_func_array() übergibt.

Ihre Hook-Funktion empfängt also kein Array von Argumenten, sondern mehrere Argumente - eines für jedes Element in Ihrem Array.

Sie müssen also entweder das Array von Argumenten noch einmal umbrechen oder Ihre Funktion so ändern, dass mehrere Argumente verarbeitet werden. Beachten Sie, dass Sie für letter auch Ihren add_action()-Aufruf so ändern müssen, dass die erforderliche Anzahl von Argumenten anstelle von nur einem übergeben wird.

11
Rarst

Dank Rarst macht das jetzt verdammt viel mehr Sinn. Deshalb habe ich diesen Beitrag aktualisiert, um die Unterschiede zu erläutern, die Rarst erwähnt hat, und ihn dafür aufgewertet, dass er Licht ins Dunkel gebracht hat. )

Grundsätzlich leitet wp_schedule_single_event die Argumente über die Variablen args an Ihre Funktion weiter, wie in im Codex gezeigt. Diese Variable "args" muss ein Array sein, da jeder Wert im Array einem Argument in Ihrer Rückruffunktion zugeordnet wird.

Beispiel:

add_action('example_action', 'example', 1, 3);
$args = array ( 2, 1, 3 );
wp_schedule_single_event(time(), 'example_action', $args);

function example($a, $b, $c)
{

}

2 geht nach $ a, 1 geht nach $ b und 3 geht nach $ c. Die Übergabe von drei Variablen ist jedoch nur aufgrund dieser Zeile möglich.

add_action('example_action', 'example', 1, 3);

Wenn Sie sich den Codex für add_action ansehen, sehen Sie, dass das vierte Argument 3 bestimmt, wie viele Argumente an die Rückruffunktion übergeben werden. Der Standardwert ist 1.

So funktioniert dieses Beispiel auch:

add_action('example_action', 'example');
$args = array ( array( 2, 1, 3 ) );
wp_schedule_single_event(time(), 'example_action', $args);

function example($a)
{

}

Das Array (2, 1, 3) ist hier also nur $ a zugeordnet.

So konnte Sardines Problem mit einem Zeilenwechsel behoben werden, bei dem Zeile 7,

$args = array('email' => $email, 'title' => $post->post_title);

wird dies stattdessen,

$args = array(array('email' => $email, 'title' => $post->post_title));
12
Thirlan