В этой статье подробно рассмотрим, как можно превратить обычную форму контакта на сайте WordPress в полноценный опрос с записью результатов и последующим анализом. Такой подход особенно полезен, когда вы хотите собрать обратную связь, не устанавливая отдельный плагин для опросов. Мы расскажем, как интегрировать популярные формы (Contact Form 7, WPForms) с кастомным опросом, а также как сохранить и обработать данные с помощью пользовательских функций.
Почему стоит создавать опросы на базе форм контакта
Часто на WordPress-сайтах уже есть настроенные формы для связи с пользователями, например, через Contact Form 7 или WPForms. Использование этих форм для создания опросов позволяет:
- Избежать установки лишних плагинов и замедления сайта;
- Гибко настраивать поля и логику опроса под конкретные задачи;
- Использовать уже знакомый интерфейс форм для пользователей;
- Легко интегрировать с другими процессами — отправкой писем, сохранением в базу, выводом результатов.
Кроме того, это решение экономит время и ресурсы, особенно если нужен простой опрос без сложной логики.
Интеграция Contact Form 7 для создания опроса
Contact Form 7 — самый популярный плагин для форм, и его можно расширить для реализации опроса. Для этого необходимо добавить кастомный обработчик отправки формы, который будет сохранять данные опроса в отдельную таблицу или пользовательский тип записи.
Пример создания обработчика для Contact Form 7
Добавим следующий код в functions.php вашей темы или в собственный плагин:
add_action('wpcf7_mail_sent', 'wppolls_cf7_save_poll_data');
function wppolls_cf7_save_poll_data($contact_form) {
$submission = WPCF7_Submission::get_instance();
if (!$submission) return;
$data = $submission->get_posted_data();
// Предположим, что в форме есть поле с именем 'poll_question' и варианты 'poll_answer'
if (isset($data['poll_question']) && isset($data['poll_answer'])) {
global $wpdb;
$table = $wpdb->prefix . 'wppolls_results';
$wpdb->insert($table, [
'question' => sanitize_text_field($data['poll_question']),
'answer' => sanitize_text_field($data['poll_answer']),
'submitted_at' => current_time('mysql')
]);
}
}
В этом примере мы сохраняем вопрос и ответ в отдельную таблицу wppolls_results. Таблицу необходимо создать заранее с помощью SQL-запроса при активации плагина или вручную:
CREATE TABLE wp_wppolls_results (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
question VARCHAR(255) NOT NULL,
answer VARCHAR(255) NOT NULL,
submitted_at DATETIME NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Создание опроса на базе WPForms с сохранением результатов в базу
WPForms — мощный конструктор форм с удобным интерфейсом. Для опросов можно использовать бесплатную или Pro-версию, а также расширять функционал через хуки.
Пример сохранения ответов из WPForms
Для обработки отправки формы используем хук wpforms_process_complete:
add_action('wpforms_process_complete', 'wppolls_wpforms_save_poll', 10, 4);
function wppolls_wpforms_save_poll($fields, $entry, $form_data, $entry_id) {
global $wpdb;
$table = $wpdb->prefix . 'wppolls_results';
// Предположим, что поле с вопросом имеет ID 1, а с ответом ID 2
$question = isset($fields[1]) ? sanitize_text_field($fields[1]['value']) : '';
$answer = isset($fields[2]) ? sanitize_text_field($fields[2]['value']) : '';
if ($question && $answer) {
$wpdb->insert($table, [
'question' => $question,
'answer' => $answer,
'submitted_at' => current_time('mysql')
]);
}
}
Таким образом вы сможете автоматически сохранять любые данные из формы в базу, создавая кастомные опросы.
Вывод и анализ результатов опроса на сайте
После сохранения данных важно предоставить возможность просмотра результатов. Для этого создадим шорткод, который выводит статистику по опросам.
Шорткод для вывода результатов опроса
function wppolls_show_results_shortcode($atts) {
global $wpdb;
$table = $wpdb->prefix . 'wppolls_results';
// Получаем все вопросы
$questions = $wpdb->get_col("SELECT DISTINCT question FROM $table");
$output = '<div class="wppolls-results">';
foreach ($questions as $question) {
$output .= '<h3>' . esc_html($question) . '</h3>';
// Получаем количество ответов по вариантам
$answers = $wpdb->get_results($wpdb->prepare(
"SELECT answer, COUNT(*) as count FROM $table WHERE question = %s GROUP BY answer ORDER BY count DESC",
$question
));
$output .= '<ul>';
foreach ($answers as $answer) {
$output .= '<li>' . esc_html($answer->answer) . ': ' . intval($answer->count) . '</li>';
}
$output .= '</ul>';
}
$output .= '</div>';
return $output;
}
add_shortcode('wppolls_results', 'wppolls_show_results_shortcode');
Вставьте шорткод [wppolls_results] в нужное место на сайте, чтобы увидеть статистику по опросам.
Расширение функционала: мультивыбор и дополнительные поля
Если нужно, чтобы опрос поддерживал ответы с множественным выбором, можно немного изменить способ сохранения и вывода данных.
Сохранение нескольких ответов
Для Contact Form 7 в форме используйте чекбоксы с именем поля, например, poll_answer[]. В обработчике нужно будет сохранить все выбранные варианты, например, в виде JSON или отдельными записями:
if (isset($data['poll_answer']) && is_array($data['poll_answer'])) {
foreach ($data['poll_answer'] as $answer) {
$wpdb->insert($table, [
'question' => sanitize_text_field($data['poll_question']),
'answer' => sanitize_text_field($answer),
'submitted_at' => current_time('mysql')
]);
}
}
Добавление пользовательских полей
Для более сложных опросов можно добавить поля, например, "Возраст", "Город" и сохранить их в той же таблице, расширив структуру. Не забудьте добавить поля в SQL и в обработчик сохранения.
Выводим результаты с визуализацией на графиках
Чтобы сделать отчеты нагляднее, можно использовать JavaScript-библиотеки, например Chart.js, и выводить диаграммы.
Пример простого графика с Chart.js
Добавьте в шаблон или страницу следующий HTML:
<canvas id="wppollsChart" width="400" height="200"></canvas>
И скрипт для загрузки данных и отрисовки графика:
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const ctx = document.getElementById('wppollsChart').getContext('2d');
// Пример данных, замените на динамические через AJAX или PHP
const data = {
labels: ['Вариант A', 'Вариант B', 'Вариант C'],
datasets: [{
label: 'Количество ответов',
data: [12, 19, 7],
backgroundColor: ['rgba(75, 192, 192, 0.2)', 'rgba(255, 99, 132, 0.2)', 'rgba(255, 206, 86, 0.2)'],
borderColor: ['rgba(75, 192, 192, 1)', 'rgba(255, 99, 132, 1)', 'rgba(255, 206, 86, 1)'],
borderWidth: 1
}]
};
new Chart(ctx, {
type: 'bar',
data: data,
options: {
scales: {
y: { beginAtZero: true }
}
}
});
});
</script>
Для динамического наполнения данных используйте AJAX-запрос к PHP, который будет возвращать статистику из базы.
Заключение
Создание опроса на базе форм контакта — гибкий и эффективный способ сбора данных на сайте WordPress. Используя примеры кода, вы можете адаптировать функционал под любые задачи, от простого сбора мнений до комплексного анализа с визуализацией. Такой подход позволит не зависеть от сторонних плагинов и получить полный контроль над процессом.
Если вы хотите расширить возможности сайта, обратите внимание на продукты из WPShop, которые помогут автоматизировать сбор и анализ данных, а также улучшить взаимодействие с посетителями.