Начиная с версии 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)
в которую передаем идентификатор объекта для которого выводим кнопки голосования, указываем тип рейтинга (для произвольных типов записей это название этого типа записи) и если выводим кнопки не для типа записи и не для комментария передаем идентификатор автора этого объекта. Функция выведет кнопки для голосования для указанного объекта согласно настроек выставленных для этого типа рейтинга.
Эти все коды прописывать в файле функции темы?
Да. В файле функций. Если возникнут проблемы - напишите на форуме, с подробным описанием что делали и с отправкой на эту тему
Очень классно, спасибо большое! Единственное что правда не происходит - после удаления комментария начисленные баллы не вычитаются. Комментатор получает баллы сразу, до одобрения. С административной части удаляю комментарий (не пропускаю даже). Баллы не счислились. Комментатор пишет снова камментарий. Баллы начисляются, я пропускаю комментарий и после этого удаляю. Всё равно не списываются. Примерно в чём причина не подскажите? Прописал всё точно так как у вас без изменений.
Настройки обычные https://yadi.sk/i/LSePqZQV3PbBza
Если у вас одобрение комментариев, то надо делать так:
add_action('transition_comment_status', 'rcl_a_add_comment_hookh776', 10, 3);
function rcl_a_add_comment_hookh776($new_status, $old_status, $comment) {
if($old_status != $new_status) {
if($new_status == 'approved') {
//Даем рейтинг
}
}
}
add_action( 'wp_insert_comment', 'action_insert_comment_88asd25', 10, 2 );
function action_insert_comment_88asd25( $id, $comment ){
if($comment->comment_approved != 1) return false;
//Даем рейтинг
}
т.е. если для юзера не требуется одобрение - начисление идет сразу, а если требуется - после одобрения комментария
То есть вместо
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);
}
Прописать вот это всё?
add_action('transition_comment_status', 'rcl_a_add_comment_hookh776', 10, 3);
function rcl_a_add_comment_hookh776($new_status, $old_status, $comment) {
if($old_status != $new_status) {
if($new_status == 'approved') {
//Даем рейтинг
}
}
}
add_action( 'wp_insert_comment', 'action_insert_comment_88asd25', 10, 2 );
function action_insert_comment_88asd25( $id, $comment ){
if($comment->comment_approved != 1) return false;
//Даем рейтинг
}
Не даёт рейтинг ни до ни после. 😕
Комментарий если даже сразу проходит, после его удаления не списываеются баллы.
Многострочный код пропал из комментариев на codeseller
Потому что технические вопросы решаем не в комментариях, а на форуме поддержки, столько раз вам говорилось. Просто ссылкой даем понять по какому материалу делали.
Эта портянка, что выше, никому пользу не принесет.
как добавить рейтинг за написание постов пользователем? вроде бы очевидно и должно быть гдето в настройках. помогите, пожалуйста
Здравствуйте.
Задавайте вопросы на форуме поддержки. Если вы что-то уже делали - показывайте что.
Ваш вопрос не понятен если сравнивать его с той темой где вы его задали.
Все здорово. Не понимаю такой вещи: почему при отметке в настройках "влиять на общий рейтинг пользователя" в положение "да" кастом рейтинг никак не влияет? Я поставил тип рейтинга Мне нравится, лайкаю посты пользователей но их рейтинг не увеличивается
Опишите на форуме поддержки что делали - и будем рассматривать вашу ситуацию там.
А можно пример для плагина Игры на рейтинг? Не получается и всё добавить свой тип. Или через форум только?