Иногда в проектах на WordPress возникает задача не сразу отправлять данные, введённые пользователем в форму, а отложить эту отправку на определённое время. Например, для рассылки подтверждений, создания отложенных задач или иных бизнес-процессов. В стандартном функционале WPForms такой возможности нет, но её можно реализовать самостоятельно с помощью PHP и встроенного планировщика задач WP-Cron.
Почему может понадобиться отложенная отправка формы в WPForms
Отложенная отправка формы часто нужна в случаях, когда:
- Необходимо собрать данные, но отправить уведомление или обработать их позже, например, после проверки администратором.
- Требуется отправлять email не сразу, а через некоторое время после заполнения формы, например, приветственное письмо через час.
- Нужно снизить нагрузку на сервер, распределяя обработку форм по времени.
- Выполнить интеграцию с внешними сервисами с задержкой, чтобы избежать временных ограничений.
В WPForms нет встроенной функции отложенной отправки, но с помощью хуков и WP-Cron вы можете реализовать этот функционал самостоятельно.
Как реализовать отложенную отправку формы WPForms с помощью WP-Cron
WPForms предоставляет хук wpforms_process_complete, который срабатывает после успешной отправки формы. Мы можем перехватить этот момент и не отправлять уведомления сразу, а записать данные в таблицу или transient, и запланировать задачу на выполнение позже.
Ниже пример, как это сделать:
add_action('wpforms_process_complete', 'wpformsru_schedule_delayed_email', 10, 4); function wpformsru_schedule_delayed_email($fields, $entry, $form_data, $entry_id) { // Получаем email пользователя из полей формы $user_email = ''; foreach ($fields as $field) { if ($field['type'] === 'email') { $user_email = $field['value']; break; } } if (empty($user_email)) { return; } // Планируем событие через 1 час if (!wp_next_scheduled('wpformsru_send_delayed_email', array($entry_id))) { wp_schedule_single_event(time() + 3600, 'wpformsru_send_delayed_email', array($entry_id)); } }В этом коде мы планируем задачу wpformsru_send_delayed_email, которая сработает через час после отправки формы. Для отправки письма нужно добавить обработчик этого события:
add_action('wpformsru_send_delayed_email', 'wpformsru_handle_delayed_email'); function wpformsru_handle_delayed_email($entry_id) { // Получаем данные отправленной формы по ID записи global $wpdb; $table = $wpdb->prefix . 'wpforms_entries'; $entry = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE entry_id = %d", $entry_id)); if (!$entry) { return; } // Декодируем данные полей из JSON $fields = json_decode($entry->fields, true); $user_email = ''; foreach ($fields as $field) { if ($field['type'] === 'email') { $user_email = $field['value']; break; } } if (empty($user_email)) { return; } // Отправляем email (пример простого письма) $subject = 'Спасибо за вашу заявку'; $message = 'Ваши данные успешно получены и будут обработаны в ближайшее время.'; wp_mail($user_email, $subject, $message); }Обработка ошибок и повторные попытки отправки
При работе с отложенной отправкой важно учитывать возможные ошибки: сбои почтового сервера, недоступность базы данных, отключение WP-Cron. Для надёжности можно добавить логику повторных попыток.
Реализуйте в обработчике wpformsru_handle_delayed_email проверку результата wp_mail. Если отправка не удалась, повторно планируйте задачу с задержкой.
Пример добавления повторной попытки:
function wpformsru_handle_delayed_email($entry_id, $attempt = 1) { // ... предыдущий код ... $sent = wp_mail($user_email, $subject, $message); if (!$sent && $attempt < 3) { // Повторить через 10 минут wp_schedule_single_event(time() + 600, 'wpformsru_send_delayed_email_retry', array($entry_id, $attempt + 1)); } } add_action('wpformsru_send_delayed_email_retry', 'wpformsru_handle_delayed_email', 10, 2);Использование плагинов для отложенной отправки уведомлений
Если хочется избежать самостоятельного кода, можно использовать плагины, расширяющие функционал WPForms, например:
- WPForms Advanced Notifications — позволяет создавать сложные сценарии уведомлений с задержкой и условиями.
- Clearfy Pro — улучшает работу и безопасность WPForms, в том числе с уведомлениями.
Однако такие решения часто платные и могут быть избыточны, если нужна только простая отложенная отправка.
Советы по оптимизации и безопасности
Использование WP-Cron для отложенной отправки — удобный способ, но он зависит от посещаемости сайта. Для высоконагруженных проектов лучше настроить системный cron на сервере, чтобы гарантировать выполнение задач вовремя.
Также убедитесь, что данные формы хранятся безопасно и не передаются в открытом виде, особенно если в них есть личная информация.
Регулярно проверяйте логи ошибок и корректность выполнения отложенных задач. Для этого можно использовать плагины логирования или собственные записи через error_log.
Итог
Отложенная отправка формы в WPForms — реальная задача, решаемая через хуки и WP-Cron. Такой подход расширяет возможности форм и помогает автоматизировать сложные процессы. При необходимости используйте и готовые плагины с расширенными функциями.