WordPress DemoSite

Тестовый сайт для экспериментов и демонстраций возможностей

Передача данных через форму без авторизации

Вот комплексное решение для передачи данных через формы без необходимости авторизации пользователя, с использованием как 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);
}

Ключевые особенности реализации:

  1. Двойная обработка: поддержка как AJAX, так и обычных POST-запросов
  2. Безопасность: проверка nonce, санитайзинг данных, защита от спама
  3. Гибкость: можно легко добавить новые обработчики и способы сохранения
  4. Обратная связь: понятные сообщения об ошибках и успешной отправке
  5. Отказоустойчивость: корректная работа при отключенном JavaScript

Это решение обеспечивает надежную передачу данных через формы без необходимости авторизации пользователя с возможностью расширения функционала.

Полный стэк: .NET | Agile | AJAX | AMQP | Android | api | Bash | Bootstrap | C++ | cms | Composer | css | Data | Elasticsearch | email | ERP | ESP32 | Fenom | Git | GraphQL | Gulp | JavaScript | JetStream | Joomla | js | Kotlin | Laravel | Lean | LEMP | Linux | LMS | Markdown | MODX | Moodle | MySQL | NATS | Nginx | Node.js | OpenCart | Parsedown | PHP | Python | RabbitMQ | Scrum | SCSS | SEO | Simpla | SLA | SOAP | Sphinx | SQL | startup | Swift | Symfony | Tailwind | Translation | Twig | Ubuntu | Unit | W3C | Waterfall | web3 | Webasyst | Webpack | WebSocket | Wishlist | WooCommerce | WordPress | XML | Автоматизация | Безопасность | Бизнес | блокчейн | Вёрстка | движок | ИИ | интернет-магазин | ЛК | Руководство | ТЗ | фреймворк | шаблонизатор | Яндекс.Трекер