Как в wordpress запустить cron задание в момент запуска ajax?
Есть сайт на wordpress, в котором есть необходимость передать заполненные пользователем имя и телефон и отправить данные без перезагрузки в cron задание.
Но, пока не могу разобраться, можно ли с помощью ajax в принципе запускать cron задания или хуки.
На данный момент, данные пользователей cron запускаются только если страницу обновить или заново зайти на сайт.
script.js
var datamail = {
action: 'cronMail',
name: $('input[name=first_name]').val(),
tel: $('[name=phone]').val()
};
$.ajax({
url: ajaxsettings.url,
type: 'get',
data: datamail,
success: function (data) {
},
error: function (err) {
}
});
functions.php
add_action( 'wp_ajax_cronMail', 'cronMail');
add_action( 'wp_ajax_nopriv_cronMail','cronMail');
wp_clear_scheduled_hook( 'mail_hook' );
add_action( 'mail_hook', 'mail_hook_function', 10, 2);
function cronMail(){
$name = $_GET['name'];
$tel = $_GET['tel'];
wp_schedule_single_event( time() + 300, 'mail_hook', array( $_GET['name'], $_GET['tel']));
spawn_cron();
exit();
}
function mail_hook_function($name,$tel) {
$message = 'Заявка от потенциального клиента '.$name.' с телефоном '.$tel;
wp_mail( '[email protected]', 'Новая заявка от клиента', $message);
}
Ответы (1 шт):
Cron так и работает - только при обращении к сайту. spawn_cron вызовет те хуки, чье время уже подошло, и не выполнит mail_hook, потому что он в будущем на 300 секунд.
Уберите spawn_cron из кода, он тут не нужен. Переместите clear_scheduled_hook внутрь ajax, перед wp_schedule_single_event.
После этого код будет работать так, как должен: событие откладывается на 5 минут, и срабатывает только, если происходит обращение к сайту. Поймите, это основополагающий принцип: сам код php никак не может быть запущен по таймеру, поэтому cron в WordPress - это псевдотаймер. При любом обращении к сайту проверяется, время каких назначенных событий уже прошло, и они выполняются.
На VPS сервере можно поставить серверный крон. Тогда серверное ПО будет дёргать сайт каждые, скажем, 5 минут, или 1 минуту. И WP cron будет срабатывать без обращений к сайту.
На хостинге так не получится. Но можно использовать внешний сервис easycron.com, там есть инструкция, как настроить его для WordPress. После этого события cron будут выполняться по внешнему таймеру.