В проектах на WordPress нередко возникает задача разделить результаты опросов по пользователям. Например, если вы хотите видеть, как проголосовал конкретный пользователь, или собрать аналитику по отдельным участникам. В этой статье мы подробно разберём, как реализовать такую функциональность – от выбора плагина до написания собственного кода.
Почему важно разделять результаты опросов по пользователям
Стандартные плагины для опросов обычно собирают агрегированные данные — сколько голосов за каждый вариант, без привязки к конкретным пользователям. Однако бывают случаи, когда нужно:
- Отслеживать участие каждого пользователя в опросах;
- Позволять пользователям видеть свои собственные результаты;
- Проводить более глубокий анализ по группам пользователей (например, по ролям);
- Ограничивать голосование одним голосом на пользователя и проверять, кто и как проголосовал.
Для реализации таких задач потребуется либо расширять стандартный функционал плагина, либо писать собственные решения.
Выбор плагина с поддержкой учёта пользователей
Для начала рассмотрим несколько плагинов, которые поддерживают хранение результатов с привязкой к пользователям:
- WP-Polls — классический плагин с возможностью отображать результаты по пользователям через дополнительные расширения;
- YOP Poll
- Quizle от WPShop — современный плагин с поддержкой учёта пользователей и расширенными возможностями анализа результатов.
Например, в Quizle есть встроенные отчёты, которые показывают результаты по каждому участнику, а также можно экспортировать данные для дальнейшего анализа.
Настройка Quizle для учёта пользователей
Чтобы включить разделение по пользователям в Quizle, необходимо в настройках плагина активировать опцию сохранения голосов с привязкой к ID пользователя WordPress. Это позволит вести учёт и выводить персональные результаты.
Реализация собственного решения для разделения результатов по пользователям
Если вы используете кастомный или легковесный плагин, или хотите полностью контролировать процесс, можно реализовать хранение и вывод результатов с помощью кода.
Создание пользовательской таблицы для хранения голосов
Для начала создадим таблицу в базе данных, чтобы хранить голоса пользователей по опросам:
function wppolls_create_votes_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_user_votes';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
poll_id BIGINT(20) UNSIGNED NOT NULL,
user_id BIGINT(20) UNSIGNED NOT NULL,
answer_id BIGINT(20) UNSIGNED NOT NULL,
vote_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY user_poll (poll_id, user_id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook(__FILE__, 'wppolls_create_votes_table');
В этой таблице мы фиксируем, кто (user_id) и за какой вариант (answer_id) проголосовал в каком опросе (poll_id). Уникальный индекс гарантирует, что пользователь не сможет голосовать несколько раз в одном опросе.
Сохранение голосов пользователей
При отправке голоса нужно записать его в эту таблицу. Пример функции для сохранения:
function wppolls_save_user_vote($poll_id, $answer_id) {
if (!is_user_logged_in()) return false; // только для авторизованных
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_user_votes';
$user_id = get_current_user_id();
// Проверяем, голосовал ли уже пользователь
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT id FROM $table_name WHERE poll_id = %d AND user_id = %d",
$poll_id, $user_id
));
if ($exists) {
// Обновляем голос
$wpdb->update(
$table_name,
array('answer_id' => $answer_id, 'vote_date' => current_time('mysql')),
array('id' => $exists),
array('%d', '%s'),
array('%d')
);
} else {
// Вставляем новый голос
$wpdb->insert(
$table_name,
array(
'poll_id' => $poll_id,
'user_id' => $user_id,
'answer_id' => $answer_id,
'vote_date' => current_time('mysql'),
),
array('%d', '%d', '%d', '%s')
);
}
return true;
}
Эту функцию нужно вызывать при обработке формы голосования.
Вывод результатов по пользователю
Чтобы вывести, за что именно проголосовал текущий пользователь, используйте следующий код:
function wppolls_get_user_vote($poll_id) {
if (!is_user_logged_in()) return false;
global $wpdb;
$table_name = $wpdb->prefix . 'wppolls_user_votes';
$user_id = get_current_user_id();
$answer_id = $wpdb->get_var($wpdb->prepare(
"SELECT answer_id FROM $table_name WHERE poll_id = %d AND user_id = %d",
$poll_id, $user_id
));
return $answer_id ? intval($answer_id) : false;
}
Далее вы можете использовать этот ID для отображения выбранного варианта, подсветки в списке ответов и т. д.
Расширение функционала: аналитика и отчёты по пользователям
Собрав данные по голосам пользователей, можно строить различные отчёты:
- Отчёты по ролям пользователей (например, как голосуют подписчики и администраторы);
- Временные отчёты — анализировать, как менялось мнение пользователей со временем;
- Экспорт данных в CSV для внешнего анализа;
- Интеграция с WPRemark для визуализации результатов.
Пример фильтрации голосов по ролям
function wppolls_get_votes_by_role($poll_id, $role) {
global $wpdb;
$votes_table = $wpdb->prefix . 'wppolls_user_votes';
$users_table = $wpdb->prefix . 'users';
$usermeta_table = $wpdb->prefix . 'usermeta';
$query = $wpdb->prepare(
"SELECT v.answer_id, COUNT(*) as votes_count
FROM $votes_table v
INNER JOIN $users_table u ON u.ID = v.user_id
INNER JOIN $usermeta_table um ON um.user_id = u.ID
WHERE v.poll_id = %d AND um.meta_key = %s AND um.meta_value LIKE %s
GROUP BY v.answer_id",
$poll_id, 'wp_capabilities', '%"' . $wpdb->esc_like($role) . '"%'
);
return $wpdb->get_results($query);
}
Этот код позволит получить количество голосов по вариантам от пользователей с определённой ролью.
Заключение
Разделение результатов опросов по пользователям — задача, которая требует либо использования специализированных плагинов, либо кастомной разработки. Рассмотренный подход с созданием собственной таблицы и функциями для сохранения и вывода голосов даёт полный контроль и возможность расширять функционал по своим нуждам.
Если вам нужны готовые решения с поддержкой учёта пользователей и удобными отчётами, рекомендую обратить внимание на плагин Quizle, который отлично подойдёт для большинства задач.