Введение в обработчики форм в WordPress и WPForms
WPForms — один из самых популярных плагинов для создания форм на WordPress. По умолчанию он предоставляет удобный интерфейс создания форм и базовую обработку данных, однако в некоторых случаях стандартных возможностей недостаточно. Например, если нужно отправить данные формы в стороннюю систему, выполнить сложную валидацию или изменить стандартный процесс обработки, требуется создать собственный обработчик формы.
В этой статье мы подробно разберём, как в WordPress с WPForms реализовать собственный обработчик формы, используя хуки и фильтры плагина. Это позволит гибко управлять данными формы, расширять функциональность и интегрировать WPForms с другими сервисами.
Почему стоит создавать собственный обработчик формы
Стандартный обработчик WPForms отлично подходит для большинства задач, но есть ситуации, когда нужна дополнительная логика:
- Отправка данных в CRM или другие внешние API;
- Дополнительная валидация данных, недоступная в стандартных настройках;
- Логирование или сохранение данных в кастомные таблицы базы данных;
- Динамическая модификация данных перед сохранением;
- Триггеринг дополнительных действий после отправки формы.
Создание собственного обработчика решает эти задачи и повышает гибкость решений на базе WPForms.
Как работает обработка форм в WPForms: основные хуки
WPForms предоставляет несколько хуков для работы с отправкой формы. Основные из них:
wpforms_process_complete— срабатывает после успешной обработки формы, можно получить все данные и выполнить дополнительные действия;wpforms_process_before_send_email— позволяет изменить данные перед отправкой email;wpforms_process_validate— позволяет добавить собственную валидацию;wpforms_process— основной хук обработки, можно вмешаться в процесс.
Пример использования хука для перехвата данных после отправки формы:
add_action('wpforms_process_complete', 'wpformru_custom_form_handler', 10, 4);
function wpformru_custom_form_handler($fields, $entry, $form_data, $entry_id) {
// Здесь $fields — массив с данными полей формы
// $entry — информация о записи в базе
// $form_data — данные формы
// $entry_id — ID записи
// Пример: отправка данных в сторонний API
$data = [];
foreach ($fields as $field) {
$data[$field['name']] = $field['value'];
}
$response = wpformru_send_data_to_api($data);
if ($response['status'] !== 'success') {
// Логируем ошибку или выполняем другие действия
error_log('Ошибка отправки данных в API: ' . print_r($response, true));
}
}
function wpformru_send_data_to_api($data) {
$api_url = 'https://example.com/api/receive';
$args = [
'body' => json_encode($data),
'headers' => [
'Content-Type' => 'application/json',
],
'timeout' => 15,
];
$response = wp_remote_post($api_url, $args);
if (is_wp_error($response)) {
return ['status' => 'error', 'message' => $response->get_error_message()];
}
$code = wp_remote_retrieve_response_code($response);
if ($code !== 200) {
return ['status' => 'error', 'message' => 'HTTP code ' . $code];
}
return ['status' => 'success'];
}
Добавление собственной валидации формы в WPForms
Иногда нужна более сложная проверка данных, чем доступна в стандартных настройках WPForms. Для этого используется фильтр wpforms_process_validate.
Пример: запретить отправку формы, если в поле "Телефон" введены буквы:
add_filter('wpforms_process_validate', 'wpformru_validate_phone_field', 10, 3);
function wpformru_validate_phone_field($errors, $fields, $form_data) {
foreach ($fields as $field) {
if ($field['name'] === 'Телефон') {
if (!preg_match('/^\+?[0-9\-\s]{7,15}$/', $field['value'])) {
$errors[$field['id']] = 'Пожалуйста, введите корректный номер телефона';
}
}
}
return $errors;
}
В этом примере мы проверяем, что в поле «Телефон» содержатся только цифры, пробелы, дефисы и опционально знак + в начале. Если проверка не проходит, добавляем ошибку, которая отобразится пользователю.
Сохранение данных формы в отдельную таблицу базы данных
Иногда нужно хранить данные формы отдельно от стандартных записей WPForms. Для этого можно создать новую таблицу в базе данных и записывать туда данные при отправке формы.
Пример создания таблицы при активации темы или плагина:
function wpformru_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpformru_submissions';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
form_id mediumint(9) NOT NULL,
submission_data longtext NOT NULL,
submitted_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wpformru_create_custom_table');
И пример записи данных в эту таблицу при отправке формы:
add_action('wpforms_process_complete', 'wpformru_save_submission_to_custom_table', 10, 4);
function wpformru_save_submission_to_custom_table($fields, $entry, $form_data, $entry_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpformru_submissions';
$data = [];
foreach ($fields as $field) {
$data[$field['name']] = $field['value'];
}
$wpdb->insert(
$table_name,
[
'form_id' => $form_data['id'],
'submission_data' => maybe_serialize($data),
'submitted_at' => current_time('mysql'),
]
);
}
Таким образом, вы сможете хранить и затем обрабатывать данные отправленных форм отдельно, например для интеграции с CRM или аналитикой.
Использование сторонних плагинов для расширения обработки форм
Кроме собственного кода, можно использовать плагины, которые расширяют функциональность WPForms:
- WP Webhooks — позволяет отправлять данные формы в любые внешние сервисы через вебхуки;
- WPForms Hooks Addon — добавляет дополнительные хуки и фильтры для более гибкой настройки;
- FluentCRM — интеграция с CRM для автоматической работы с контактами из форм;
- WP All Export — экспорт данных форм в удобном формате.
Однако если нужны уникальные сценарии, лучше создавать собственные обработчики, как описано выше.
Советы по отладке и безопасности при создании обработчиков форм
При работе с собственными обработчиками важно учитывать несколько моментов:
- Проверяйте и фильтруйте все входящие данные, чтобы избежать XSS и SQL-инъекций;
- Используйте
wp_nonce_fieldи проверяйте nonce при обработке, если создаёте свои формы; - Включите логирование ошибок для быстрого выявления проблем;
- Тестируйте на разных формах и сценариях, чтобы избежать конфликтов;
- Обязательно делайте резервные копии перед внесением изменений.
Правильный подход к безопасности и отладке обеспечит стабильную и безопасную работу вашего сайта.