Передача данных через форму без авторизации
Вот комплексное решение для передачи данных через формы без необходимости авторизации пользователя, с использованием как AJAX, так и классического POST-запроса.
1. HTML форма (базовый пример)
<form id="contact-form" class="ajax-form" method="post">
<input type="text" name="name" placeholder="Ваше имя" required>
<input type="email" name="email" placeholder="Ваш email" required>
<input type="tel" name="phone" placeholder="Ваш телефон">
<textarea name="message" placeholder="Ваше сообщение" required></textarea>
<!-- Скрытые поля для защиты -->
<input type="hidden" name="action" value="process_form">
<?php wp_nonce_field('form_nonce_action', 'form_nonce'); ?>
<button type="submit">Отправить</button>
<div class="form-message"></div>
</form>
2. AJAX реализация (jQuery)
jQuery(document).ready(function($) {
// Обработка AJAX-форм
$('.ajax-form').on('submit', function(e) {
e.preventDefault();
const form = $(this);
const formData = form.serialize();
const messageContainer = form.find('.form-message');
$.ajax({
url: ajaxurl, // ajaxurl предоставляется WordPress
type: 'POST',
data: formData,
beforeSend: function() {
form.find('button').prop('disabled', true);
messageContainer.html('<p class="loading">Отправка...</p>');
},
success: function(response) {
if (response.success) {
messageContainer.html('<p class="success">' + response.data.message + '</p>');
form[0].reset();
} else {
messageContainer.html('<p class="error">' + response.data + '</p>');
}
},
error: function(xhr) {
messageContainer.html('<p class="error">Ошибка соединения с сервером</p>');
console.error(xhr.responseText);
},
complete: function() {
form.find('button').prop('disabled', false);
}
});
});
// Инициализация маски для телефона (опционально)
$('input[type="tel"]').inputmask('+7 (999) 999-99-99');
});
3. PHP обработчик для AJAX
add_action('wp_ajax_process_form', 'process_form_callback');
add_action('wp_ajax_nopriv_process_form', 'process_form_callback');
function process_form_callback() {
// Проверка nonce
check_ajax_referer('form_nonce_action', 'form_nonce');
// Валидация данных
$name = sanitize_text_field($_POST['name'] ?? '');
$email = sanitize_email($_POST['email'] ?? '');
$phone = sanitize_text_field($_POST['phone'] ?? '');
$message = sanitize_textarea_field($_POST['message'] ?? '');
// Проверка обязательных полей
if (empty($name) || empty($email) || empty($message)) {
wp_send_json_error('Заполните все обязательные поля');
}
// Дополнительная валидация email
if (!is_email($email)) {
wp_send_json_error('Укажите корректный email');
}
// Подготовка данных
$form_data = array(
'name' => $name,
'email' => $email,
'phone' => $phone,
'message' => $message,
'ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'timestamp' => current_time('mysql')
);
// 1. Отправка email
$email_sent = send_form_email($form_data);
// 2. Сохранение в базу данных (опционально)
$db_saved = save_form_data($form_data);
// 3. Отправка в CRM (опционально)
$crm_sent = send_to_crm($form_data);
if ($email_sent) {
wp_send_json_success(array(
'message' => 'Ваше сообщение успешно отправлено!',
'data' => $form_data // Можно не возвращать в продакшене
));
} else {
wp_send_json_error('Ошибка при отправке формы');
}
}
// Функция отправки email
function send_form_email($data) {
$to = get_option('admin_email');
$subject = 'Новое сообщение с сайта';
$message = "Имя: {$data['name']}\n";
$message .= "Email: {$data['email']}\n";
$message .= "Телефон: {$data['phone']}\n\n";
$message .= "Сообщение:\n{$data['message']}\n\n";
$message .= "IP: {$data['ip']}\n";
$message .= "Дата: {$data['timestamp']}";
$headers = array(
'From: ' . $data['name'] . ' <' . $data['email'] . '>',
'Content-Type: text/plain; charset=UTF-8'
);
return wp_mail($to, $subject, $message, $headers);
}
// Функция сохранения в базу данных
function save_form_data($data) {
global $wpdb;
return $wpdb->insert(
$wpdb->prefix . 'form_submissions',
array(
'name' => $data['name'],
'email' => $data['email'],
'phone' => $data['phone'],
'message' => $data['message'],
'ip_address' => $data['ip'],
'user_agent' => $data['user_agent'],
'created_at' => $data['timestamp']
),
array('%s', '%s', '%s', '%s', '%s', '%s', '%s')
);
}
4. Реализация через классический POST (без AJAX)
// В functions.php
add_action('template_redirect', 'handle_form_submission');
function handle_form_submission() {
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) {
if ($_POST['action'] === 'process_form') {
// Проверка nonce
if (!wp_verify_nonce($_POST['form_nonce'], 'form_nonce_action')) {
wp_die('Ошибка безопасности');
}
// Валидация данных (как в AJAX обработчике)
$name = sanitize_text_field($_POST['name'] ?? '');
$email = sanitize_email($_POST['email'] ?? '');
$phone = sanitize_text_field($_POST['phone'] ?? '');
$message = sanitize_textarea_field($_POST['message'] ?? '');
// Проверка обязательных полей
if (empty($name) || empty($email) || empty($message)) {
set_transient('form_error', 'Заполните все обязательные поля', 30);
wp_redirect(wp_get_referer());
exit;
}
// Обработка данных (как в AJAX обработчике)
$form_data = array(...);
// Отправка email и сохранение данных
$email_sent = send_form_email($form_data);
$db_saved = save_form_data($form_data);
if ($email_sent) {
set_transient('form_success', 'Ваше сообщение успешно отправлено!', 30);
} else {
set_transient('form_error', 'Ошибка при отправке формы', 30);
}
wp_redirect(wp_get_referer());
exit;
}
}
}
// Вывод сообщений на странице
function display_form_messages() {
if ($error = get_transient('form_error')) {
echo '<div class="form-message error">' . esc_html($error) . '</div>';
delete_transient('form_error');
}
if ($success = get_transient('form_success')) {
echo '<div class="form-message success">' . esc_html($success) . '</div>';
delete_transient('form_success');
}
}
5. Защита от спама
// Добавьте скрытое поле в форму
<input type="text" name="human_check" value="" style="display:none;">
// В обработчике добавьте проверку
if (!empty($_POST['human_check'])) {
wp_send_json_error('Спам-заполнение формы');
// или для POST:
set_transient('form_error', 'Ошибка отправки', 30);
wp_redirect(wp_get_referer());
exit;
}
// Добавьте проверку времени заполнения
add_action('wp_enqueue_scripts', 'add_form_timestamp');
function add_form_timestamp() {
wp_localize_script('jquery', 'form_vars', array(
'timestamp' => time()
));
}
// В форму добавьте
<input type="hidden" name="form_timestamp" id="form_timestamp" value="">
// В JS установите значение
jQuery('#form_timestamp').val(form_vars.timestamp);
// В обработчике проверьте
$submit_time = time() - (int)$_POST['form_timestamp'];
if ($submit_time < 5) { // Меньше 5 секунд - вероятно бот
wp_send_json_error('Слишком быстрое заполнение формы');
}
6. Создание таблицы для сохранения данных (если нужно)
register_activation_hook(__FILE__, 'create_form_submissions_table');
function create_form_submissions_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'form_submissions';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
email varchar(100) NOT NULL,
phone varchar(20),
message text NOT NULL,
ip_address varchar(45),
user_agent text,
created_at datetime NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
Ключевые особенности реализации:
- Двойная обработка: поддержка как AJAX, так и обычных POST-запросов
- Безопасность: проверка nonce, санитайзинг данных, защита от спама
- Гибкость: можно легко добавить новые обработчики и способы сохранения
- Обратная связь: понятные сообщения об ошибках и успешной отправке
- Отказоустойчивость: корректная работа при отключенном JavaScript
Это решение обеспечивает надежную передачу данных через формы без необходимости авторизации пользователя с возможностью расширения функционала.