Обратный опрос — это разновидность опроса, где пользователь голосует за все варианты, кроме тех, которые не поддерживает или не выбирает. Такой формат полезен для получения более точной обратной связи, особенно когда важно понять, что именно не нравится или не подходит аудитории.
Что такое обратный опрос и где он применяется
В классическом опросе пользователь выбирает положительные ответы, а в обратном — наоборот. Например, в опросе о предпочтениях сервисов можно попросить отметить те, которые не нравятся. Это часто используется в маркетинговых исследованиях, UX-анализе и при сборе критики.
В WordPress стандартные плагины для опросов не всегда поддерживают такой формат из коробки, поэтому создадим кастомное решение с использованием AJAX для улучшения UX — результаты будут обновляться без перезагрузки страницы.
Выбор плагина и подготовка среды
Для реализации обратного опроса можно использовать базовый плагин для создания опросов, например, WP-Polls или YOP Poll, однако для полной кастомизации предпочтительнее создать собственный плагин или добавить код в functions.php темы.
Основные требования:
- Создать кастомный тип опроса с обратным смыслом голосования;
- Обработать голоса через AJAX для динамического обновления;
- Сохранить результаты в отдельной таблице или метах;
- Вывести результаты в удобном виде.
Создание таблицы в базе данных для хранения голосов
Для надежного хранения данных создадим таблицу с помощью активационного хука плагина или в functions.php. Пример функции создания таблицы:
function wppolls_create_reverse_poll_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_reverse_votes';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
poll_id BIGINT(20) UNSIGNED NOT NULL,
user_ip VARCHAR(100) NOT NULL,
vote_option_id BIGINT(20) UNSIGNED NOT NULL,
vote_time 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__, 'wppolls_create_reverse_poll_table' );Эта таблица будет хранить информацию о голосах: к какому опросу, за какой вариант, IP пользователя и время голосования.
Формирование формы обратного опроса
Создадим форму, где варианты ответов представлены чекбоксами, и пользователь удаляет галочки с тех, что ему не подходят. Пример формы:
<form id="wppolls-reverse-form" data-poll-id="123">
<label><input type="checkbox" name="vote_option[]" value="1" checked> Вариант 1</label><br>
<label><input type="checkbox" name="vote_option[]" value="2" checked> Вариант 2</label><br>
<label><input type="checkbox" name="vote_option[]" value="3" checked> Вариант 3</label><br>
<button type="submit">Отправить голос</button>
</form>
<div id="wppolls-reverse-results"></div>По умолчанию все варианты отмечены, а пользователь снимает галочки с тех, что не выбирает. В обработчике мы будем считать, что пользователь проголосовал против снятых вариантов.
AJAX обработка голосов
Для обработки голосов используем AJAX. Добавим JavaScript код, который будет перехватывать отправку формы, собирать данные и отправлять на сервер:
jQuery(document).ready(function($) {
$('#wppolls-reverse-form').on('submit', function(e) {
e.preventDefault();
var pollId = $(this).data('poll-id');
var allOptions = [];
$(this).find('input[type=checkbox]').each(function() {
allOptions.push($(this).val());
});
var checkedOptions = $(this).find('input[type=checkbox]:checked').map(function() {
return $(this).val();
}).get();
// Определяем снятые варианты
var removedOptions = allOptions.filter(function(opt) {
return checkedOptions.indexOf(opt) === -1;
});
$.ajax({
url: ajaxurl,
method: 'POST',
data: {
action: 'wppolls_reverse_vote',
poll_id: pollId,
removed_options: removedOptions
},
success: function(response) {
$('#wppolls-reverse-results').html(response.data);
},
error: function() {
alert('Ошибка при отправке голоса.');
}
});
});
});Обработка AJAX на стороне сервера
Регистрируем AJAX действие и пишем функцию для сохранения голосов:
add_action('wp_ajax_wppolls_reverse_vote', 'wppolls_handle_reverse_vote');
add_action('wp_ajax_nopriv_wppolls_reverse_vote', 'wppolls_handle_reverse_vote');
function wppolls_handle_reverse_vote() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_reverse_votes';
$poll_id = intval($_POST['poll_id']);
$removed_options = isset($_POST['removed_options']) ? (array) $_POST['removed_options'] : [];
$user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
if (!$poll_id || empty($removed_options)) {
wp_send_json_error('Неверные данные голосования');
}
// Проверка на повторный голос по IP и опросу
$existing_votes = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE poll_id = %d AND user_ip = %s",
$poll_id, $user_ip
));
if ($existing_votes > 0) {
wp_send_json_error('Вы уже голосовали в этом опросе');
}
foreach ($removed_options as $option_id) {
$wpdb->insert($table_name, [
'poll_id' => $poll_id,
'user_ip' => $user_ip,
'vote_option_id' => intval($option_id),
'vote_time' => current_time('mysql')
]);
}
// Формируем результаты
$results = wppolls_get_reverse_poll_results($poll_id);
wp_send_json_success($results);
}
function wppolls_get_reverse_poll_results($poll_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_reverse_votes';
// Получаем количество голосов против каждого варианта
$query = $wpdb->prepare(
"SELECT vote_option_id, COUNT(*) as votes FROM $table_name WHERE poll_id = %d GROUP BY vote_option_id",
$poll_id
);
$results = $wpdb->get_results($query, OBJECT_K);
// Пример формирования HTML для вывода
$output = '<ul>';
foreach ($results as $option_id => $data) {
$output .= "<li>Вариант №$option_id: $data->votes голосов против</li>";
}
$output .= '</ul>';
return $output;
}Оптимизация и защита от накруток
Чтобы избежать накруток голосов, помимо проверки IP можно добавить:
- Cookie и сессионные проверки;
- Реализацию авторизации и голосование только для зарегистрированных пользователей;
- Ограничение по времени повторного голосования;
- Использование плагинов защиты типа Clearfy Pro для усиления безопасности.
Также полезно регулярно очищать базу голосов от устаревших данных.
Интеграция с WPRemark для анализа ответов
Если вы используете плагин WPRemark, то можно автоматизировать сбор и анализ результатов обратных опросов, добавив экспорт данных из кастомной таблицы в систему аналитики.
Это позволит получить развернутую статистику по негативным отзывам и улучшить продукт или сервис на основе реальных данных.
Итог
Обратный опрос в WordPress — мощный инструмент для глубокого анализа пользовательских предпочтений и критики. Реализовать его с помощью AJAX и кастомной таблицы вполне реально своими силами. Такой подход улучшит UX, позволит гибко настраивать логику голосования и даст точные данные для дальнейшего анализа.