Как разделить результаты опросов по пользователям в WordPress

В проектах на 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, который отлично подойдёт для большинства задач.

Как автоматизировать удалённую модерацию опросов в WordPress
06.03.2026
Автоматическое удаление старых голосов в опросах WordPress: пошаговое руководство
09.06.2026
Как создать виджет опроса в WordPress с помощью кода
20.11.2025
Создание опроса с оценкой и комментариями в WordPress
06.04.2026
Автопубликация опросов в WordPress: настройка и автоматизация
30.11.2025