WP отложенная отправка письма

Рейтинг: 0Ответов: 1Опубликовано: 04.02.2023

Есть такая задача на WordPress. После того как статья была опубликована, отсылать первое письмо Админу сайта, а через N секунд второе письмо автору поста. Письма разные. Код для отсылок письма вот, рабочий.

/* Letter for Admin */

function emailForAdmin($post_id) {
    global $wpdb;
    $post = get_post($post_id);
    $link = $post->guid;
    $author = get_userdata($post->post_author);

    $message = "Hi Admin, the user - <b>". $author->display_name."</b> create new post ". $post->post_title ." You can check it ".$link." ";
    $headers = array(
        'From: Me Myself <me@example.net>',
        'content-type: text/html',
    );
    wp_mail(  get_option('admin_email'), "Created new post - ". $post->post_title ." ", $message, $headers);

    $delaySeconds = 10;
    wp_schedule_single_event( time() + $delaySeconds, 'email_action_hook');
}
add_action('publish_post', 'emailForAdmin');


add_action( 'email_action_hook', 'authorNotification' );
/* Letter for Author */

function authorNotification($post_id) {
    global $wpdb;
    $post = get_post($post_id);
    $link = $post->guid;
    $author = get_userdata($post->post_author);

    $message = "Hi ".$author->display_name.", Well done! Your post,". $post->post_title ." has been reviewed and just been published. View here ".$link."";
    wp_mail($author->user_email, "Your article status", $message);
}

Проблема в отложенной отправке второго письма. Пользовался функцией wp_schedule_single_event про которую, тут так подробно расписано..., но вот не могу понять чего автору поста письмо не приходит. Как вообще можно подтвердить, что данная функция отрабатывает ? Пробовал как в примере, то emailадмина тоже не меняет.

Ответы

▲ 1

Тут надо понимать, как работает cron в WordPress. Это псевдокрон по умолчанию, который зависит от посещаемости сайта. Вы запускаете wp_schedule_single_event, которая не делает ничего, кроме записи с базу времени следующего запуска вашего события. Допустим, это 5 секунд.

Наличие события проверяется при очередном обращении к сайту. Если следующее обращение будет через 1 секунду, а второе - через год, то ваше событие сработает через год.

Другое дело,если сервер запускает wp-cron.php через жёстко заданные интервалы, привязанные к внутренним часам сервера. Это системный крон. В таком случае, все cron события будут проверяться в течение заданного системного интервала, например, 15 минут. Тогда ваше событие, назначенное через 5 секунд, гарантированно выполнится через 15 минут.

Но для настройки серверного крона вам нужен доступ к Linux root сервера.