/*compatibility for servers without math library*/
if( !function_exists( "bcdiv" ) )
{
function bcdiv( $first, $second, $scale = 0 )
{
$res = $first / $second;
return round( $res, $scale );
}
}
/* Add inputs to comment form */
if( !function_exists('add_criteria_raitings_comment_fields') ) {
function add_criteria_raitings_comment_fields($fields) {
if(is_singular('product')) return $fields;
wp_enqueue_style('rhuserreviews');
$postid = get_the_ID();
$reviewScore= get_post_meta($postid, 'rehub_review_overall_score', true);
if(!$reviewScore) return $fields;
$reviewCriteria = get_post_meta($postid, '_review_post_criteria', true);
if(empty($reviewCriteria)){
$review_post = get_post_meta( $postid, 'review_post', true );
if(!empty($review_post)){
$reviewCriteria = $review_post[0]['review_post_criteria'];
}
}
$firstcriteria = (!empty($reviewCriteria[0]['review_post_name'])) ? $reviewCriteria[0]['review_post_name'] : '';
if($firstcriteria) {
wp_enqueue_style('jquery.nouislider');
wp_enqueue_script('jquery.nouislider');
$criteriaNamesArray = array();
$criteriaInputs = '
';
// check if rated post already
$current_user_id = get_current_user_id();
if($current_user_id) {
$rated_posts = get_user_meta($current_user_id, 'rated_posts', true);
if($rated_posts) {
$current_post_id = get_the_ID();
if(in_array($current_post_id, $rated_posts)) {
$criteriaInputs = '';
wp_dequeue_style('jquery.nouislider');
wp_dequeue_script('jquery.nouislider');
};
};
}
else {
if (isset($_COOKIE['rated_posts'])) {
$rated_posts = explode(',', $_COOKIE['rated_posts']);
if($rated_posts) {
$criteriaInputs = '';
wp_dequeue_style('jquery.nouislider');
wp_dequeue_script('jquery.nouislider');
};
};
};
if(is_user_logged_in()) {
$fields .= $criteriaInputs;
}
else {
$fields['criteria'] = $criteriaInputs;
};
return $fields;
}
else {
return $fields;
}
}
}
//add inputs to comment form
add_action('init', 'rh_add_review_form_to_comments');
function rh_add_review_form_to_comments(){
if (rehub_option('allowtorate') == 'guests' ) {
if (!is_user_logged_in()) {
add_filter('comment_form_default_fields', 'add_criteria_raitings_comment_fields');
}
}
elseif (rehub_option('allowtorate') == 'users') {
if (is_user_logged_in()) {
add_filter('comment_form_logged_in', 'add_criteria_raitings_comment_fields');
}
}
else {
if (!is_user_logged_in()) {
add_filter('comment_form_default_fields', 'add_criteria_raitings_comment_fields');
}else{
add_filter('comment_form_logged_in', 'add_criteria_raitings_comment_fields');
}
}
}
/* saving data when add comment */
add_action('comment_post', 'save_comment_criteria_raitings');
/* Saving data from fields */
function save_comment_criteria_raitings($comment_id) {
if((isset($_POST['user_criteria'])) && ($_POST['user_criteria'] != '')) { // if we got user ratings
$userCriteria = (array)$_POST['user_criteria']; $commentTotal = 0; // put user ratings in array
for($i = 0; $i < count($userCriteria); $i++) { // get sum of ratings
$commentTotal += (int)$userCriteria[$i];
};
if($commentTotal == 0 || $commentTotal =='') { // if sum = 0
return false;
}
else { // if user set ratings
$commentData = array();
$criteriaNamesSerialized = sanitize_text_field($_POST['criteria_names']); // get array of criteria names
$criteriaNames = explode(',', $criteriaNamesSerialized);
for($i = 0; $i < count($userCriteria); $i++) {
$commentData[$i]['name'] = $criteriaNames[$i]; // put name of criteria in variable
$commentData[$i]['value'] = $userCriteria[$i]; // put criteria value in variable
};
$commentAverage = bcdiv($commentTotal, count($commentData), 1); // get average of comment ratings
};
$cons_review_clean = wp_kses($_POST['cons_review'], 'default'); // get cons value
$pros_review_clean = wp_kses($_POST['pros_review'], 'default'); // get pros value
update_comment_meta($comment_id, 'cons_review', $cons_review_clean); // put cons in meta field
update_comment_meta($comment_id, 'pros_review', $pros_review_clean); // put pros in meta field
update_comment_meta($comment_id, 'user_criteria', $commentData); // put array of user ratings in meta field
update_comment_meta($comment_id, 'user_average', $commentAverage); // put average of ratings in meta field
update_comment_meta($comment_id, 'counted', 0); // set flag approve or not user review
/* Prevent duplicate vote */
$current_user_id = get_current_user_id(); // get user ID
if($current_user_id) { // if register
$comment = get_comment($comment_id);
$current_post_id = $comment->comment_post_ID; // get post ID
$rated_posts_meta = get_user_meta($current_user_id , 'rated_posts', true); // get array of reviewed posts of user
if(!$rated_posts_meta || $rated_posts_meta == '') { // if array not exist
$rated_posts_meta = array($current_post_id); // create array
}
else {
$rated_posts_meta[] = $current_post_id; // put ID of reviewed post in array of reviewed posts
};
update_user_meta($current_user_id , 'rated_posts', $rated_posts_meta); // update user meta field
}
else { // if user is not register
$domainArray = explode('://', home_url());
$clearDomain = $domainArray[1]; // get site domain
$comment = get_comment($comment_id);
$current_post_id = $comment->comment_post_ID; // get post ID
$clearLink = str_replace(home_url(), '', get_permalink($current_post_id)); // get post URL
setcookie('rated_posts', 1, time()+60*60*24*366, $clearLink, $clearDomain, false); // put cookie that user reviewed this post
};
};
}
add_action('comment_post', 'comment_rates_change_on_post', 10, 2); // Runs when saving new comment
add_action('edit_comment', 'comment_rates_change'); // Runs when editing comment
add_action('delete_comment', 'comment_rates_change'); // Runs just before a comment is deleted. Action function arguments: comment ID.
add_action('trash_comment', 'comment_rates_change'); // Runs just before a comment is trashed. Action function arguments: comment ID.
add_action('comment_closed', 'comment_rates_change'); // Runs when the post is marked as not a spam.
add_action('wp_set_comment_status', 'comment_rates_change'); // Runs when the status of a comment changes. Action function arguments: comment ID, status string indicating the new status ("delete", "approve", "spam", "hold").
function comment_rates_change($comment_id) {
$status = wp_get_comment_status($comment_id); // 'deleted', 'approved', 'unapproved', 'spam'
switch($status) {
case 'approved':
add_comment_rates($comment_id);
break;
case 'unapproved':
remove_comment_rates($comment_id);
break;
case 'spam':
remove_comment_rates($comment_id);
break;
case 'trash':
remove_comment_rates($comment_id);
rehub_rewrite_user_review($comment_id);
break;
case 'deleted':
remove_comment_rates($comment_id);
rehub_rewrite_user_review($comment_id);
break;
default:
};
}
function comment_rates_change_on_post($comment_id, $comment_approved) {
if( $comment_approved == 1 ) {
add_comment_rates($comment_id);
}
else {
return;
}
}
/* Saving data from fields */
function add_comment_rates($comment_id) {
$counted = get_comment_meta($comment_id, 'counted', true); // get flag
if($counted == 0) { // Если значения пользовательской оценки не учтены в рейтинге
$comment = get_comment($comment_id); // Получаем объект комментария по идентификатору
$comment_post_id = $comment->comment_post_ID; // Получаем идентификатор комментария из объекта комментария
$postUserRaitingsArray = get_post_meta($comment_post_id, 'post_user_raitings', false); // Получаем массив значений рейтинга из произвольного поля записи
$postUserRaitings = (!empty($postUserRaitingsArray)) ? $postUserRaitingsArray[0] : '';
$commentRaitingsArray = get_comment_meta($comment_id, 'user_criteria', false); // Получаем массив пользовательских оценок из произвольного поля комментария
$commentRaitings = (!empty($commentRaitingsArray[0])) ? $commentRaitingsArray[0] : '';
$postData = array(); // Создаем массив хранения данных
$postCriteriaAverage = 0;
if(!empty($commentRaitings) && count($commentRaitings) > 0 && is_array($commentRaitings)) {
for($i = 0; $i < count($commentRaitings); $i++) {
$postData['criteria'][$i]['name'] = $commentRaitings[$i]['name'];
if(isset($postUserRaitings['criteria'][$i])) {
$count = (int) $postUserRaitings['criteria'][$i]['count'] + 1;
$total = (float) $commentRaitings[$i]['value'] + (float) $postUserRaitings['criteria'][$i]['value'];
$postData['criteria'][$i]['count'] = $count;
$postData['criteria'][$i]['value'] = $total;
$postData['criteria'][$i]['average'] = bcdiv($total, $count, 1);
}
else {
$postData['criteria'][$i]['count'] = 1;
$postData['criteria'][$i]['value'] = (float) $commentRaitings[$i]['value'];
$postData['criteria'][$i]['average'] = (float) $commentRaitings[$i]['value'];
};
$postCriteriaAverage += $postData['criteria'][$i]['average'];
};
$postAverage = bcdiv($postCriteriaAverage, count($commentRaitings), 1);
update_post_meta($comment_post_id, 'post_user_raitings', $postData);
update_post_meta($comment_post_id, 'post_user_average', $postAverage);
if(rehub_option('type_total_score')=='average'){
$editorrate = get_post_meta($comment_post_id, 'rehub_review_editor_score', true);
if($editorrate){
$overallupdate = ($editorrate + $postAverage) / 2;
update_post_meta($comment_post_id, 'rehub_review_overall_score', $overallupdate);
}
}
elseif(rehub_option('type_total_score')=='user'){
update_post_meta($comment_post_id, 'rehub_review_overall_score', $postAverage);
}
update_comment_meta($comment_id, 'counted', 1); // Устанавливаем флаг учета значений пользовательской оценки в произвольное поле комментария
}
}
elseif($counted == '') {
update_comment_meta($comment_id, 'counted', 1); // Устанавливаем флаг учета значений пользовательской оценки в произвольное поле комментария
};
}
/* remove coment data on comment remove */
function remove_comment_rates($comment_id) {
$counted = get_comment_meta($comment_id, 'counted', true); // Получаем значение флага учета значений пользовательской оценки в рейтинге
if($counted == 1 || $counted == '') { // Если значения пользовательской оценки не учтены в рейтинге
$comment = get_comment($comment_id); // Получаем объект комментария по идентификатору
$comment_post_id = $comment->comment_post_ID; // Получаем идентификатор комментария из объекта комментария
$postUserRaitingsArray = get_post_meta($comment_post_id, 'post_user_raitings', false); // Получаем массив значений рейтинга из произвольного поля записи
$postUserRaitings = $postUserRaitingsArray[0];
$commentRaitingsArray = get_comment_meta($comment_id, 'user_criteria', false); // Получаем массив пользовательских оценок из произвольного поля комментария
$commentRaitings = $commentRaitingsArray[0];
$postData = array(); // Создаем массив хранения данных
$postCriteriaAverage = 0;
if(is_array($commentRaitings)){
for($i = 0; $i < count($commentRaitings); $i++) {
$postData['criteria'][$i]['name'] = $commentRaitings[$i]['name'];
if(isset($postUserRaitings['criteria'][$i])) {
$count = (int) $postUserRaitings['criteria'][$i]['count'] - 1;
$total = (float) $postUserRaitings['criteria'][$i]['value'] - (float) $commentRaitings[$i]['value'];
$postData['criteria'][$i]['count'] = $count;
$postData['criteria'][$i]['value'] = $total;
if ($count =='0') {
$postData['criteria'][$i]['average'] = '';
}
else {
$postData['criteria'][$i]['average'] = bcdiv($total, $count, 1);
}
};
$postCriteriaAverage += (int)$postData['criteria'][$i]['average'];
};
if(isset($commentRaitings) && count($commentRaitings) > 0) {
$postAverage = bcdiv($postCriteriaAverage, count($commentRaitings), 1);
update_post_meta($comment_post_id, 'post_user_raitings', $postData);
update_post_meta($comment_post_id, 'post_user_average', $postAverage);
if(rehub_option('type_total_score')=='average'){
$editorrate = get_post_meta($comment_post_id, 'rehub_review_editor_score', true);
if($editorrate){
$overallupdate = ($editorrate + $postAverage) / 2;
update_post_meta($comment_post_id, 'rehub_review_overall_score', $overallupdate);
}
}
elseif(rehub_option('type_total_score')=='user'){
update_post_meta($comment_post_id, 'rehub_review_overall_score', $postAverage);
}
update_comment_meta($comment_id, 'counted', 0); // Устанавливаем флаг учета значений пользовательской оценки в произвольное поле комментария
}
}
};
};
/* Ability to write new review after deleting comment */
function rehub_rewrite_user_review($comment_id) {
$comment = get_comment($comment_id);
$current_user_id = $comment->user_id; // get user ID
$current_post_id = $comment->comment_post_ID; // get post ID
if($current_user_id) { // if register
$rated_posts_meta = get_user_meta($current_user_id, 'rated_posts', false); // get array of reviewed posts of user
if(($key = array_search($current_post_id, $rated_posts_meta)) !== false) {
unset($rated_posts_meta[$key]);
update_user_meta($current_user_id , 'rated_posts', $rated_posts_meta); // update user meta field
}
}
}
/* function that show review in comment */
if( !function_exists('attach_comment_criteria_raitings') ) {
function attach_comment_criteria_raitings($text='') {
$userCriteria = get_comment_meta(get_comment_ID(), 'user_criteria', true);
$pros_review = get_comment_meta(get_comment_ID(), 'pros_review', true);
$cons_review = get_comment_meta(get_comment_ID(), 'cons_review', true);
$userAverage = get_comment_meta(get_comment_ID(), 'user_average', true);
if(is_array($userCriteria) && !empty($userCriteria)) {
if (rehub_option('color_type_review') == 'simple') {$color_type = ' simple_color';} else {$color_type = ' multi_color';}
$text ='';
if(isset($userAverage) && $userAverage != '' && count($userCriteria) >=2) {
$userAverages = $userAverage * 10;
$userstartitle = $userAverage / 2;
$text .= '
';
};
for($i = 0; $i < count($userCriteria); $i++) {
$value_criteria = $userCriteria[$i]['value'] * 10;
$text .= '
'.$userCriteria[$i]['name'].''.$value_criteria.'
';
};
$text .= '
';
///
$textsec = '';
if(isset($pros_review) && $pros_review != '') {
$pros_reviews = explode(PHP_EOL, $pros_review);
$proscomment = '';
foreach ($pros_reviews as $pros) {
$proscomment .='';
}
$textsec .= '
'.__('+ PROS:', 'rehub-theme').' '.$proscomment.'
';
};
if(isset($cons_review) && $cons_review != '') {
$cons_reviews = explode(PHP_EOL, $cons_review);
$conscomment = '';
foreach ($cons_reviews as $cons) {
$conscomment .='';
}
$textsec .= '
'.__('- CONS:', 'rehub-theme').' '.$conscomment.'
';
};
$textsec .= getCommentLike_re('');
$textsec .= '
';
};
echo ''.$text;
echo ''; comment_text(); echo '
';
echo ''.$textsec;
}
}
// ADD THE COMMENTS META FIELDS TO THE COMMENTS ADMIN PAGE
function rehub_comment_columns( $columns )
{
$columns['my_custom_column'] = esc_html__( 'User review', 'rehub-theme' );
return $columns;
}
add_filter( 'manage_edit-comments_columns', 'rehub_comment_columns' );
function myplugin_comment_column( $column, $comment_ID )
{
if ( 'my_custom_column' == $column ) {
$comment_meta = get_comment_meta($comment_ID);
$userCriteria = get_comment_meta($comment_ID, 'user_criteria', true);
$pros_review = get_comment_meta($comment_ID, 'pros_review', true);
$cons_review = get_comment_meta($comment_ID, 'cons_review', true);
if(isset($pros_review) && $pros_review != '') {
echo ''.__('+ PROS:', 'rehub-theme').' '.$pros_review.'
';
};
if(isset($cons_review) && $cons_review != '') {
echo ''.__('- CONS:', 'rehub-theme').' '.$cons_review.'
';
};
if(is_array($userCriteria) && !empty($userCriteria)) {
for($i = 0; $i < count($userCriteria); $i++) {
echo ''.$userCriteria[$i]['name'].':
'.$userCriteria[$i]['value'].'';
};
};
echo '
';
}
}
add_filter( 'manage_comments_custom_column', 'myplugin_comment_column', 10, 2 );
/* Save Admin Review Comment fields */
function rehub_admin_update_comment( $data, $comment ) {
$comment_id = $data['comment_ID'];
// Remove curent Post rating if it was approved before
if( $comment['comment_approved'] ) {
remove_comment_rates( $comment_id );
}
// Update Review meta
if( isset( $data['pros_review'] ) ) {
update_comment_meta( $comment_id, 'pros_review', sanitize_textarea_field( $data['pros_review'] ) );
}
if( isset( $data['cons_review'] ) ) {
update_comment_meta( $comment_id, 'cons_review', sanitize_textarea_field( $data['cons_review'] ) );
}
if( isset( $data['user_criteria'] ) ) {
update_comment_meta( $comment_id, 'user_criteria', (array) $data['user_criteria'] );
}
if( isset( $data['removerating'] ) ) {
remove_comment_rates($comment_id);
rehub_rewrite_user_review($comment_id);
delete_comment_meta( $comment_id, 'user_criteria');
delete_comment_meta( $comment_id, 'cons_review' );
delete_comment_meta( $comment_id, 'pros_review' );
}else{
// Run update Post rating
if( $data['comment_approved'] ) {
rh_update_post_rating( $comment_id );
}
}
// Return regular value after updating
return $data;
}
add_filter( 'wp_update_comment_data', 'rehub_admin_update_comment', 10, 2 );
/* Render meta box with Review fields */
if( !function_exists('rh_review_inner_custom_box') ) {
function rh_review_inner_custom_box( $comment ) {
if ( !isset( $comment->comment_ID ) ) return;
if ( !isset( $comment->comment_post_ID ) ) return;
$reviewScore = get_post_meta( $comment->comment_post_ID, 'rehub_review_overall_score', true );
if ($reviewScore && (int)$reviewScore > 0) {
$userCriteria = get_comment_meta( $comment->comment_ID, 'user_criteria', true );
$pros_review = get_comment_meta( $comment->comment_ID, 'pros_review', true );
$cons_review = get_comment_meta( $comment->comment_ID, 'cons_review', true );
$prosconsRow = $criteriaRow = '';
if( !empty($pros_review) || !empty($cons_review) ) {
$prosconsRow .= '
|
|
';
}
if( is_array($userCriteria) && !empty($userCriteria) ) {
$criteriaRow = '
';
for( $i = 0; $i < count($userCriteria); $i++ ) {
$criteriaRow .= ' ';
$criteriaRow .= '';
$criteriaRow .= ' | ';
$criteriaRow .= (is_int(($i+1)/4)) ? '
' : '';
}
$criteriaRow .= '
';
}
if(!empty($userCriteria) || !empty($pros_review) || !empty($cons_review)){
echo '
';
}
}
}
}
/* Update Total score of the Post and the Comment */
if( !function_exists('rh_update_post_rating') ) {
function rh_update_post_rating( $comment_id ) {
$comment = get_comment( $comment_id );
$comment_id = $comment->comment_ID;
$comment_post_id = $comment->comment_post_ID;
$postUserRaitingsArray = get_post_meta($comment_post_id, 'post_user_raitings', false);
$postUserRaitings = $postUserRaitingsArray[0];
$commentRaitingsArray = get_comment_meta($comment_id, 'user_criteria', false);
$commentRaitings = $commentRaitingsArray[0];
$postData = array();
$postCriteriaAverage = $commentTotal = 0;
if( isset($commentRaitings) && count($commentRaitings) > 0 ) {
for($i = 0; $i < count($commentRaitings); $i++) {
$postData['criteria'][$i]['name'] = $commentRaitings[$i]['name'];
if(isset($postUserRaitings['criteria'][$i])) {
$count = (int) $postUserRaitings['criteria'][$i]['count'] + 1;
$total = (float) $commentRaitings[$i]['value'] + (float) $postUserRaitings['criteria'][$i]['value'];
$postData['criteria'][$i]['count'] = $count;
$postData['criteria'][$i]['value'] = $total;
$postData['criteria'][$i]['average'] = bcdiv($total, $count, 1);
}
else {
$postData['criteria'][$i]['count'] = 1;
$postData['criteria'][$i]['value'] = (float) $commentRaitings[$i]['value'];
$postData['criteria'][$i]['average'] = (float) $commentRaitings[$i]['value'];
};
$postCriteriaAverage += (float)$postData['criteria'][$i]['average'];
$commentTotal += (float)$commentRaitings[$i]['value'];
};
$postAverage = bcdiv($postCriteriaAverage, count($commentRaitings), 1);
$commentAverage = bcdiv($commentTotal, count($commentRaitings), 1);
update_post_meta($comment_post_id, 'post_user_raitings', $postData);
update_post_meta($comment_post_id, 'post_user_average', $postAverage);
update_comment_meta($comment_id, 'user_average', $commentAverage);
update_comment_meta($comment_id, 'counted', 1);
if(rehub_option('type_total_score')=='average'){
$editorrate = get_post_meta($comment_post_id, 'rehub_review_editor_score', true);
if($editorrate){
$overallupdate = ($editorrate + $postAverage) / 2;
update_post_meta($comment_post_id, 'rehub_review_overall_score', $overallupdate);
}
}
elseif(rehub_option('type_total_score')=='user'){
update_post_meta($comment_post_id, 'rehub_review_overall_score', $postAverage);
}
}
}
}
?>