Как в 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 шт):

Автор решения: KAGG Design

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 будут выполняться по внешнему таймеру.

→ Ссылка