Uso de wp_schedule_single_event con argumentos para enviar correos
Estoy intentando programar un trabajo cron pseudo-automático para enviar un correo electrónico después de un tiempo determinado utilizando un plugin de WordPress.
Hasta ahora, he logrado que este código funcione cuando ingreso manualmente la dirección de correo y el mensaje en la función email_about_coupon()
. Sin embargo, cuando intento enviar los argumentos a la función, el correo nunca se envía.
Usando el plugin Cron GUI, puedo ver que el trabajo cron se registra incluso con los argumentos. Creo que estoy haciendo algo incorrectamente que no permite que los argumentos se utilicen adecuadamente dentro de la función cuando se ejecuta.
Esto es lo que tengo:
function schedule_email_cron($post_id)
{
// Obtener el tiempo UNIX para 30 días después
$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)
{
// Texto del email
$text = "<html><body><p>Tu cupón titulado ".$args['title']." está por expirar. Por favor visita <a href=\"\">".get_bloginfo('siteurl')."/registered/</a> ".get_bloginfo('siteurl')."/registered/ para renovar tu cupón.</p></body></html>";
// Cabeceras del email
$headers = array(
'From: '.get_bloginfo('name').' <'.get_bloginfo('admin_email').'>',
"Content-Type: text/html"
);
$h = implode("\r\n",$headers) . "\r\n";
// Enviar email
wp_mail($args['email'], '¡Renueva Tu Cupón Ahora!', $text, $h);
}
¡Como siempre, muchas gracias por tu ayuda!
Gracias a Rarst, esto ahora tiene mucho más sentido. Así que he actualizado esta publicación para elaborar las diferencias que mencionó Rarst y he votado positivamente su respuesta por arrojar luz sobre esto ;)
Básicamente, wp_schedule_single_event pasa los argumentos a tu función a través de la variable args como se muestra en el codex. Esta variable "args" debe ser un array porque cada valor en el array se mapeará a un argumento en tu función de callback.
Ejemplo:
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 irá a $a, 1 irá a $b y 3 irá a $c. Sin embargo, pasar tres variables solo es posible gracias a esta línea:
add_action('example_action', 'example', 1, 3);
Si miras el codex para add_action, verás que el cuarto argumento, 3, es lo que controla cuántos argumentos se pasan a la función de callback. El valor predeterminado es 1.
Así que este ejemplo también funciona:
add_action('example_action', 'example');
$args = array ( array( 2, 1, 3 ) );
wp_schedule_single_event(time(), 'example_action', $args);
function example($a)
{
}
Aquí, el array( 2, 1, 3) se asigna solo a $a.
Por lo tanto, el problema de Sardine podría resolverse con un cambio en la línea 7, donde:
$args = array('email' => $email, 'title' => $post->post_title);
se convierte en esto:
$args = array(array('email' => $email, 'title' => $post->post_title));

Esto no es un truco ni un error. El primero funciona exactamente como se supone que debe. Para el segundo, necesitarás modificar tu llamada a add_action()
para que se pasen más argumentos en lugar del predeterminado.

¡Gracias Thirlan! La respuesta de Rarst definitivamente puso las cosas en marcha y la tuya me ayudó a entenderlo mejor. Te di un voto positivo, pero le di a Rarst la aceptación por la respuesta. Además, necesitaría modificar la línea que sugeriste, pero ¿no tendría que cambiar también add_action('email_about_coupon_action', 'email_about_coupon', 1, 1);
a add_action('email_about_coupon_action', 'email_about_coupon', 1, 3);
para que se acepte el número correcto de argumentos?

Creo que tienes una discrepancia en cómo pasas los argumentos y cómo esperas que funcione. Pasas un array de argumentos para programar y esperas que tu función enganchada reciba el mismo array de argumentos. Este no es el caso.
Los eventos Cron son procesados por do_action_ref_array()
, que a su vez pasa los argumentos a través de call_user_func_array()
.
Así que tu función enganchada no recibe un array de argumentos, recibe múltiples argumentos - uno por cada elemento en tu array.
Por lo tanto, necesitas envolver el array de argumentos en otro array o modificar tu función para procesar múltiples argumentos. Ten en cuenta que para lo último también necesitarás modificar tu llamada a add_action()
para que se pase el número requerido de argumentos en lugar de solo uno.

¡Gracias Rarst! ¡Fue de gran ayuda! ¿Es así como funcionan todas las llamadas add_action
cuando se envían arrays de valores? Sorprendentemente, con todo el trabajo que he hecho en WP, realmente solo he trabajado con el envío de argumentos individuales a funciones mediante llamadas add_action.
