WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Democracy Poll

Плагин позволяет создавать на сайте опросы, с возможностью пользователям добавлять варианты ответов. Одна из главных фишек плагина - это умение работать с плагинами страничного кэширования (например WP Super Cache).

Что касается сравнения этого плагина с аналогами. Но насчет известного wp-polls все же скажу: оба плагина очень похожи, функционал во много похож, я даже удивился когда начал сравнивать. Но, по моему, этот плагин лучше, потому что удобнее, пользователи могут добавлять свои ответы, работает с кэшем. Однако в моем плагине нет такой гибкой настройки шаблона опроса, а есть 3 темы оформления и возможность изменять дописывать свои css стили. Изменив стили, можно полностью изменить внешний вид опроса.

Что умеет плагин

  • Создавать опросы.
  • Работать с плагинами страничного кэширования, не "убивая" их функциональность.
  • Пользователи могут добавлять свои ответы (Democracy) (отключается).
  • Мульти-голосование: пользователи могут выбирать несколько вариантов ответов (отключается).
  • Закрывать опрос по окончанию указанный даты.
  • Показывать случайный опрос из нескольких активных.
  • Закрывать опросы для незарегистрированных пользователей.
  • Удобное редактирование отдельного опроса: кнопка редактировать для администраторов.
  • Редактировать количество голосов.
  • Пользователь может изменить свое мнение: возможность пере-голосовать (отключается).
  • Запоминание голосовавших по: IP, Cookie, профилям в WordPress (для авторизованных пользователей). Историю можно очищать.
  • Вставлять опросы в посты: шоткод [demоcracy]. Для этого есть кнопка в визуальном редакторе.
  • Виджет (отключается).
  • Удобное редактирование опросов: панель плагина вынесена в Панель инструментов WordPress (toolbar) (отключается).
  • Отключение .css или .js файлов. Или их встраивание прямо в HTML.
  • Выводить заметку под опросом: короткий текст пояснение к опросу и т.п.
  • Изменение внешнего вида опроса: css темы.
  • Русский интерфейс. В коде все на русском, но кому нужно, есть перевод на English.

Но как говорил Идиот (Достоевского), - «Говорить нехорошо, лучше пример»:

Если вам нужны какие либо дополнительные возможности, голосуйте/добавляйте их в конце этой статьи, в опросе.

меню

Использование

Создавать опросы и настраивать плагин можно в меню: Настройки > Опрос Democracy. Или через Панель инструментов WordPress. Меню в панели можно отключить в настройках:

Меню инструментов Democracy

Для вставки опроса на сайт используйте виджет. Если виджет не нужен и он мешает, его можно отключить в настройках.

Виджет Опроса Democracy

Также опросы можно вставлять отдельно в записи (посты) для этого используйте шоткод [ democracy id=""]. Для удобной вставки шоткодов, плагин добавляет кнопку в визуальный редактор. Кнопку можно отключить в настройках:

dem-tinymce-button

меню

[democracy_archives] — шоткод 

Чтобы вывести архив опросов используйте шоткод [democracy_archives] (удалите пробел в начале шорткода, он есть чтобы тут не обрабатывался шорткод). Обычно создавать архив отдельно не нужно, для этого на странице настроек есть специальная кнопка. Она ищет существующую страницу, если не найдено, то создает новую постоянную страницу с нужным шоткодом.

dem-create-archive

С версии 5.5.6, в шоткод [democracy_archives] можно передавать параметры. Например можно вывести все активные опросы так:

[democracy_archives screen="vote" active="1" per_page="-1"]

Параметры которые можно передать в шорткод:

'before_title' => '',      // for single poll title
'after_title'  => '',      // for single poll title
'active'       => null,    // 1 (active), 0 (not active) or null (param not set).
'open'         => null,    // 1 (opened), 0 (closed) or null (param not set) polls.
'screen'       => 'voted', // vote, voted
'per_page'     => 10,      // limit. 0 or -1 - no limit
'add_from_posts' => true,  // add From posts: html block
меню

Расширенное использование

Для вывода опросов и архива опросов через код, в плагине есть специальные функции-обертки:

<?php democracy_poll( $id, $before_title, $after_title ); ?>

Выводит на экран отдельный опрос по переданному id опроса. Если id не передать, то будет выведен один из активных опросов, в случайном порядке. Чтобы получить результат этой функции для обработки используйте get_democracy_poll().

<?php democracy_archives( $hide_active, $before_title, $after_title ); ?>

Выводит на экран архив опросов. Параметр $hide_active отвечает за показ активных опросов. Если установить его в true, все активные опросы (которые участвуют в ротации) будут удалены их вывода. Чтобы получить результат функции, а не выводить его на экран используйте get_democracy_archives().

Код этих функций:

###### функции обертки ######
/**
 * Для вывода отдельного опроса
 * @param int $id ID опроса
 * @return HTML
 */
function democracy_poll( $id = 0, $before_title = '', $after_title = ''){
	echo get_democracy_poll( $id, $before_title, $after_title );
}
function get_democracy_poll( $id = 0, $before_title = '', $after_title = '' ){
//  die($before_title . $after_title);
	$poll = new DemPoll( $id );

	$show_results = __query_poll_screen_choose( $poll );

	return $poll->display( $show_results, $before_title, $after_title );
}

/**
 * Для вывода архивов
 * @param bool $hide_active Не показывать активные опросы?
 * @return HTML
 */
function democracy_archives( $hide_active = false, $before_title = '', $after_title = '' ){
	echo get_democracy_archives( $hide_active, $before_title, $after_title );
}
function get_democracy_archives( $hide_active = false, $before_title = '', $after_title = '' ){
	global $wpdb;

	$WHERE = $hide_active ? 'WHERE active = 0' : '';
	$ids = $wpdb->get_col("SELECT id FROM $wpdb->democracy_q $WHERE ORDER BY active DESC, id DESC");

	$output = '<div class="dem-archives">';
	foreach( $ids as $poll_id ){
		$poll = new DemPoll( $poll_id );
		$poll->opt['archive_page_url'] = ''; // убираем ссылку на архив

		$show_results = isset( $_REQUEST['dem_act'] ) ? __query_poll_screen_choose( $poll ) : true;

		$output .= $poll->display( $show_results, $before_title, $after_title );
	}
	$output .= "</div>";

	return $output;
}
меню

Примеры использования функций в теме

#1. Функция democracy_poll()

<?php democracy_poll( 25, '<div class="title">', '</div>'); ?>

Выведет опрос с ID 25 и обвернет заголовок опроса в <div class="title"> и </div>

#2. Функция democracy_archives()

Выведем список всех неактивных опросов и обернем их заголовки в тег <strong>:

<?php democracy_archives( true, '<strong>', '</strong>' ); ?>

#3 Функция get_dem_polls()

Получает список опросов по указанным параметрам.

$args = array(
	'wrap'           => '<div class="dem-polls">%s</div>', // html block wrap
	'before_title'   => '',      // for single poll title
	'after_title'    => '',      // for single poll title
	'screen'         => 'vote',  // vote, voted
	'active'         => null,    // 1 (active), 0 (not active) or null (param not set).
	'open'           => null,    // 1 (opened), 0 (closed) or null (param not set) polls.
	'add_from_posts' => false,    // add From posts: html block
	'return'         => 'html',  // html, objects
	'paged'          => 1,       // pagination page when 'limit' parameter is set
	'per_page'       => 0,       // limit. 0 - no limit
);

$html = get_dem_polls( $args );

echo $html;

#4 Использование хуков

Один из примеров расширения функционала плагина при помощи имеющихся хуков, описан в вопросе.

Удаление

Удалять плагин нужно из панели плагинов WordPress, чтобы он вместе с файлами удалил данные о себе в базе данных.

Нельзя удалять папку плагина через FTP (это относится ко всем плагинам WP)! Так как плагин создает дополнительные таблицы в Базе Данных и сохраняет настройки. Если удалить плагин просто удалив его папку из каталога плагинов, то плагин не почистит за собой.

Democracy poll и плагины кэширования (WP Super Cache)

Несколько слов о том, как Democracy работает с плагинами кэширования и почему это важно.

Democracy я использую на своих сайтах, в частности на этом. И везде у меня установлен страничных кэш (WP Total Cache). После большого обновления Democracy я вздохнул спокойно, но не успел я выдохнуть, как понял, что опрос-то не работает с кэшем.

В чем проблема? Поясню на примере: зашел посетитель на страницу сайта где выводится опрос за который он уже голосовал, ему вывело результаты опроса помеченные его голосами и такая страница сохранилась в кэш. Далее на эту же страницу заходит другой посетитель, который не голосовал и видит сохраненную в кэше страницу, где выводятся результаты голосования прежнего посетителя, но ведь второй посетитель еще не голосовал. Вот и получается, что если вы используете кэширование на сайте (а в WordPress оно нужно), то опрос попросту не работает!

Посмотрел я имеющиеся в каталоге WP плагины опросов, среди которых и популярный WP-Polls и не нашел ни одного плагина, который бы работал с кэшем - это, надо признаться, уныло: плагин есть, а толку нет...

Разумеется меня это все не устроило и я активно занялся доработкой Democracy. Чтобы он умел работать с плагинами страничного кэширования! Признаться, я думал сделать это будет проще, гораздо проще, чем оказалось на поверку. Работы получилось много, в основном время ушло на тестирование, сложно тестировать кэш... Но оно того стоило.

С версии 4.5.6, Democracy работает с кэшем!

Но работать с кэшем можно по-разному. Простой и очень нехороший пример: плагин добавляет скрипт, который при загрузке кэшированной страницы, отправляет AJAX запрос и проверяет голосовал ли пользователь и заменяет данные опрос на полученные данные. С таким подходом вся работа плагина кэширования идет Сердитому коту под хвост... Это как печальный плагин wp-postviews, умеющий работать с кэшем: страница была отдана из кэша, практически без нагрузки на сервер и тут же AJAX запрос подгружает WordPress фоном и нагрузка на сервер, чуть ли не такая же как была без плагина кэширования.

Democracy poll работает не так и не "аннулирует" работу плагина кэширования.

Логика работы Democracy с кэшем: Проверяется установлен ли один из плагинов кэширования и включен ли в нем страничный кэш, если кэш работает, то под каждый опрос на странице в тегах noindex подгружаются html коды голосования и результатов. Далее, при загрузке страницы, скрипт проверяет установлены ли куки голосования для пользователя:

  • если - да, то скрипт берет html результатов и ставит их в опрос и вы видите результаты, независимо от того что там сохранилось в кэше,

  • если - нет, то скрипт заменят опрос на вид голосования и не голосовавший пользователь может голосовать. Но тут нужно еще проверить: куков может не быть в браузере, но в логах, в БД могут быть данные о том, что посетитель с таким же IP или пользователь с таким же ID уже голосовал. Получается совсем без AJAX запроса не обойтись, а на сервер нагружать не хочется - кэш все-таки...Поэтому: AJAX запрос на проверку данных в БД отправляется, не при загрузке страницы, а когда посетитель наведет мышку на опрос и удержит её там больше секунды (сигнал, что он хочет голосовать) или кликнет по блоку опроса (в любое место, для тачскринов).

    • Если БД отвечает, что посетитель голосовал, то ему выводятся результаты с заметкой "Вы уже голосовали" и устанавливаются соответствующие куки в браузере, чтобы такой запрос для этого пользователя больше не делать.
  • Если БД отвечает, что пользователь не голосовал, то устанавливаются куки, что такая проверка пройдена, но визуально ничего не происходит и пользователь может голосовать.
меню

Опрос по плагину

меню

Что добавить в плагин Опрос Democracy?

  • Добавить ответ
Результаты

Предложения из опроса, которые уже внесены в плагин (чтобы не мешались в опросе):
- При выборе возможности выбора несколько вариантов ответа нужно добавить максимальное количество выбранных вариантов к примеру 3 варианта но можно выбрать только 2 (21 голос)
- Дату окончания опроса (71 голос)
- Множественное голосование (несколько вариантов ответов) (61 голос)
- Для голосования, пользователь должен зарегаться. Контроль вести по пользователю WP. (13 голосов)
- Возможность рандомайза опросов из НЕСКОЛЬКИХ активных (18)
- Простой способ вставки опросов. (20)
- Возможность редактировать количество голосов (16)
- Кнопку переголосовать! (9)
- Добавить возможность вручную устанавливать порядок ответов. А то сейчас только по количеству голосов и по порядку добавления. (17)
- Выбор категории пользователей, которые могут управлять опросами (Админ, модер,участник и т.д.) (19)
- Отключать вывод результатов опроса (22)
- Пагинацию в Админке (9)

https://avi1.ru/ - качественные SMM услуги по продвижению в социальных сетях доступны на данном сайте. Здесь Вы найдете любой необходимый ресурс на крайне выгодных условиях.

329 комментов
Полезные 29 Вопросы 5 Все
  • Максим
    <div class='democracy'><div class="widget-title">Как вы отдыхаете?</div><div class='dem-results'><form action="http://сайт.ru/wp-content/plugins/democracy/democracy.php" onsubmit="return dem_Vote(this)">
    <ul><li>
    		<input type='radio' id='dem-choice-187' value='187' name='dem_poll_12' />
    		<label for='dem-choice-187'>С друзьями пиво пью</label>
    	</li><li>
    		<input type='radio' id='dem-choice-188' value='188' name='dem_poll_12' />
    		<label for='dem-choice-188'>Валяюсь перед телевизором или сижу в интернете</label>
    	</li><li>
    		<a href='/?dem_add_user_answer=true&dem_poll_id=12' rel='nofollow' onclick='return dem_addAnswer(this)' class='dem-add-answer'>Добавить свой ответ</a>
    		</li></ul><input type='hidden' name='dem_poll_id' value='12' />
    <input type='hidden' name='dem_action' value='vote' />
    <input type='submit' class='vote-button' value='Голосовать' /><a href='/?dem_action=view&dem_poll_id=12' onclick='return dem_getVotes("http://сайт.ru/wp-content/plugins/democracy/democracy.php?dem_action=view&dem_poll_id=12", this)' rel='nofollow' class='postcontent'>результаты</a>
    </form></div></div></ul>
    Ответить16.Май.2019 в 17:38 #
    • Максим

      Вывожу

      <?php jal_democracy(12, '<div class="widget-title">', '</div>'); ?>
      Ответить16.Май.2019 в 17:40 #
    • Максим

      Сбросил настройки на начальные вообще перестал работать. Error 0 выдаёт. Может конфликт с другими скриптами

      Ответить16.Май.2019 в 17:56 #
      • Максим

        Деактивировал плагин, повело шаблон. При этом https загорелся зелёным цветом.

        Ответить16.Май.2019 в 20:40 #
        • Максим

          Плагин был старой версии, хотя всё работало на последней версии WP. Установил новую версию плагина, руссифицировал, ошибки исчезли. Но вот другая проблема, опрос у меня не работает. Не отображается результат, архив опросов, когда нажимаю голосовать, всегда отображается "уже голосовали" и так на всех опросах.

          Ответить17.Май.2019 в 19:36 #
  • Александр

    Добрый день! Есть ли возможность сразу показывать результаты опроса пользователю, который не голосовал?

    1
    Ответить18.Май.2019 в 21:34 #
  • Сергей

    Здравствуйте. Я столкнулся с такой проблемой опросов на сайте. На всех страницах сайта кроме страницы с архивом опросов не срабатывает "результат", также при голосовании или при переголосовании ссылка становиться такого вида https://сайт.ru/#democracy-3, кроме страницы архива опросов.
    Сбрасывал все настройки на начальные, все опросы запущены и с галочкой показывать результат. Подскажите, где копать? Почему на странице с архивом опросов всё работает без проблем, на других косячит?

    Ответить25.Май.2019 в 14:08 #
    • Kama7641

      Недавно только точно такую же проблему решали. Решение было в том, что другой скрипт темы, отрабатывал с ошибкой до скрипта этого плагина и поэтому скрипт этого плагина просто не работал... Смотри в консоль, какой-то скрипт неправильно работает - работает с ошибкой...

      Ответить25.Май.2019 в 16:55 #
      • Эдуард

        Здравствуйте. Спасибо за отличный плагин.
        У меня появилась та же проблема - не срабатывает ссылка "результаты".
        В консоли хрома только варнинги на куки, в консоли фаерфокса все чисто.

        Ответить16.Ноя.2019 в 14:15 #
  • @ Day Kurniawan jarrakpos.com

    Здесь кто-нибудь говорит по-английски? Мне нужно обсудить этот плагин

    Ответить26.Июн.2019 в 19:55 #
    • @ Day Kurniawan jarrakpos.com

      Я поставил картинку для ответа, есть здесь кто-нибудь, чтобы сделать то же самое?

      Ответить26.Июн.2019 в 19:59 #
      • @ Day Kurniawan jarrakpos.com

        Это мой метод формы

        $___ .= '<form method="POST" action="#democracy-'. $this->id .'">';
        			$___ .= '<ul class="dem-vote">';
        
        				$type = $poll->multiple ? 'checkbox' : 'radio';
        
        				foreach( $poll->answers as $answer ){
        					$answer = apply_filters('dem_vote_screen_answer', $answer );
        
        					$auto_vote = $auto_vote_on_select ? 'data-dem-act="vote"' : '';
        
        					$checked = $disabled = '';
        					if( $this->votedFor ){
        						if( in_array( $answer->aid, explode(',', $this->votedFor ) ) )
        							$checked = ' checked="checked"';
        
        						$disabled = ' disabled="disabled"';
        					}
        
        					 $___ .= '<li data-aid="'. $answer->aid .'">';
        					 $___ .= '<div class="dem_pic">';
        					 $___ .= '<div  class="dem_img" value="'. $answer->pict .'" name="answer_ids[]"'. $checked . $disabled .' style="background:url('. $answer->pict .'); width: 100px; height:94px;" >';
        					 $___ .= '</div></div></li>'; 
        
        					$___ .= '<li data-aid="'. $answer->aid .'">';
        
        					$___ .= '<label class="dem__'. $type .'_label">
        							<input class="dem__'. $type .'" '. $auto_vote .' type="'. $type .'" value="'. $answer->aid .'" name="answer_ids[]"'. $checked . $disabled .'>
        							<span class="dem__spot"></span> '. $answer->answer .'
        						</label>
        					</li>';
        				}
        
        				if( $poll->democratic && ! $this->blockVoting ){
        					$___ .= '<li class="dem-add-answer"><a href="javascript:void(0);" rel="nofollow" data-dem-act="newAnswer" class="dem-link">'. _x('Ketik pilihan Sendiri','front','democracy-poll') .'</a></li>';
        				}
        			$___ .= "</ul>";
        
        			$___ .= '<div class="dem-bottom">';
        				$___ .= '<input type="hidden" name="dem_act" value="Pilih">';
        				$___ .= '<input type="hidden" name="dem_pid" value="'. $this->id .'">';
        
        				$btnVoted  = '<div class="dem-voted-button"><input class="dem-button '. democr()->opt('btn_class') .'" type="submit" value="'. _x('Sudah memilih...','front','democracy-poll') .'" disabled="disabled"></div>';
        				$btnVote   = '<div class="dem-vote-button"><input class="dem-button '. democr()->opt('btn_class') .'" type="submit" value="'. _x('Pilih','front','democracy-poll') .'" data-dem-act="vote"></div>';
        
        				if( $auto_vote_on_select )
        					$btnVote = '';
        
        				$for_users_alert = $this->blockForVisitor ? '<div class="dem-only-users">'. self::registered_only_alert_text() .'</div>' : '';
        
        				// for eksha
        				if( $this->for_cache ){
        					$___ .= self::_voted_notice();
        
        					if( $for_users_alert )
        						$___ .= str_replace( array('<div', 'class="'), array('<div style="display:none;"', 'class="dem-notice '), $for_users_alert );
        
        					if( $poll->revote )
        						$___ .= preg_replace('~(<[^>]+)~s', '$1 style="display:none;"', $this->_revote_btn(), 1 );
        					else
        						$___ .= substr_replace( $btnVoted, '<div style="display:none;"', 0, 4 );
        					$___ .= $btnVote;
        				}
        				// not for cache
        				else {
        					if( $for_users_alert ){
        						$___ .= $for_users_alert;
        					}
        					else{
        						if( $this->has_voted )
        							$___ .= $poll->revote ? $this->_revote_btn() : $btnVoted;
        						else
        							$___ .= $btnVote;
        					}
        
        				}
        
        				if( ! $this->not_show_results && ! democr()->opt('dont_show_results_link') )
        					$___ .= '<a href="javascript:void(0);" class="dem-link dem-results-link" data-dem-act="view" rel="nofollow">'. _x('Hasil Poling','front','democracy-poll') .'</a>';
        
        			$___ .= '</div>';
        
        		$___ .= '</form>';
            // Css percentage
        					$graph_percent = ( ( ! democr()->opt('graph_from_total') && $percent != 0 ) ? round( $votes / $max * 100 ) : $percent ) . '%';
        					if( $graph_percent == 0 )
        					$graph_percent = '1px'; 
        
        					$___ .= '<div class="dem-graph">';
        					$___ .= '<div class="dem_pic">';
        
        					$___ .= '<div class="dem_img" style="background:url('. $answer->pict .'); width: 100px; height:100px;" value="">';    
        
        					$___ .= "</div></div>"; 
        						$___ .= '<div class="dem-fill" '.( democr()->opt('line_anim_speed') ? 'data-width="' : 'style="width:' ). $graph_percent .'"></div>';
        
        						$___ .= $votes_txt;
        						$___ .= $percent_txt;
        					$___ .= "</div>";
        Ответить28.Июн.2019 в 10:46 #
        • @ Day Kurniawan jarrakpos.com

          У меня проблема, я не говорю по-русски

          Ответить28.Июн.2019 в 11:29 #
          • @ Day Kurniawan jarrakpos.com

            Мне нужно загрузить прямо из этого раздела, как я могу это сделать?

            Ответить28.Июн.2019 в 11:30 #
  • @ Uldis

    Привет, Kama! I will carry on with English, as I don't have a Russian keyboard at the moment.. So my question is, can I start my pool with a results view? I found somewhere that there use to be command type=”result” in the past, but it won't work anymore. Can you please help with this? Thanks! P.S. You can reply in Russian if it is easier for you!

    1
    Ответить31.Авг.2019 в 15:33 #
  • @ Day

    Hi Uldis, I have been using this poll since long time, and I like it very much, but I need someone to comunicate and chat about this pluggin

    Ответить14.Сен.2019 в 11:44 #
    • @ Uldis

      Hi Day! Sorry, but I can't help you. You will need to wait for Kama to show up! And yeah this plugin is great!

      Ответить14.Сен.2019 в 14:53 #
      • @ Day

        Hi Uldis, It will take some time, as probably not so much people speak english in this forum

        Ответить27.Сен.2019 в 13:06 #
  • @ Максим infocustoms.ru

    Здравствуйте, тема block.css ,как поменять фон с серого на другой?Спасибо.

    Ответить12.Окт.2019 в 17:16 #
    • @ Day Kurniawan
      /* Change the background-color:#eee;*/
      
      .democracy ul.dem-vote{ margin-top: 0em; margin-bottom:1em; }       
      .democracy ul.dem-vote li{padding-bottom:0; margin-bottom:0; }
      .democracy ul.dem-vote li > *{height: 94px; border-color:#ccc; border: 1px solid rgba(0,0,0,.1);
      							  background-color:#eee; background-color:rgba(0,0,0,.1);
      							   line-height:3.2; margin-top: auto;  margin-bottom: 0.1em; } /* for comfort hover */
      .democracy ul.dem-answers li{ padding-bottom:.1em; }
      
      Ответить17.Ноя.2019 в 11:44 #
    • @ Day Kurniawan

      Ответить17.Ноя.2019 в 11:45 #
Здравствуйте, !     Войти . Зарегистрироваться