WordPress как на ладони
wordpress jino

Опрос Democracy

Знакомьтесь с реинкарнацией некогда известного плагина: Democracy Poll. Сказать, что это на 100% мой плагин я не могу, но скажу, что это мой плагин на 90%, потому что от старого плагина осталось, пожалуй, только название и идея "Демократического опроса" - возможность добавлять пользователям свои ответы - почти ничего... Автором старого Democracy Poll является Andrew Sutherland (сайт jalenack.com перестал работать). Оригинал плагина не обновлялся уже 9 лет, последняя версия 2.0.1 была выпущена в 2006 году.

Здесь я делюсь своим плагином, с одноименным названием Democracy Poll. Своим потому что я полностью переписал плагин и добавил туда много всего.

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

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) (отключается);

  • Мульти-голосование: пользователи могут выбирать несколько вариантов ответов (отключается);

  • Закрывать опрос по окончанию указанный даты;

  • Показывать случайный опрос из нескольких активных;

  • Закрывать опросы для незарегистрированных пользователей;

  • Удобное редактирование отдельного опроса: кнопка редактировать для администраторов.

  • Редактировать количество голосов.

  • Пользователь может изменить свое мнение: возможность пере-голосовать (отключается);

  • Запоминание голосовавших по: IP, Cookie, профилям в WordPress (для авторизованных пользователей). Историю можно очищать;

  • Вставлять опросы в посты: шоткод [demоcracy]. Для этого есть кнопка в визуальном редакторе;

  • Виджет (отключается).

  • Удобное редактирование опросов: панель плагина вынесена в Панель инструментов WordPress (toolbar) (отключается);

  • Отключение .css или .js файлов. Или их встраивание прямо в HTML.

  • Выводить заметку под опросом: короткий текст пояснение к опросу и т.п.

  • Изменение внешнего вида опроса: css темы.

  • Русский интерфейс. В коде все на русском, но кому нужно, есть перевод на English.

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

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

Скачать

Democracy Poll — WordPress Plugins
Скачано: 457, размер: 37.8 KB, дата: 1.8 года назад

Для работы требует PHP 5.3 или выше.

Внимание!

Так случилось, потому что при принятии плагина в каталог плагинов WP ему пришлось сменить основную папку с democracy на democracy-poll.

Поэтому, если вы скачивали плагин с этого сайта, а не с каталога WordPress. То, очень важно правильно его обновить, чтобы не потерять имеющиеся опросы и чтобы он совпадал с плагином в каталоге, и в дальнейшем его удобно можно было обновить.

Для этого:

  1. Зайдите через FTP в каталог плагинов wp-content/plugins и переименуйте папку "democracy" в "democracy-poll".

  2. Затем зайдите в Админ-панель > Плагины и активируйте плагин заново.

  3. Все, теперь обновите плагин как обычно, через админ-панель.

Не удаляйте плагин из каталога плагинов, чтобы заменить его плагином из каталога. А то потеряются все созданные ранее опросы, потому что при удалении плагин удалить все свои данные...

Установка

Устанавливается как и любой другой плагин, читайте здесь.

Удаление

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

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

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

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

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

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

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

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

dem-tinymce-button

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

dem-create-archive

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

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

<?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 Испльзвоания хуков

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

Перевод

Порядок действий для перевода на любой язык:

  1. Установите программу Poedit
  2. Запустите программу и перейдите в меню: "File > NEW form POT/PO file..."
  3. В открывшемся диалоговом окне перейдите в папку плагина "land" и переключитесь на показ PO файлов (их по умолчанию не видно) и выберите файл ru_RU.po. Нажмите "Открыть" в диалоговом окне.
  4. Выберите язык на который будите переводить и нажмите OK. Теперь, на всякий случай обновите все строки перевода: нажмите в панели инструментов Poedit кнопку Update.
  5. Переведите все строки и нажмите кнопку Save. И сохраните переведенный файл в папку плагина lang (название плагина должно соответствовать локали вашего перевода. Список локалей смотрите здесь: http://svn.automattic.com/wordpress-i18n/ ).
  6. Перевод готов!

translation

После этого перевод должен включиться автоматически.

При обновлении плагина, если были изменения и появились не переведенный строки, нужно опять открыть poedit, открыть в нем нужный .po файл и нажать "Update". Все не переведенные строки появятся в файле перевода.

Обновления

= 4.5+ =
Смотрите в репозитории WordPress

= 4.5 = 31 января 2015
Добавка: поддержка тем за счет css стилей.
Добавка: новая тема "flat" (flat.css).
Правка: доработка кода.= 4.4 =
Добавка: Работа плагина без javascript.
Правка: доработка кода.

= 4.3.1 =
Добавка: кнопка "удалить ответ пользователя" при множественном голосовании. Без нее было неудобно.
Правка: доработка кода.

= 4.3 =
Добавка: Кнопка плагина в визуальном редакторе TinyMCE.
Правка: доработка кода.

= 4.2 =
Добавка: Возможность пере-голосования.

= 4.1 =
Добавка: Ограничение: только зарегистрированные пользователи могут голосовать. Подсчет таких голосов как пользователей системы, а не по IP.
Добавка: Поддержка подключения сжатых версий CSS (.min.css) и .js (.min.js): если они есть, то будут подключаться они.
Добавка: Встраивание js/css кода прямо в HTML код, чтобы сэкономить на запросах к серверу.
Добавка: Загрузка .js и .css файлов только там где они нужны, только когда хотя бы один опрос отображается на странице.
Добавка: Меню плагина в "Панели инструментов". Так просто создавать опросы, меню можно деактивирвоать в настройках.

= 4.0 =
Добавка: Множественное голосование.
Добавка: Возможность изменять количество голосов.
Добавка: Возможность рандомайза опросов из нескольких активных.
Добавка: Дата окончания опроса.
Добавка: jQuery выбор даты для Даты окончания опроса.
Добавка: Возможность открывать/закрывать опросы.
Добавка: Локализация. Перевод на Английский.
Добавка: Изменил шоткоды {democracy}/{democracy:} на стандартные для WP [``democracy]/`[``democracy id=]`.
Добавка: Плагин стал работать на основе jQuery. За счет этого новые возможности, анимация...
Добавка: Кнопка редактирования для каждого опроса. Очень удобно, когда вы администратор, вы будите видеть иконку карандаша справа вверху.
Добавка: Кнопка очистки логов (сохраненные IP адреса и данные о голосовавших). Очищается в настройках.
Добавка: "Умная" кнопка создания архивной страницы из настроек.
Правка: Изменил около 80% кода плагина, т.е. переписал почти все. Теперь код более логичный и его проще расширять.
Правка: Стили опроса. Перевел все на % и em. Теперь дизайн подстраивается под размеры экрана, сайта.

= 3.1 = 1 июня 2012

  • Правки в коде; дополнил виджет; немного изменил внешний вид; добавил правильное удаление плагина с удалением талиц и настроек.

ОБНОВЛЕНИЕ ВАЖНО: изменил названия таблиц в БД (могут быть глюки с регистрозависимостью), поэтому при замене файлов, плагин перестанет работать. Не нужно его активировать/деактивировать! Чтобы переименовать таблицы в нужные, допишите в адресе любой страницы блога ?dem_rename_db_tables. Также, настройки нужно будет сохранить заново.

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

Какой используете плагин страничного кэширования?

  • Добавить ответ
Опрос Democracy 353 комментария
Полезные 25 Вопросы 1 Все
  • alenaxxx cайт: escort-byuro.net

    Здравствуйте
    Присоединяюсь ко всем положительным отзывам и комментария, действительно простой в использовании интересный плагин. Одна только маленькая недоработка в нём, если Вам не сложно замените "nofollow" на "noindex". Первый вариант мешает паукам только сайт сканировать.
    Во всём остальном плагин отличный, по этому и прошу исправить эту мелочь, так как хочу его оставить. Спасибо за плагин)

    С уважением
    Алёна

    Ответитьмесяц назад #
  • Kimi @

    Hi Kama!
    Is it possible to adjust the time the cookies are kept? Like... I know there is an option that users can vote once/day. Is it possible to adjust some number in the plugin's files so the users could vote once/hour instead of once/day? I'm willing to pay for this. Please help. smile

    Ответить19 дней назад #
  • Олег

    Отличный плагин! Но очень не хватает кнопки "Добавить вопрос". sad

    Ответитьвчера #

Здравствуйте, !

Ваш комментарий