Programar eventos cada segundo jueves del mes

2

Estoy trabajando en un sistema de correo electrónico y quieren que sea automatizado para enviar correos electrónicos cada segundo jueves del mes. Tengo el PHP ordenado y listo para disparar una devolución de llamada para enviar los correos electrónicos, pero soy un novato cuando se trata de eventos de cron y programación.

Esencialmente, tengo esto:

echo date('M d Y', strtotime('first thursday this month'));
echo date('M d Y', strtotime('-5 hours'));
if(date('MdY',strtotime('first thursday this month')) == date('MdY',strtotime('-5 hours'))){
    send_emails();
}else{
    echo 'DO NOT SEND EMAILS';
}

Por lo tanto, comprueba si el día actual (-5 horas para la zona horaria) es el "segundo" jueves del mes (PHP falla y agrega una semana a la fecha).

No estoy seguro de si eso es lo que voy a necesitar para programar un evento o qué. Actualmente se ejecuta cuando se visita la página del complemento, pero me gustaría que fuera un proceso propio que se ejecute independientemente de si se visita una página.

Cualquier ayuda es muy apreciada!

¡Gracias!

    
pregunta Josh Allen 07.02.2012 - 21:11

1 respuesta

6

WordPress le permite agregar horarios cron personalizados, que normalmente es lo que querría hacer en esta situación, junto con wp_schedule_event() . Pero, funcionan en intervalos en lugar de fechas / horas específicas. Por ejemplo,

add_filter( 'cron_schedules', 'addCustomCronIntervals' );
function addCustomCronIntervals( $schedules )
{
    $schedules[ self::PREFIX . 'debug' ] = array(
        'interval'  => 60 * 2,
        'display'   => 'Every 2 minutes'
    );

    return $schedules;
}

Entonces, en su lugar, puedes hacerlo con tu enfoque actual, pero también deberás configurar un transitorio para asegurarte de que los correos electrónicos no se envíen cada vez que se carga la página.

$firstThursday = date_i18n( 'Ymd', strtotime( 'first thursday this month', current_time( 'timestamp' ) ) );
$today = date_i18n( 'Ymd', current_time( 'timestamp' ) );
if( strcmp( $firstThursday, $today ) === 0 && ! get_transient( 'alreadySentEmails' ) )
{
    send_emails();
    set_transient( 'alreadySentEmails', 60 * 60 * 24 );
}

Tenga en cuenta que debe usar WordPress ' date_i18n() y current_time () funciona en lugar de las funciones date() y time() de PHP, que strtotime() llama implícitamente, para que las zonas horarias se manejen correctamente.

También tenga en cuenta que algunos formatos relativos son nuevos en PHP 5.3, así que asegúrese de que su servidor es actual.

    
respondido por el Ian Dunn 17.06.2012 - 09:37

Lea otras preguntas en las etiquetas