La meta
Quiero usar wp_schedule_single_event( )
para ejecutar un solo evento que me envíe un correo electrónico 8 minutos después de que el usuario envíe un formulario.
La cuestión
El siguiente código está en mi functions.php
:
function nkapi_send_to_system( $args ) {
wp_mail( 'xxx', 'xxx', $args );
}
add_action( 'nkapi_send', 'nkapi_send_to_system' );
function schedule_event( $id ) {
wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}
Y el siguiente código se usa para llamar schedule-event
:
schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT
Después de esperar más de 8 minutos, no había un correo electrónico en mi bandeja de entrada.
Lo que probé
Con el complemento Core Control es posible ver qué trabajos cron están programados.
Después de un par de cambios logré corregirlos, y mejor, cuando presioné "Ejecutar ahora", recibí un correo electrónico en mi bandeja de entrada.
Pero por qué los cron no se ejecutan cuando visito mi sitio después de 8 minutos. ¿Qué es lo que posiblemente está mal con este código? Tengo que decir que esta es la primera vez que uso WP Cron.
Intenté más
Después del comentario de vancoder id decidió probar si el código funciona si pongo el siguiente código directamente en functions.php
:
function schedule_event( $id ) {
wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}
if ( isset( $_SESSION['insert_id'] ) ) {
if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
schedule_event( $_SESSION['insert_id'] );
$_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
}
}
La desventaja de este código es que el usuario debe ir a otra página antes de ejecutar este código. Pero por otro lado, esto tampoco funciona, así que ese no sería mi primer problema ...
schedule_event( $_SESSION['insert_id'] );
despide?schedule_event( )
, digamos, en la parte superior del archivo incluido cargado por el shortcode.Respuestas:
Primero, ¿puede confirmar que no tiene habilitados los complementos de almacenamiento en caché? Los complementos de almacenamiento en caché pueden interferir con los trabajos cron porque sus visitantes no reciben una página en vivo sino una versión en caché de su página.
Si tiene habilitado un complemento de almacenamiento en caché, puede elegir una de sus páginas, agregar una exclusión a la configuración del complemento de almacenamiento en caché para esa página para que nunca se almacene en caché.
Luego tendrá que crear manualmente un trabajo cron (usando cpanel si está en un entorno de alojamiento compartido o desde la terminal si es un servidor VPS / dedicado) que visitará esa página cada pocos minutos.
¡Espero que eso ayude!
fuente
En primer lugar, defina sus horarios de trabajo cron personalizados.
add_filter('cron_schedules', array($this, 'cron_schedules'));
Debe decidir dónde y cuándo programar realmente el evento.
Aquí hay solo un fragmento de código de ejemplo, que realiza una llamada a un método de clase personalizado:
Aquí está el código que realmente programa el evento:
Ahora, todo lo que necesita hacer es llamar al nombre de su tarea cron personalizada. En este ejemplo, el nombre de la tarea cron es
custom_imap_import
.add_action('custom_imap_import', array($this, 'do_imap_import'));
Entonces, en este ejemplo,
$this->do_imap_import();
se llama cada 30 minutos (suponiendo que tenga suficiente tráfico a su sitio web).Notas
Requiere una visita a la página para que su cron se active en los momentos correctos.
Ejemplo: si programó una tarea a intervalos de 30 minutos, pero nadie visita su sitio durante 4 horas, su trabajo cron no será despedido hasta que ese visitante llegue a su sitio 4 horas más tarde. Si realmente necesita que su tarea sea disparada cada 30 minutos, se recomienda configurar un trabajo cron legítimo a través de su proveedor de alojamiento web para visitar su sitio web en los intervalos deseados.
¡Los trabajos cron de WordPress no hacen que su sitio web sea lento!
Tal vez esté pensando que si el cron-script tarda mucho en ejecutarse, los visitantes tendrán que esperar hasta que se ejecute el script. No! ¿Cómo puede ser eso posible? Si miras el
wp-cron.php
archivo encontrarás una líneaignore_user_abort(true);
Es una
php.ini
configuración que establece que si deja de cargar el sitio / script, el script no dejará de ejecutarse.Si observa el
wp-includes/cron.php
archivo, encontrará una línea como esta:Eso significa WordPress esperará solamente 0,01 segundos para activar la ejecución luego se abortará pero como se ha definido
ignore_user_abort
paratrue
el guión será de ejecución. Esta funcionalidad es una gran ventaja para ejecutar scripts grandes en trabajos cron de WordPress.Funciones disponibles para ayuda:
wp_schedule_event
wp_schedule_single_event
wp_clear_scheduled_hook
wp_next_scheduled
wp_unschedule_event
wp_get_schedule
fuente
WP_Cron
usa GMT debajo del capó, como el resto de WP, por lo que sería mejor programar el primer evento entime()
lugar decurrent_time()
.WordPress Cron le permite programar tareas, pero solo se ejecutarán si se realiza una solicitud al sitio. Para cada solicitud que reciba WordPress, verificará si hay trabajos cron para procesar, y si es así, activa una solicitud
/wp-cron.php?doing_wp_cron
para procesar el trabajo de forma asíncrona. Si el inicio programado de un trabajo pasa sin una solicitud, el proceso cron no se iniciará.Dado que puede ver y ejecutar sus trabajos programados, es posible que no haya solicitudes que activen el inicio del trabajo cron, especialmente si está utilizando un complemento de almacenamiento en caché. La mejor opción para descargar esto a un horario más regular es deshabilitar la verificación predeterminada en WordPress y usarla
crontab
.Primero para deshabilitar la verificación predeterminada (que puede ayudar un poco con el rendimiento del lado del cliente), agregue lo siguiente a
wp-config.php
:A continuación, cree una tarea para recuperar la
wp-cron.php
página una vez por minuto para procesar cualquier trabajo en el back-end, desde la línea de comando, ingresecrontab -e
y luego agregue una línea similar a la siguiente:fuente
doing_wp_cron=$(date +\%s.\%N)
para evitar eso.Verifique que DISABLE_WP_CRON no esté configurado en su configuración.
De lo contrario, intente deshabilitar todos los complementos (excepto el control central, aunque usaría wp-crontrol) y vea si sus trabajos principales funcionan. Si lo hacen, está experimentando interferencias de complementos en alguna parte.
Del mismo modo, intente cambiar a un tema estándar de veinteañero.
Si ninguno de estos hace alguna diferencia, es probable que sea un problema de alojamiento.
fuente
DISABLE_WP_CRON
puesto en miwp-config.php
, intentaré más cosas y volveré más tardeVerifique cualquier complemento que oculte Wordpress.
¿Cómo ver si este es el problema?
+1. No crea en ningún complemento que "verifique si cron está funcionando", por ejemplo, el complemento del verificador de estado de WP Cron ha demostrado que cron está funcionando. Pero en realidad no fue así.
Conclusión: si se trata de un error 404, apague a) no solo los complementos de almacenamiento en caché como otros sugieren b) sino también cualquier complemento que oculte Wordpress.
fuente