/*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 = '
'; for($i = 0; $i < count($reviewCriteria); $i++) { $criteriaNamesArray[$i] = $reviewCriteria[$i]['review_post_name']; $criteriaInputs .= ''; $criteriaInputs .= '
'; }; $criteriaInputs .= '
'.__('Your total score','rehub-theme').'
'; $criteriaInputs .= '

'; $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 .= '
'.$userstartitle.'
'; }; 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 .=''.$pros.''; } $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 .=''.$cons.''; } $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 '
', '', '', $prosconsRow, $criteriaRow, '


', '
'; } } } } /* 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); } } } } ?>