WPForms: как собирать данные из нескольких форм в одну таблицу WordPress

Диагностика задачи: зачем собирать данные из нескольких форм в одну таблицу

Часто в проектах на WordPress возникает ситуация, когда данные, собранные через разные формы WPForms, нужно агрегировать в единой таблице базы данных. Например, если у вас несколько отдельных форм для разных разделов сайта, но все они собирают похожие данные (контакты, заявки, отзывы), удобно иметь централизованное хранилище для удобного анализа и обработки.

Стандартный WPForms сохраняет данные каждой формы в отдельной таблице wp_wpforms_entries с привязкой к ID формы, но объединённый доступ отсутствует. Нужно реализовать логику, которая будет собирать записи из разных форм в одну кастомную таблицу.

Как создать кастомную таблицу для объединённых данных

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

function wpforms_create_aggregated_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpforms_aggregated_entries';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        form_id BIGINT(20) UNSIGNED NOT NULL,
        entry_id BIGINT(20) UNSIGNED NOT NULL,
        user_ip VARCHAR(100) DEFAULT NULL,
        user_agent TEXT DEFAULT NULL,
        submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        field_data LONGTEXT,
        PRIMARY KEY  (id),
        KEY form_id (form_id),
        KEY entry_id (entry_id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
add_action('after_setup_theme', 'wpforms_create_aggregated_table');

Этот код создаст таблицу wp_wpforms_aggregated_entries с основными полями: ID формы, ID записи, IP пользователя, user-agent, дата отправки и сериализованные данные полей формы.

Пошаговое решение: как собирать и сохранять данные из разных форм в таблицу

WPForms предоставляет хук wpforms_process_complete, который срабатывает после успешной отправки формы. Используем его для сбора данных и вставки в нашу таблицу.

function wpforms_save_aggregated_data($fields, $entry, $form_data, $entry_id) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpforms_aggregated_entries';

    // Сериализуем поля формы для хранения
    $field_data = maybe_serialize($fields);

    // Получаем IP и user-agent
    $user_ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';

    $wpdb->insert(
        $table_name,
        [
            'form_id' => intval($form_data['id']),
            'entry_id' => intval($entry_id),
            'user_ip' => $user_ip,
            'user_agent' => $user_agent,
            'field_data' => $field_data,
            'submitted_at' => current_time('mysql')
        ],
        ['%d', '%d', '%s', '%s', '%s', '%s']
    );
}
add_action('wpforms_process_complete', 'wpforms_save_aggregated_data', 10, 4);

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

Как фильтровать и получать объединённые данные

Для выборки данных из нескольких форм используйте стандартный запрос к базе:

$form_ids = [123, 456]; // ID форм для выборки
$placeholders = implode(',', array_fill(0, count($form_ids), '%d'));

$sql = $wpdb->prepare(
    "SELECT * FROM {$wpdb->prefix}wpforms_aggregated_entries WHERE form_id IN ($placeholders) ORDER BY submitted_at DESC",
    ...$form_ids
);
$results = $wpdb->get_results($sql);

foreach ($results as $row) {
    $fields = maybe_unserialize($row->field_data);
    // Обработка данных
}

Проверка результата после внедрения

  • Отправьте тестовые формы с разных ID.
  • Зайдите в базу данных через phpMyAdmin или аналог и проверьте содержимое таблицы wp_wpforms_aggregated_entries.
  • Убедитесь, что новые записи появились с корректными form_id, entry_id и данными полей.
  • Напишите простой вывод данных на страницу для визуальной проверки.

Частые ошибки и как их исправить

  • Таблица не создается: проверьте подключение к базе и вызов функции dbDelta. Убедитесь, что хук after_setup_theme срабатывает.
  • Данные не записываются: проверьте, что хук wpforms_process_complete правильно подключен и функция получает все аргументы.
  • Поля сериализуются некорректно: используйте maybe_serialize и maybe_unserialize для сохранения и чтения.
  • Отсутствие фильтрации по form_id: всегда используйте параметр form_id для выборки, чтобы избежать смешивания данных.

Практические советы по безопасности и производительности

  • Используйте подготовленные запросы $wpdb->prepare для защиты от SQL-инъекций.
  • Регулярно очищайте таблицу от устаревших данных, если они не нужны, чтобы не перегружать базу.
  • Используйте индексы по ключам form_id и submitted_at для ускорения выборок.
  • Ограничьте количество собираемых данных до необходимых полей, чтобы не хранить избыточную информацию.

Сравнение вариантов реализации сбора данных из нескольких форм

МетодОписаниеПлюсыМинусы
Использование кастомной таблицыСоздать свою таблицу и сохранять туда все данныеГибкость, единый источник данных, быстрый доступТребует навыков SQL и поддержки
Использование WPForms APIПолучать данные из стандартных таблиц WPForms и объединять программноНе нужно создавать таблицыМедленнее при больших объемах, сложнее фильтровать
Экспорт и объединение CSVРучной экспорт данных из форм и объединениеПросто для мелких сайтовНеавтоматизировано, требует ручной работы
WPForms: создание и обработка форм регистрации пользователей с авторизацией в WordPress
10.05.2026
Как создать автоматические уведомления в WPForms через Webhook
23.02.2026
WordPress автоматическое сохранение формы WPForms: как сделать и настроить
16.11.2025
WPForms и WooCommerce: автоматическая передача данных обязательных полей из формы в заказ
07.06.2026
Как создать подключаемые поля в WPForms с применением хуков
27.01.2026