web-dev-qa-db-fra.com

Programmer un événement tous les deuxièmes jeudis du mois

Je travaille sur un système de courrier électronique et ils veulent qu'il soit automatisé pour envoyer des courriels tous les deuxièmes jeudis du mois. J'ai le PHP trié et prêt à déclencher un rappel pour l'envoi des courriels, mais je suis un débutant en matière d'événements cron et de planification.

Essentiellement, j'ai ceci:

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';
}

Donc, il vérifie si le jour actuel (-5 heures pour le fuseau horaire) est le "deuxième" jeudi du mois (PHP bugs et ajoute une semaine à la date).

Je ne sais pas si c'est ce que je vais devoir faire pour planifier un événement ou quoi. Actuellement, il fonctionne lorsque la page du plug-in est visitée, mais j'aimerais que ce soit son propre processus qui s'exécute, que la page soit visitée ou non.

Toute aide est grandement appréciée!

Merci!

2
Josh Allen

WordPress vous permet d'ajouter des planifications cron personnalisées, ce qui correspond normalement à ce que vous souhaitez faire dans cette situation, en conjonction avec wp_schedule_event() . Mais, ils travaillent en fonction d'intervalles plutôt que de dates/heures spécifiques. Par exemple,

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

    return $schedules;
}

Vous pouvez donc le faire avec votre approche actuelle, mais vous devez également configurer un transitoire pour vous assurer que les courriels ne sont pas envoyés à chaque chargement de la page.

$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 );
}

Notez que vous devriez utiliser WordPress ' date_i18n() et current_time () () à la place des date() et time() de PHP - que strtotime() appelle implicitement -, afin que les fuseaux horaires soient gérés correctement.

Notez également que certains formats relatifs sont nouveaux pour PHP 5.3, assurez-vous donc que votre serveur est à jour.

6
Ian Dunn