В работе с опросами на WordPress часто возникает задача не просто показать результаты, а оформить их в виде удобной выставки с возможностью фильтровать данные и сортировать по различным параметрам. Это особенно полезно, если у вас много опросов или большое количество ответов, и вы хотите предоставить посетителям удобный интерфейс для анализа.
Почему важна выставка результатов опросов
Стандартные инструменты для отображения результатов опросов обычно показывают суммарные данные либо графики без возможности гибкой фильтрации. Выставка же помогает:
- Дать пользователям возможность выбирать, какие опросы или вопросы они хотят просмотреть.
- Сортировать результаты по дате, популярности, категориям.
- Визуализировать данные в удобном формате — таблицы, диаграммы, карточки.
- Интегрировать результаты в общий контент сайта, например, в блог или каталог.
Такое решение повышает вовлеченность аудитории и помогает собирать больше обратной связи.
Обзор плагинов для создания выставок результатов опросов
Перед тем как писать свой код, стоит рассмотреть готовые решения. Среди плагинов, которые могут помочь:
- Quizle — мощный плагин с возможностью создавать опросы и показывать результаты в виде красивых таблиц и диаграмм. Поддерживает фильтрацию по категориям и датам.
- WPRemark — позволяет анализировать отзывы и оценки, но может применяться и к опросам, если настроить кастомные поля.
- WP Post Filter — хороший инструмент для фильтрации постов, который можно применить для кастомных типов записей с результатами опросов.
Если же нужно полностью кастомное решение, лучше написать свой код с использованием WP_Query и AJAX.
Создаем кастомный тип записи для результатов опросов
Первый шаг — зарегистрировать отдельный тип записи для хранения результатов. Это поможет гибко управлять данными и выводить их как обычные записи.
function wppolls_register_poll_results_cpt() {
$args = array(
'label' => 'Результаты опросов',
'public' => true,
'supports' => array('title', 'custom-fields'),
'has_archive' => true,
'show_in_rest' => true,
);
register_post_type('wppoll_result', $args);
}
add_action('init', 'wppolls_register_poll_results_cpt');
После регистрации CPT можно сохранять туда результаты опросов, например, через хуки или вручную.
Добавление мета-полей для фильтрации
Для фильтрации и сортировки добавим мета-поля, например, дата опроса, категория, количество голосов и др.
function wppolls_add_meta_boxes() {
add_meta_box('wppolls_poll_data', 'Данные опроса', 'wppolls_poll_data_callback', 'wppoll_result', 'normal', 'high');
}
add_action('add_meta_boxes', 'wppolls_add_meta_boxes');
function wppolls_poll_data_callback($post) {
$votes = get_post_meta($post->ID, '_wppolls_votes', true);
$date = get_post_meta($post->ID, '_wppolls_date', true);
echo '<label>Голоса:</label> <input type="number" name="wppolls_votes" value="' . esc_attr($votes) . '" /><br/>';
echo '<label>Дата опроса:</label> <input type="date" name="wppolls_date" value="' . esc_attr($date) . '" />';
}
function wppolls_save_meta_box_data($post_id) {
if (array_key_exists('wppolls_votes', $_POST)) {
update_post_meta($post_id, '_wppolls_votes', intval($_POST['wppolls_votes']));
}
if (array_key_exists('wppolls_date', $_POST)) {
update_post_meta($post_id, '_wppolls_date', sanitize_text_field($_POST['wppolls_date']));
}
}
add_action('save_post', 'wppolls_save_meta_box_data');
Вывод выставки с фильтрацией и сортировкой на фронте
Теперь создадим страницу или шорткод, который выведет результаты с возможностью фильтрации. Для этого используем WP_Query с параметрами из GET-запроса.
function wppolls_render_poll_results() {
$args = array(
'post_type' => 'wppoll_result',
'posts_per_page' => 10,
'meta_query' => array(),
'orderby' => 'meta_value_num',
'meta_key' => '_wppolls_votes',
'order' => 'DESC',
);
if (!empty($_GET['date'])) {
$args['meta_query'][] = array(
'key' => '_wppolls_date',
'value' => $_GET['date'],
'compare' => '=',
);
}
if (!empty($_GET['min_votes'])) {
$args['meta_query'][] = array(
'key' => '_wppolls_votes',
'value' => intval($_GET['min_votes']),
'compare' => '>=',
'type' => 'NUMERIC',
);
}
$query = new WP_Query($args);
ob_start();
echo '<form method="get">';
echo '<label>Дата опроса: <input type="date" name="date" value="' . esc_attr($_GET['date'] ?? '') . '" /></label> ';
echo '<label>Мин. голосов: <input type="number" name="min_votes" value="' . esc_attr($_GET['min_votes'] ?? '') . '" /></label> ';
echo '<input type="submit" value="Фильтровать" />';
echo '</form>';
if ($query->have_posts()) {
echo '<table border="1" cellpadding="5" cellspacing="0">';
echo '<tr><th>Название опроса</th><th>Дата</th><th>Голоса</th></tr>';
while ($query->have_posts()) {
$query->the_post();
$date = get_post_meta(get_the_ID(), '_wppolls_date', true);
$votes = get_post_meta(get_the_ID(), '_wppolls_votes', true);
echo '<tr><td>' . get_the_title() . '</td><td>' . esc_html($date) . '</td><td>' . intval($votes) . '</td></tr>';
}
echo '</table>';
} else {
echo '<p>Результаты не найдены</p>';
}
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode('wppolls_results_exhibit', 'wppolls_render_poll_results');
Этот шорткод можно вставить на любую страницу, и пользователь увидит форму фильтрации и таблицу с результатами.
Добавляем AJAX для удобства
Чтобы не перезагружать страницу при фильтрации, подключим AJAX-запросы. Вот упрощённый пример, как это сделать.
JavaScript для AJAX
jQuery(document).ready(function($) {
$('#wppolls-filter-form').on('submit', function(e) {
e.preventDefault();
var data = $(this).serialize();
$.ajax({
url: wppolls_ajax_object.ajax_url,
type: 'POST',
data: {
action: 'wppolls_filter_results',
filter_data: data
},
success: function(response) {
$('#wppolls-results-container').html(response);
}
});
});
});
PHP обработчик AJAX
function wppolls_ajax_filter_results() {
parse_str($_POST['filter_data'], $filters);
$args = array(
'post_type' => 'wppoll_result',
'posts_per_page' => 10,
'meta_query' => array(),
'orderby' => 'meta_value_num',
'meta_key' => '_wppolls_votes',
'order' => 'DESC',
);
if (!empty($filters['date'])) {
$args['meta_query'][] = array(
'key' => '_wppolls_date',
'value' => $filters['date'],
'compare' => '=',
);
}
if (!empty($filters['min_votes'])) {
$args['meta_query'][] = array(
'key' => '_wppolls_votes',
'value' => intval($filters['min_votes']),
'compare' => '>=',
'type' => 'NUMERIC',
);
}
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<table border="1" cellpadding="5" cellspacing="0">';
echo '<tr><th>Название опроса</th><th>Дата</th><th>Голоса</th></tr>';
while ($query->have_posts()) {
$query->the_post();
$date = get_post_meta(get_the_ID(), '_wppolls_date', true);
$votes = get_post_meta(get_the_ID(), '_wppolls_votes', true);
echo '<tr><td>' . get_the_title() . '</td><td>' . esc_html($date) . '</td><td>' . intval($votes) . '</td></tr>';
}
echo '</table>';
} else {
echo '<p>Результаты не найдены</p>';
}
wp_reset_postdata();
wp_die();
}
add_action('wp_ajax_wppolls_filter_results', 'wppolls_ajax_filter_results');
add_action('wp_ajax_nopriv_wppolls_filter_results', 'wppolls_ajax_filter_results');
Рекомендации по улучшению и оптимизации
1. Для хранения больших объемов данных используйте кастомные таблицы или оптимизируйте мета-запросы.
2. Добавьте пагинацию и кэширование для ускорения загрузки.
3. Используйте готовые библиотеки для визуализации — Chart.js, Google Charts или интеграцию с WPRemark для анализа.
4. Для интеграции с плагинами WPShop, например, Quizle, можно экспортировать данные опросов и импортировать в вашу выставку для комплексного анализа.
Таким образом, создание выставки результатов опросов с фильтрацией и сортировкой — реалистичная и полезная задача, которая повысит удобство и функциональность вашего сайта на WordPress.