Запланируйте мероприятие на каждый второй четверг месяца


Я работаю над системой электронной почты, и они хотят, чтобы она была автоматизирована для отправки электронных писем каждый второй четверг месяца. Я разобрался с PHP и готов к обратному вызову для отправки электронных писем, но я полный новичок, когда дело доходит до cron и планирования событий.

По сути, у меня есть это:

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

Таким образом, он проверяет, является ли текущий день (-5 часов для часового пояса) "вторым" четвергом месяца (PHP ошибается и добавляет неделю к дата).

Я не уверен, что это то, что мне нужно будет сделать, чтобы запланировать мероприятие или что-то еще. В настоящее время он запускается при посещении страницы плагина, но я бы хотел, чтобы это был собственный процесс, который выполняется независимо от того, посещается страница или нет.

Мы будем очень признательны за любую помощь!

Спасибо!

Author: Josh Allen, 2012-02-07

1 answers

WordPress позволяет добавлять пользовательские расписания cron, что обычно и требуется в данной ситуации, в сочетании с wp_schedule_event(). Но они работают на основе интервалов, а не конкретных дат/времени. Например,

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

    return $schedules;
}

Таким образом, вместо этого вы могли бы сделать это с помощью вашего текущего подхода, но вам также потребуется настроить переходный процесс, чтобы убедиться, что электронные письма не отправляются каждый раз при загрузке страницы.

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

Обратите внимание, что вы должны использовать WordPress' date_i18n() и current_time() функции вместо PHPdate() и time(), которые strtotime() неявно вызывают -, так что часовые пояса обрабатываются правильно.

Также обратите внимание, что некоторые относительные форматы являются новыми для PHP 5.3, поэтому убедитесь, что ваш сервер является текущим.

 7
Author: Ian Dunn, 2012-07-03 17:38:31