Изучаем инструмент планирования задач CRON.
CronTab — это отдельная утилита на хостинге, с помощью которой в заданное время и интервал мы запускаем определенный файл PHP.
В WordPress есть встроенная функция, которая работает на основе серверного cron — wp_cron.
Смотреть все задания wp_cron
<?php echo '<pre>';
print_r (get_option('cron'));
echo '</pre>'; ?>
Для мониторинга всех текущих cron задач есть отличное решение — плагин WP-Crontrol (100 000). Из него можно видеть список задач, когда сработает в следующий раз сработает каждое из заданий, интервалы. Можно вручную запустить любую задачу или удалить.
Данный плагин помог решить проблему с одним из cron заданий wp, т.к. в нем можно для каждого хука посмотреть и назначить необходимый интервал, чтобы не искать по всем функциям где он может назначаться.
Выключение wp_cron
wp_cron — служебная функция WordPress к которой цепляются все плагины для запуска Crona. Некоторые разработчики считают что автоматический wp_cron тормозит систему, да и работает только тогда когда на сайт заходит посетитель. Советуют отключать его и обращаться к нему с необходимой частотой через Cron на сервере (хостинге).
Отключаем автоматический wp_cron, прописав эту строку в wp_config
define('DISABLE_WP_CRON', true);
А в Cron прописываем следующую команду:
wget https://site.ru/wp-cron.php?doing_wp_cron=1 > /dev/null 2>&1
Запуск функции 1 раз в час
Данная функция очищает все временные файлы в таблице wp_option
// добавляем запланированный хук
add_action( 'wp', 'my_activation' );
function my_activation() {
if( ! wp_next_scheduled( 'my_hourly_event' ) ) {
wp_schedule_event( time(), 'hourly', 'my_hourly_event');
}
}
// добавляем функцию к указанному хуку
add_action( 'my_hourly_event', 'do_this_hourly' );
function do_this_hourly() {
global $wpdb;
$sql = 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE "_transient_%"';
$wpdb->query($sql);
}
Отправка письма в произвольный период времени
// регистрируем 5 минутный интервал
add_filter( 'cron_schedules', 'cron_add_five_min' );
function cron_add_five_min( $schedules ) {
$schedules['five_min'] = array(
'interval' => 60 * 5,
'display' => 'Раз в 5 минут'
);
return $schedules;
}
// регистрируем событие
add_action( 'wp', 'my_activation' );
function my_activation() {
if ( ! wp_next_scheduled( 'my_five_min_event' ) ) {
wp_schedule_event( time(), 'five_min', 'my_five_min_event');
}
}
// добавляем функцию к указанному хуку
add_action( 'my_five_min_event', 'do_every_five_min' );
function do_every_five_min() {
$headers = 'From: Александр <info@opttour.ru>' . "\r\n"; // в виде строки
wp_mail('mail@mail.ru', 'Какая-то тема', 'Какое-то сообщение', $headers);
}