Форма обратной связи 7 – автоматическая задержка электронной почты

Вопрос или проблема

Я хотел бы спросить, есть ли способ автоматически задерживать отправку электронных писем после завершения?

Я хочу, чтобы эти письма приходили через 1-2 часа.

Существует ли код для этого?

Спасибо!

Не тестировалось, но возможно, вы можете просто использовать sleep с wpcf7_before_send_email

Что-то вроде этого:

add_action("wpcf7_before_send_mail", "wpcf7_pause_send");  
function wpcf7_pause_send($cf7) {
    
    sleep(3600);
}

Я не знаю CF7 достаточно хорошо, чтобы дать вам конкретные рекомендации, но думаю, вам нужно будет

  1. Записать данные формы в базу данных, чтобы вы могли прочитать их позже, когда захотите отправить электронное письмо. Я не думаю, что CF делает это автоматически (хотя, например, Gravity формы делают это)
  2. При отправке
    1. Отменить текущую отправку письма: я полагаю, существует событие, к которому вы можете привязаться и вернуть false, которое сделает это
    2. Либо запланировать одноразовое событие через два часа с использованием wp_schedule_single_event() и ID сохраненных данных в базе данных, и в обработчике этого события вызвать обратно CF7 с данными для отправки письма, а затем либо удалить сохраненные данные формы из базы данных, либо иным образом отметить их как отправленные
    3. Либо настроить регулярную запланированную работу с помощью wp_schedule_event(), которая выполняется каждые пять минут и проверяет, нужно ли отправлять какие-либо письма, например, если есть новая запись данных формы, сохраненная более 2 часов назад, которая еще не отмечена как отправленная в базе данных, и если да, то отправляет письмо и отмечает эту форму как отправленную
  3. В зависимости от уровня вашего трафика вам может понадобиться настроить альтернативный механизм cron, чтобы убедиться, что эти задания выполняются вовремя: Подключение WP-Cron к системному планировщику

Кроме того, в зависимости от того, как вы отправляете электронные письма, возможно, вы сможете генерировать их при первоначальной отправке формы, чтобы отправить позже, например, если вы отправляете их через Outlook.com или если ваш обработчик wp_mail имеет встроенные повторные попытки и планирование (как я предполагаю, что может быть WP Offload SES?)

Этот плагин может помочь вам достичь вашей цели:
https://wordpress.org/plugins/delayed-notifications-for-contact-form-7/

В некоторых случаях, если вы не вошли в свою учетную запись на сайте, ваша форма не отправляется. Попробуйте отправить форму, будучи авторизованным на сайте.

Ответ или решение

Чтобы настроить автоматическую задержку отправки электронных писем, используя плагин Contact Form 7 в WordPress, существует несколько методов. Ваша задача заключается в том, чтобы сделать так, чтобы письма приходили не сразу, а с задержкой — от одного до двух часов после завершения обработки формы. Давайте подробно рассмотрим, как вы можете это реализовать.

1. Использование хука wpcf7_before_send_mail

Один из простых способов заключается в использовании функции sleep(), чтобы приостановить выполнение скрипта на определенное время. Однако это метод не является оптимальным, так как он может привести к блокировке сервера, если не использовать его осторожно. Пример кода:

add_action("wpcf7_before_send_mail", "wpcf7_pause_send");  
function wpcf7_pause_send($cf7) {
    sleep(3600); // Задержка в 1 час
}

Обратите внимание, что этот метод приостановит выполнение всех запросов на сервер, пока идет задержка, что может негативно сказаться на производительности.

2. Запись данных формы в базу данных

Второй, более предпочтительный подход — это запись данных формы в базу данных и последующая организация задачи по отправке писем.

Шаги:

  1. Запись данных формы: Сохраните данные, введенные пользователем, в базе данных. Это можно сделать, используя кастомные таблицы или метаданные.

  2. Отмена отправки письма: В момент отправки формы отмените автоматическую отправку письма. Это можно реализовать с помощью хука, например, wpcf7_before_send_mail, и вернуть false.

  3. Запланируйте событие:
    Используйте функцию wp_schedule_single_event(), чтобы запланировать отправку письма через 2 часа. В обработчике этого события вы сможете повторно взять данные из базы и отправить письмо.

add_action('wpcf7_before_send_mail', 'my_custom_form_handler');
function my_custom_form_handler($contact_form) {
    global $wpdb;

    // Сохранение данных формы в базу
    $submission = WPCF7_Submission::get_instance();
    if ($submission) {
        $data = $submission->get_posted_data();
        $wpdb->insert('my_custom_table', $data); // Сохраните данные формы в вашей таблице

        // Отмена отправки
        return false; 
    }

    // Запланировать задачу на отправку
    $time = time() + 7200; // 2 часа в будущем
    $event_id = $wpdb->insert_id; // Или другой идентификатор вашей записи
    wp_schedule_single_event($time, 'send_delayed_email', [$event_id]);
}

add_action('send_delayed_email', 'my_send_email');
function my_send_email($event_id) {
    // Извлеките данные из базы и отправьте письмо
    // wp_mail(...) // отсыл email
}

3. Использование плагина

Также можно рассмотреть возможность использования стороннего плагина. Например, Delayed Notifications for Contact Form 7, который может выполнять аналогичные функции без необходимости написания кода.

4. Учет особенностей WP-Cron

Запланированные события в WordPress используют систему WP-Cron, которая может не срабатывать, если на сайте нет трафика. В таких случаях стоит рассмотреть возможность настройки системного крон-задания на вашем сервере, чтобы обеспечить надежную работу запланированных задач.

Заключение

Возможность установки задержки отправки электронной почты с помощью Contact Form 7 может быть реализована несколькими способами. Если вы не обладаете достаточными знаниями в программировании, использование плагина может быть более удобным решением. Однако если вам нужна полноценная кастомизация, вам может потребоваться написание собственного кода. В любом случае, убедитесь, что выбранное вами решение не приводит к ухудшению производительности вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...