WPForms — это мощный плагин для создания форм в WordPress, который отлично справляется с задачами сбора данных от пользователей. Однако иногда возникает необходимость массово сохранять данные форм не просто в стандартные записи плагина, а в собственные таблицы базы данных для дальнейшей аналитики, интеграций или кастомной обработки. В этой статье мы рассмотрим, как реализовать такое решение на примере WPForms.
Почему стандартное сохранение ответов WPForms может быть недостаточным
По умолчанию WPForms хранит данные форм в своих таблицах, что удобно для базового управления, но не всегда подходит для сложных задач:
- Отсутствие удобного доступа к данным через стандартные WP-запросы и API.
- Ограничения по быстродействию при большом объеме собранных данных.
- Сложности с интеграцией данных с внешними системами или кастомной логикой.
Для решения этих проблем можно реализовать собственный механизм массового сохранения и обработки ответов.
Создание собственной таблицы для хранения ответов WPForms
Первым шагом создадим отдельную таблицу в базе данных WordPress для хранения ответов форм. Это позволит структурировать данные по своим правилам и работать с ними максимально эффективно.
Добавим функцию для создания таблицы при активации плагина или темы:
function wpformsru_create_custom_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpformsru_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_data LONGTEXT NOT NULL,
created_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__, 'wpformsru_create_custom_table' );Эта таблица хранит идентификатор формы, сериализованные данные ответа и дату создания записи.
Перехват отправки формы WPForms для сохранения данных
WPForms предоставляет удобный хук wpforms_process_complete, который срабатывает после успешной отправки формы. Используем его для сохранения данных в нашу таблицу.
function wpformsru_save_entry_to_custom_table( $fields, $entry, $form_data, $entry_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpformsru_entries';
// Преобразуем поля в JSON для хранения
$entry_json = wp_json_encode( $fields );
$wpdb->insert(
$table_name,
[
'form_id' => intval( $form_data['id'] ),
'entry_data' => $entry_json,
'created_at' => current_time( 'mysql' )
],
[
'%d',
'%s',
'%s'
]
);
}
add_action( 'wpforms_process_complete', 'wpformsru_save_entry_to_custom_table', 10, 4 );Таким образом, каждый раз после успешной отправки формы данные будут сохраняться в нашей таблице.
Вывод сохраненных ответов в административной панели WordPress
Чтобы удобно работать с собранными данными, добавим простой интерфейс в админку WordPress для просмотра сохраненных записей.
Пример добавления страницы меню и вывода данных:
function wpformsru_add_admin_menu() {
add_menu_page(
'WPFormsRU Entries',
'WPFormsRU Entries',
'manage_options',
'wpformsru-entries',
'wpformsru_render_entries_page'
);
}
add_action( 'admin_menu', 'wpformsru_add_admin_menu' );
function wpformsru_render_entries_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpformsru_entries';
$results = $wpdb->get_results( "SELECT * FROM $table_name ORDER BY created_at DESC LIMIT 50" );
echo '<div class="wrap"><h1>Сохранённые ответы WPForms</h1><table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>ID</th><th>Form ID</th><th>Данные</th><th>Дата</th></tr></thead><tbody>';
foreach ( $results as $row ) {
$data = json_decode( $row->entry_data, true );
$formatted_data = '<ul>';
foreach ( $data as $field ) {
$formatted_data .= '<li>' . esc_html( $field['name'] ) . ': ' . esc_html( $field['value'] ) . '</li>';
}
$formatted_data .= '</ul>';
echo '<tr>' .
'<td>' . esc_html( $row->id ) . '</td>' .
'<td>' . esc_html( $row->form_id ) . '</td>' .
'<td>' . $formatted_data . '</td>' .
'<td>' . esc_html( $row->created_at ) . '</td>' .
'</tr>';
}
echo '</tbody></table></div>';
}Это базовый пример, который можно расширять фильтрами, пагинацией и сортировкой.
Оптимизация и масштабирование решения для больших объемов данных
При росте количества ответов рекомендуется проработать следующие моменты:
- Добавить индексы на полях, часто используемых для фильтрации (например, form_id и created_at).
- Реализовать пагинацию и AJAX-загрузку в интерфейсе админки для снижения нагрузки.
- Использовать WP Cron или внешние задачи для пакетной обработки и архивации старых данных.
С помощью этих подходов вы сможете создать надежное и масштабируемое решение для хранения и работы с ответами WPForms.
Дополнительные рекомендации и плагины для расширения функционала
Для еще более удобной работы с формами и их данными рекомендуем обратить внимание на плагины:
- Expert Review — для создания расширенных обзоров и аналитики.
- WPRemark — для управления отзывами и комментариями, которые можно связать с формами.
Их можно интегрировать с вашим кастомным решением для повышения эффективности.
Итог
Создание собственного механизма массового сохранения ответов WPForms в базе данных WordPress требует понимания работы с хуками плагина, базой данных и админкой WP. Предложенное решение позволит вам гибко управлять данными, масштабировать хранение и интегрировать формы с другими системами, не ограничиваясь стандартным функционалом WPForms.