Utilizarea wp_schedule_single_event cu argumente pentru trimiterea de emailuri
Încerc să programez un pseudo cron job pentru a trimite un email după o anumită perioadă de timp folosind un plugin WordPress.
Până acum, am reușit să fac acest cod să funcționeze când introduc manual adresa de email și mesajul în funcția email_about_coupon()
. Totuși, când încerc să trimit argumentele către funcție, emailul nu este niciodată trimis.
Folosind pluginul Cron GUI, pot vedea că cron job-ul este înregistrat chiar și cu argumentele. Cred că fac ceva greșit care nu permite utilizarea corectă a argumentelor în funcție în momentul în care aceasta este executată.
Iată ce am:
function schedule_email_cron($post_id)
{
// Obține timpul UNIX pentru 30 de zile de acum
$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)
{
// Textul emailului
$text = "<html><body><p>Couponul tău intitulat, ".$args['title']." expiră în curând. Te rugăm să vizitezi <a href=\"\">".get_bloginfo('siteurl')."/registered/</a> ".get_bloginfo('siteurl')."/registered/ pentru a-ți reînnoi couponul.</p></body></html>";
// Antetele emailului
$headers = array(
'From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>',
"Content-Type: text/html"
);
$h = implode("\r\n",$headers) . "\r\n";
// Trimite emailul
wp_mail($args['email'], 'Reînnoiește-ți couponul acum!', $text, $h);
}
Ca întotdeauna, mulțumesc foarte mult pentru ajutor!
Mulțumesc lui Rarst, acum are mult mai mult sens. Așadar, am actualizat acest articol pentru a elabora diferențele menționate de Rarst și i-am dat un vot pozitiv pentru că a lămurit această problemă ; )
În esență, wp_schedule_single_event transmite argumentele către funcția ta prin variabila args, așa cum este arătat în codex. Această variabilă "args" trebuie să fie un array, deoarece fiecare valoare din array va fi mapată la un argument în funcția ta de callback.
Exemplu:
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 va merge la $a, 1 va merge la $b și 3 va merge la $c. Cu toate acestea, transmiterea a trei variabile este posibilă doar datorită acestei linii,
add_action('example_action', 'example', 1, 3);
Dacă ne uităm la codex pentru add_action, vedem că al patrulea argument, 3, este cel care controlează câte argumente sunt transmise funcției de callback. Valoarea implicită este 1.
Deci, acest exemplu funcționează și el:
add_action('example_action', 'example');
$args = array ( array( 2, 1, 3 ) );
wp_schedule_single_event(time(), 'example_action', $args);
function example($a)
{
}
Aici, array( 2, 1, 3) este atribuit doar lui $a.
Deci, problema lui Sardine ar putea fi rezolvată cu o singură modificare, unde linia 7,
$args = array('email' => $email, 'title' => $post->post_title);
devine asta în schimb,
$args = array(array('email' => $email, 'title' => $post->post_title));

Acest lucru nu este nici hacky, nici bug. Primul funcționează exact așa cum trebuie. Pentru al doilea, va trebui să modifici apelul tău add_action()
astfel încât să fie transmise mai multe argumente în loc de cel implicit.

Mulțumesc, Thirlan! Răspunsul lui Rarst a dat cu siguranță startul discuției, iar al tău m-a ajutat să înțeleg mai bine. Ți-am dat upvote, dar i-am acordat lui Rarst acceptul pentru răspuns. De asemenea, ar trebui să modific linia pe care ai sugerat-o, dar nu ar trebui și să schimb add_action('email_about_coupon_action', 'email_about_coupon', 1, 1);
în add_action('email_about_coupon_action', 'email_about_coupon', 1, 3);
pentru ca numărul corect de argumente să fie acceptat?

Cred că există o nepotrivire în modul în care transmiți argumentele și cum te aștepți să funcționeze. Tu transmiți un array de argumente la programare și te aștepți ca funcția ta asociată să primească exact același array de argumente. Nu este cazul.
Evenimentele Cron sunt procesate prin do_action_ref_array()
, care la rândul său transmite argumentele prin call_user_func_array()
.
Deci funcția ta asociată nu primește un array de argumente, ci mai multe argumente - câte unul pentru fiecare element din array-ul tău.
Deci trebuie fie să înfășori array-ul de argumente într-un alt array, fie să modifici funcția ta să proceseze mai multe argumente. Reține că pentru a doua variantă va trebui să modifici și apelul add_action()
astfel încât să fie transmis numărul necesar de argumente în loc de doar unul.

Mulțumesc Rarst! M-a ajutat foarte mult! Așa funcționează toate apelurile add_action
când trimiteți array-uri de valori. În mod surprinzător, cu toată munca pe care am făcut-o în WP, am avut de-a face doar cu trimiterea de argumente unice către funcții prin apeluri add_action.
