Запланируйте мероприятие на каждый второй четверг месяца
Я работаю над системой электронной почты, и они хотят, чтобы она была автоматизирована для отправки электронных писем каждый второй четверг месяца. Я разобрался с 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 ошибается и добавляет неделю к дата).
Я не уверен, что это то, что мне нужно будет сделать, чтобы запланировать мероприятие или что-то еще. В настоящее время он запускается при посещении страницы плагина, но я бы хотел, чтобы это был собственный процесс, который выполняется независимо от того, посещается страница или нет.
Мы будем очень признательны за любую помощь!
Спасибо!
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, поэтому убедитесь, что ваш сервер является текущим.