Диагностика задачи: зачем собирать данные из нескольких форм в одну таблицу
Часто в проектах на 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 | Ручной экспорт данных из форм и объединение | Просто для мелких сайтов | Неавтоматизировано, требует ручной работы |