Публикация в группе: Плагин WP-Recall - Личный кабинет на WordPress

Категории группы: Полезное

Начиная с версии 13.0 плагин Wp-Recall получил в свое распоряжение достаточно мощную систему рейтинга, которую можно расширять под свои нужды. В этом уроке мы как раз и рассмотрим пример расширения системы рейтинга, т.е. добавления своего типа рейтинга в общую систему.

Тип рейтинга - составная часть рейтинговой системы, которая фиксирует рейтинговую активность пользователя по отношению к определенному объекту или действию.

Мы можем выделить за какой именно объект или действие пользователя будет изменяться рейтинг у этого объекта/действия и его автора и определяем тип рейтинга который нам нужен, например, существуют следующие типы рейтинга: голосование за комментарии и голосование за записи, в которых фиксируется активность пользователя по отношению к объектам - комментариям или записям, но можно регистрировать тип рейтинга фиксирующий определенные действия, например, публикация комментария или публикация записи.

Рассмотрим пример регистрации нового типа рейтинга - "Публикация комментария".

Допустим, нам требуется фиксировать в рейтинговой системе  сам факт публикации комментария, мы должны поощрять автора комментария за его публикацию и списывать очки рейтинга за удаление его комментария. Реализация такой задачи состоит из нескольких шагов:

  • Регистрация нового типа рейтинга в системе
  • Фиксация определенного действия (публикация комментария) за новым типом рейтинга для увеличения рейтинга автора действия
  • Фиксация противоположного действия (удаление комментария) для уменьшения рейтинга автора действия

Чтобы зарегистрировать новый тип рейтинга достаточно разместить следующий код:

add_action( 'init', 'rcl_register_add_comment_type' );
function rcl_register_add_comment_type() {

	if ( ! rcl_exist_addon( 'rating-system' ) )
		return false;

	rcl_register_rating_type( array(
		'rating_type'	 => 'add-comment',
		'type_name'		 => __( 'Комментирование' ),
		'icon'			 => 'fa-plus'
	) );
}

Основой здесь является функция rcl_register_rating_type() именно она производит регистрацию нового типа рейтинга в системе с данными переданными внутрь нее. В эту функцию мы можем передать массив обязательных и необязательных данных:

  • rating_type - тип рейтинга по которому будем обращаться рейтинговым данным относящимся именно к этому типу рейтинга,
  • post_type  - указывается вместо rating_type, если регистрируется тип рейтинга для произвольного типа записи, в этом случае в качестве значения указывается наименование типа записи
  • type_name - имя типа рейтинга, выводимое в настройках и истории изменения рейтинга пользователя
  • icon - класс, необходимый для формирования иконки при выводе истории изменения рейтинга данного типа
  • style - указывается, если необходимо предоставить в настройках выбор для этого типа рейтинга стиля вывода кнопок голосования - Мне нравиться/Плюс и минус. Может быть true/false (только для объектов)
  • data_type - в значении true, если в настройках должна быть возможность выбора вывода общего рейтинга для определенного объекта как сумму всех значений голосов или как сумму количества положительных и отрицательных голосов за объект (только для объектов)
  • limit_votes - в значении true, если в настройках должна быть возможность указать ограничение на количество голосов за объекты определенного пользователя за определенное время (только для объектов)

После того как произведена регистрация нового типа рейтинга, в настройках дополнения рейтинга появятся новые настройки для этого типа рейтинга.

Теперь размещаем код фиксирующий само действие - добавление комментария. Обратимся к данному действию через хук 'wp_insert_comment':

add_action('wp_insert_comment','add_rating_with_add_comment',10,2);
function add_rating_with_add_comment($comment_id,$comment){
	global $rcl_rating_types;
	
	if(!$comment->user_id) return false;
	
	$args = array(
        'user_id' => $comment->user_id,
        'object_id' => $comment_id,
        'object_author' => $comment->user_id,
        'rating_value' => $rcl_rating_types['add-comment']['type_point'],
        'rating_type' => 'add-comment'
    );
	
	rcl_insert_rating($args);
}

Во время публикации комментария формируется массив данных и передается в функцию rcl_insert_rating(), которая и фиксирует в рейтинговой системе активность определеного типа рейтинга. Рассмотрим данные переданные в эту функцию:

  • user_id - идентификатор пользователя который производит рейтинговую активность. В данному случае, это автор комментария, но если бы речь шла о голосе по отношению к чужому комментарию, то нужно было бы передать идентификатор пользователя оставляющий этот голос.
  • object_id - идентификатор объекта по отношению к которому совершается действие. В данному случае - идентфикатор комментария.
  • object_author - идентификатор автора объекта по отношению к которому совершается действие.
  • rating_value - значение рейтинга на которое изменяем рейтинг пользователя или объекта. Можно указать фиксированное числовое значение или можно получить значение выставленное в настройках данного типа рейтинга через глобальную переменную $rcl_rating_types.
  • rating_type - указываем тип рейтинга к которому будут относиться эти данные в рейтинговой системе

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

Теперь добавим уменьшение рейтинга пользователя при удалении его комментария.

add_action('delete_comment','add_rating_with_delete_comment');
function add_rating_with_delete_comment($comment_id){
	global $rcl_rating_types,$wpdb;
	
	$comment = get_comment($comment_id);
	
	if(!$comment->user_id) return false;
	
	$args = array(
        'user_id' => $comment->user_id,
        'object_id' => $comment_id,
        'object_author' => $comment->user_id,
        'rating_value' => $rcl_rating_types['add-comment']['type_point'],
        'rating_type' => 'add-comment'
    );
	
	rcl_delete_rating($args);
	
	$wpdb->query("DELETE FROM ".RCL_PREF."rating_totals WHERE object_id='$comment_id' AND rating_type='add-comment'");
}

Теперь сформированный массив данных передается в функцию rcl_delete_rating(), которая и производит уменьшение рейтинга. Значение передаваемых данных аналогичное вышеописанному. Стоит только заметить, что при уменьшении рейтинга для определеного объекта его общее значение не удаляется и сохраняется в базе данных, но в данном случае в этом нет необходимости, так как комментарий с данным идентификатором удаляется навсегда и хранить значение рейтинга для этого объекта не требуется, поэтому производим удаление строки общего рейтинга для данного типа и объекта из БД отдельным запросом.

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

По отношению к добавлению типа рейтинга для каких то объектов все несколько проще, если это произвольный тип записи, то часто достаточно просто зарегистрировать новый тип рейтинга, передав в него вместо rating_type post_type с указанием типа записи для которого регистрируем тип рейтинга, а начисление рейтинга или вывод кнопок для голосования будет произведен автоматически. Но иногда необоходимо вывести кнопки для голосования в произвольном месте, тогда используем функцию:

rcl_get_html_post_rating($object_id,$rating_type,$object_author=false)

в которую передаем идентификатор объекта для которого выводим кнопки голосования, указываем тип рейтинга (для произвольных типов записей это название этого типа записи) и если выводим кнопки не для типа записи и не для комментария передаем идентификатор автора этого объекта. Функция выведет кнопки для голосования для указанного объекта согласно настроек выставленных для этого типа рейтинга.

13

Автор публикации

не в сети 17 часов

Андрей CS

12K
рассматриваю задания
Комментарии: 2743Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0