' . $html . wp_review_show_total(false, 'wp-review-on-thumbnail') . '';
}
return $html;
}
}
/**
* Get the meta box data.
* Replaced by wp_review_get_review_box() in v2.0
*
* @since 1.0
*
*/
function wp_review_get_data( $post_id = null ) {
return wp_review_get_review_box( $post_id );
}
function wp_review_inject_data( $content ) {
global $post;
$options = get_option('wp_review_options');
$custom_location = get_post_meta( $post->ID, 'wp_review_custom_location', true );
$location = get_post_meta( $post->ID, 'wp_review_location', true );
if (!$custom_location && !empty($options['review_location'])) {
$location = $options['review_location'];
}
$location = apply_filters('wp_review_location', $location, $post->ID);
if ( empty($location) || $location == 'custom' || ! is_main_query() || ! in_the_loop() || ! is_singular() ) {
return $content;
}
$review = wp_review_get_review_box();
if ( 'bottom' == $location ) {
global $multipage, $numpages, $page;
if( $multipage ) {
if ($page == $numpages) {
return $content .= $review;
} else {
return $content;
}
} else {
return $content .= $review;
}
} elseif ( 'top' == $location ) {
return $review .= $content;
} else {
return $content;
}
}
/**
* Retrieve only total rating.
* To be used on archive pages, etc.
*
* @since 1.0
*
*/
function wp_review_show_total($echo = true, $class = 'review-total-only', $post_id = null, $args = array()) {
global $post, $wp_review_rating_types;
if (empty($post_id))
$post_id = $post->ID;
$type = wp_review_get_post_review_type( $post_id );
$user_type = wp_review_get_post_user_review_type( $post_id );
if ( ! $type && ! $user_type )
return '';
wp_enqueue_style( 'wp_review-style' );
$options = get_option('wp_review_options');
$show_on_thumbnails_type = isset( $options['show_on_thumbnails_type'] ) ? $options['show_on_thumbnails_type'] : 'author';
$show_on_thumbnails_type = apply_filters( 'wp_review_thumbnails_total', $show_on_thumbnails_type, $post_id, $args );// will override option
$rating = $total = '';
switch ( $show_on_thumbnails_type ) {
case 'author':
$total = get_post_meta( $post_id, 'wp_review_total', true );
if ( $type == 'point' || $type == 'percentage' ) {
$rating = sprintf( $wp_review_rating_types[$type]['value_text'], $total );
} else {
$rating = wp_review_rating( $total, $post_id );
}
break;
case 'visitors':
$total = get_post_meta( $post_id, 'wp_review_user_reviews', true );
if ( $user_type == 'point' || $user_type == 'percentage' ) {
$rating = sprintf( $wp_review_rating_types[$user_type]['value_text'], $total );
} else {
$rating = wp_review_user_rating( $post_id );
}
break;
}
$review = '';
if ( !empty( $rating ) && !empty( $total ) ) {
$review .= '
';
$review .= $rating;
$review .= '
';
}
$review = apply_filters( 'wp_review_show_total', $review, $post_id, $type, $total );
$review = apply_filters( 'wp_review_total_output', $review, $post_id, $type, $total, $class, $args );
if ($echo)
echo $review;
else
return $review;
}
function wp_review_total_shortcode($atts, $content) {
if (empty($atts['class']))
$atts['class'] = 'review-total-only review-total-shortcode';
if (empty($atts['id']))
$atts['id'] = null;
$output = wp_review_show_total( false, $atts['class'], $atts['id'], array( 'shortcode' => true ) );
return apply_filters( 'wp_review_total_shortcode', $output, $atts );
}
function wp_review_shortcode( $atts, $content = "") {
if (empty($atts['id']))
$atts['id'] = null;
$output = wp_review_get_data($atts['id']);
return apply_filters( 'wp_review_shortcode', $output, $atts );
}
function wp_review_visitor_rating_shortcode( $atts, $content = "" ) {
wp_enqueue_style( 'wp_review-style' );
wp_enqueue_script( 'wp_review-js' );
$id = empty( $atts['id'] ) ? get_the_ID() : absint( $atts['id'] );
$text = '';
$text .= wp_review_user_rating( $id );
$text .= '
';
return apply_filters( 'wp_review_visitor_rating_shortcode', $text, $atts );
}
function mts_get_post_reviews( $post_id, $force = false ){
if ( ! $force && ( $post_reviews = get_post_meta( $post_id, 'wp_review_user_reviews', true ) ) && ( $review_count = get_post_meta( $post_id, 'wp_review_review_count', true ) ) ) {
return array( 'rating' => $post_reviews, 'count' => $review_count );
}
if( is_numeric( $post_id ) && $post_id > 0 ){
$comments = get_comments( array(
'post_id' => $post_id,
'type' => WP_REVIEW_COMMENT_TYPE_VISITOR,
'status' => 'approve'
) );
$rating = array_reduce( $comments, 'wpreview_comments_count_callback', 0 );
$count = count( $comments );
$post_reviews = array(
'rating' => $count > 0 ? round( $rating / $count, 2 ) : 0,
'count' => $count,
);
update_post_meta( $post_id, 'wp_review_user_reviews', $post_reviews['rating'] );
update_post_meta( $post_id, 'wp_review_review_count', $post_reviews['count'] );
return $post_reviews;
}
}
function wpreview_comments_count_callback( $carry, $comment ) {
$rating = get_comment_meta( $comment->comment_ID, WP_REVIEW_VISITOR_RATING_METAKEY, true );
$carry += (int) $rating;
return $carry;
}
/**
*Check if user has reviewed this post previously
*
* @param $post_id
* @param $user_id
* @param $ip
* @param string $type
*
* @return bool
*/
function hasPreviousReview( $post_id, $user_id, $ip, $type = 'any' ){
if( is_numeric( $post_id ) && $post_id > 0 ){
$args = array( 'post_id' => $post_id, 'count' => true, 'user_id' => 0 );
set_query_var( 'wp_review_commenttype', $type );
add_filter( 'pre_get_comments', 'wp_review_add_comment_type_to_query' );
if ( $user_id ) {
$args['user_id'] = $user_id;
} else {
set_query_var( 'wp_review_ip', $ip );
add_filter( 'comments_clauses', 'wp_review_filter_comment_by_ip' );
}
$count = intval( get_comments( $args ) );
remove_filter( 'pre_get_comments', 'wp_review_add_comment_type_to_query' );
remove_filter( 'comments_clauses', 'wp_review_filter_comment_by_ip' );
return $count > 0;
}
return false;
}
/**
* Add the comment type to comment query.
*
* @param WP_Comment_Query $query
*
* @return WP_Comment_Query
*/
function wp_review_add_comment_type_to_query( \WP_Comment_Query $query ) {
$commenttype = get_query_var( 'wp_review_commenttype' );
if ( 'any' === $commenttype ) {
$query->query_vars['type__in'] = array( WP_REVIEW_COMMENT_TYPE_VISITOR );
} else {
$query->query_vars['type'] = $commenttype;
}
return $query;
}
/**
* Add a conditional to filter the comment query by IP.
*
* @param array $clauses
*
* @return array
*/
function wp_review_filter_comment_by_ip( array $clauses ) {
global $wpdb;
$clauses['where'] .= $wpdb->prepare( ' AND comment_author_IP = %s', get_query_var( 'wp_review_ip' ) );
return $clauses;
}
function getPreviousReview( $post_id, $user_id, $ip, $type = 'any' ) {
if( is_numeric( $post_id ) && $post_id > 0 ){
$args = array( 'post_id' => $post_id, 'user_id' => 0 );
set_query_var( 'wp_review_commenttype', $type );
add_filter( 'pre_get_comments', 'wp_review_add_comment_type_to_query' );
if ( $user_id ) {
$args['user_id'] = array( $user_id );
} else {
set_query_var( 'wp_review_ip', $ip );
add_filter( 'comments_clauses', 'wp_review_filter_comment_by_ip' );
}
$comment = get_comments( $args );
remove_filter( 'pre_get_comments', 'wp_review_add_comment_type_to_query' );
remove_filter( 'comments_clauses', 'wp_review_filter_comment_by_ip' );
if ( ! empty( $comment ) ) {
return get_comment_meta( $comment[0]->comment_ID, WP_REVIEW_COMMENT_RATING_METAKEY, true );
}
}
return false;
}
/**
* AJAX User review rating
* Replaces mts_review_get_review()
* @return null
*/
function wp_review_ajax_rate() {
global $wp_review_rating_types;
check_ajax_referer( 'wp-review-security', 'nonce' );
$options = get_option('wp_review_options');
$post_id = intval($_POST['post_id']);
$user_id = is_user_logged_in() ? get_current_user_id() : 0;
$review = round( abs( filter_input( INPUT_POST, 'review' ) ), 2 );
$type = wp_review_get_post_user_review_type( $post_id );
$uip = wp_review_get_user_ip();
$output = array('status' => '', 'html' => '', 'rating_total' => '', 'rating_count' => '');
if ( empty( $type ) ) {
// No user reviews allowed
echo wp_json_encode( $output );
exit;
}
add_action( 'comment_duplicate_trigger', function ( $commentdata ) {
$post_reviews = mts_get_post_reviews( $commentdata['comment_post_ID'] );
$output['status'] = 'fail';
$output['error'] = 'duplicate';
$output['rating_total'] = $post_reviews['rating'];
$output['rating_count'] = $post_reviews['count'];
$output['html'] = wp_review_rating( $post_reviews['rating'], $commentdata['comment_post_ID'], array( 'user_rating' => true ) );
echo wp_json_encode( $output );
exit;
} );
// don't allow higher rating than max
if ($review > $wp_review_rating_types[$type]['max']) {
$review = $wp_review_rating_types[$type]['max'];
}
if ( $review > 0 &&
! hasPreviousReview( $post_id, $user_id, $uip, WP_REVIEW_COMMENT_TYPE_VISITOR ) &&
(
( is_user_logged_in() && ! empty( $options['registered_only'] ) ) ||
( is_user_logged_in() && empty( $options['registered_only'] ) ) ||
( ! is_user_logged_in() && empty( $options['registered_only'] ) )
)
) {
if ( $insert = wp_insert_comment( array(
'user_id' => $user_id,
'comment_type' => WP_REVIEW_COMMENT_TYPE_VISITOR,
'comment_post_ID' => $post_id,
'comment_parent' => 0,
'comment_author_IP' => $uip,
'comment_content' => sprintf( __('Visitor Rating: %s', 'wp-review'), sprintf( $wp_review_rating_types[$type]['value_text'], $review ) ),
'comment_agent' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT']: '',
'comment_date' => current_time('mysql'),
'comment_date_gmt' => current_time( 'mysql', 1 ),
'comment_approved' => 1
) ) ) {
if ( update_comment_meta( $insert, WP_REVIEW_VISITOR_RATING_METAKEY, $review ) ) {
$post_reviews = mts_get_post_reviews( $post_id, true );
// "lock" user review type when the first rating comes in
// to prevent issues with changing types
// update_post_meta( $post_id, 'wp_review_user_review_type_locked', 1 );
//echo $post_reviews['rating'] . '|' . $post_reviews['count'];
$output['status'] = 'ok';
$output['html'] = wp_review_rating( $post_reviews['rating'], $post_id, array( 'user_rating' => true ) );
$output['rating_total'] = $post_reviews['rating'];
$output['rating_count'] = $post_reviews['count'];
echo wp_json_encode( $output );
exit;
} else {
wp_delete_comment( $insert );
}
}
}
$post_reviews = mts_get_post_reviews( $post_id );
$output['status'] = 'fail';
$output['error'] = 'db_error';
$output['rating_total'] = $post_reviews['rating'];
$output['rating_count'] = $post_reviews['count'];
$output['html'] = wp_review_rating( $post_reviews['rating'], $post_id, array( 'user_rating' => true ) );
echo wp_json_encode( $output );
exit;
}
/*
* Get review with Ajax
*/
function mts_review_get_review() {
// security
check_ajax_referer( 'wp-review-security', 'nonce' );
$options = get_option('wp_review_options');
$post_id = intval($_POST['post_id']);
$user_id = is_user_logged_in() ? get_current_user_id() : 0;
$review = round( abs( filter_input( INPUT_POST, 'review' ) ), 2 );
$review_text = $review;
$uip = wp_review_get_user_ip();
add_action( 'comment_duplicate_trigger', function () {
echo 'MTS_REVIEW_DUP_ERROR';
exit;
} );
if ( $review > 0 &&
! hasPreviousReview( $post_id, $user_id, $uip, WP_REVIEW_COMMENT_TYPE_VISITOR ) &&
(
( is_user_logged_in() && ! empty( $options['registered_only'] ) ) ||
( is_user_logged_in() && empty( $options['registered_only'] ) ) ||
( ! is_user_logged_in() && empty( $options['registered_only'] ) )
)
) {
if ( $insert = wp_insert_comment( array(
'user_id' => $user_id,
'comment_type' => WP_REVIEW_COMMENT_TYPE_VISITOR,
'comment_post_ID' => $post_id,
'comment_parent' => 0,
'comment_author_IP' => $uip,
'comment_content' => sprintf(__('Visitor Rating: %s', 'wp-review'), $review_text),
'comment_agent' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT']: '',
'comment_date' => current_time('mysql'),
'comment_date_gmt' => current_time( 'mysql', 1 ),
'comment_approved' => 1
) ) ) {
if ( update_comment_meta( $insert, WP_REVIEW_VISITOR_RATING_METAKEY, $review ) ) {
$post_reviews = mts_get_post_reviews( $post_id, true );
echo $post_reviews['rating'] . '|' . $post_reviews['count'];
exit;
} else {
wp_delete_comment( $insert );
}
}
}
echo 'MTS_REVIEW_DB_ERROR';
exit;
}
function wp_review_theme_defaults($new_options, $force_change = false) {
global $pagenow;
$opt_name = 'wp_review_options_'.wp_get_theme();
$options = get_option('wp_review_options');
if (empty($options)) $options = array();
$options_updated = get_option( $opt_name );
// if the theme was just activated OR options weren't updated yet
if ( empty( $options_updated ) || $options_updated != $new_options || $force_change || ( isset( $_GET['activated'] ) && $pagenow == 'themes.php' )) {
update_option( 'wp_review_options', array_merge($options, $new_options) );
update_option( $opt_name, $new_options );
}
}
/**
* Exclude review-type comments from being included in the comment query.
*
* @param WP_Comment_Query $query
*/
function wp_review_exclude_review_comments(\WP_Comment_Query $query) {
if ( ! is_admin() && ( WP_REVIEW_COMMENT_TYPE_VISITOR !== $query->query_vars['type'] && ! in_array( WP_REVIEW_COMMENT_TYPE_VISITOR, (array) $query->query_vars['type__in'] )) ) {
$query->query_vars['type__not_in'] = array_merge(
is_array( $query->query_vars['type__not_in'] ) ? $query->query_vars['type__not_in'] : array(),
array( WP_REVIEW_COMMENT_TYPE_VISITOR )
);
}
}
add_action( 'pre_get_comments', 'wp_review_exclude_review_comments', 15 );
/**
* Add "Reviews" to comments table view.
*
* @param array $comment_types
*
* @return mixed
*/
function wp_review_add_to_comment_table_dropdown( $comment_types ) {
$comment_types[ WP_REVIEW_COMMENT_TYPE_VISITOR ] = __( 'Visitor Reviews', 'wp-review' );
return $comment_types;
}
add_filter( 'admin_comment_types_dropdown', 'wp_review_add_to_comment_table_dropdown' );
/**
* @param int $post_id
*
* @return string
*
* 0 - Disabled
* 2 - Visitor Rating Only
*/
function wp_review_get_user_rating_setup( $post_id ) {
/* Retrieve an existing value from the database. */
$options = get_option( 'wp_review_options' );
//$default = empty( $options['default_user_review_type'] ) ? WP_REVIEW_REVIEW_DISABLED : $options['default_user_review_type'];
$default = WP_REVIEW_REVIEW_DISABLED;
$userReviews = get_post_meta( $post_id, 'wp_review_userReview', true );
$enabled = empty( $userReviews ) ? $default : $userReviews;
if ( is_array( $userReviews ) ) {
$enabled = $userReviews[0];
}
// Compatibility with the old option.
if ( '1' === $enabled ) {
$enabled = WP_REVIEW_REVIEW_VISITOR_ONLY;
}
return $enabled;
}
/**
* Exclude visitor ratings when updating a post's comment count.
* @param $post_id
* @param $new
* @param $old
*
* @internal param $comment_id
* @internal param $comment
*/
function wp_review_exclude_visitor_review_count( $post_id, $new, $old ) {
global $wpdb;
$count = get_comments( array(
'type__not_in' => array( WP_REVIEW_COMMENT_TYPE_VISITOR ),
'post_id' => $post_id,
'count' => true
) );
$wpdb->update( $wpdb->posts, array( 'comment_count' => $count ), array( 'ID' => $post_id ) );
// Update user review count.
mts_get_post_reviews( $post_id, true );
clean_post_cache( $post_id );
}
add_action( 'wp_update_comment_count', 'wp_review_exclude_visitor_review_count', 10, 3 );
/**
* Get the schema type of a review.
* @param int $post_id
*
* @return mixed|string
*/
function wp_review_get_review_schema( $post_id ) {
return 'Thing';
}
/**
* Get the IP of the current user.
*
* @return string
*/
function wp_review_get_user_ip() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
/**
* Get the HTML for user reviews in review box.
*
* @param $post_id
* @param bool $votable
* @param bool $force_display
*
* @return string
*/
function wp_review_user_review( $post_id, $votable = true, $force_display = false ) {
$review = '';
if ( $force_display || in_array( wp_review_get_user_rating_setup( $post_id ), array( WP_REVIEW_REVIEW_VISITOR_ONLY ) ) ) {
$allowedClass = 'allowed-to-rate';
$hasNotRatedClass = ' has-not-rated-yet';
$postReviews = mts_get_post_reviews( $post_id );
$userTotal = $postReviews['rating'];
$usersReviewsCount = $postReviews['count'];
$total = get_post_meta( $post_id, 'wp_review_total', true );
$type = get_post_meta( $post_id, 'wp_review_user_review_type', true );
$options = get_option('wp_review_options');
$custom_colors = get_post_meta( $post_id, 'wp_review_custom_colors', true );
$colors['color'] = get_post_meta( $post_id, 'wp_review_color', true );
if( empty($colors['color']) ) $colors['color'] = '#333333';
$colors['type'] = get_post_meta( $post_id, 'wp_review_type', true );
$colors['fontcolor'] = get_post_meta( $post_id, 'wp_review_fontcolor', true );
$colors['bgcolor1'] = get_post_meta( $post_id, 'wp_review_bgcolor1', true );
$colors['bgcolor2'] = get_post_meta( $post_id, 'wp_review_bgcolor2', true );
$colors['bordercolor'] = get_post_meta( $post_id, 'wp_review_bordercolor', true );
if ( ! $custom_colors && ! empty($options['colors'] ) && is_array($options['colors'] ) ) {
$colors = array_merge($colors, $options['colors']);
}
$colors = apply_filters('wp_review_colors', $colors, $post_id);
$color = $colors['color'];
$user_id = '';
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
}
if ( $userTotal == '' ) {
$userTotal = '0.0';
}
$value = $userTotal;
if ( ! $votable || hasPreviousReview( $post_id, $user_id, wp_review_get_user_ip(), WP_REVIEW_COMMENT_TYPE_VISITOR ) || ( ! is_user_logged_in() && ! empty( $options['registered_only'] ) ) ) {
$hasNotRatedClass = '';
}
$class = $allowedClass . $hasNotRatedClass;
$template = mts_get_template_path( $type, 'star-output' );
set_query_var( 'rating', compact( 'value', 'usersReviewsCount', 'user_id', 'class', 'post_id', 'color', 'colors' ) );
ob_start();
load_template( $template, false );
$review = ob_get_contents();
ob_end_clean();
if ( $userTotal !== '0.0' && $total === '' ) {// dont'show if no user ratings and there is review
$review .= '
';
}
}
return $review;
}
/**
* Get available review types/templates.
*
* @param string $type
*
* @return array
*/
/*
function wp_review_get_review_types( $type = '' ) {
$dirs = array(
WP_REVIEW_DIR . 'templates/',
get_stylesheet_directory() . '/wp-review/',
);
$types = array();
foreach ( $dirs as $dir ) {
if ( is_dir( $dir ) ) {
$handle = opendir( $dir );
while ( $file = readdir( $handle ) ) {
if ( '..' === $file || '.' === $file ) {
continue;
}
$key = basename( $file, '.php' );
if ( ! empty( $type ) && substr( $key, -strlen( $type ) ) !== $type ) {
continue;
}
if ( empty( $type ) and strpos( $key, '-' ) !== false ) {
continue;
}
$template_data = implode( '', file( $dir . $file ) );
if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) ) {
$types[ $key ] = $name[1];
} else {
$keys_arr = explode( '-', $key );
$types[ $key ] = ucfirst( reset( $keys_arr ) );
}
}
}
}
return $types;
}
*/
/**
* Get the path to a template prioritizing theme directory first.
*
* @param $type
* @param string $default
*
* @return string
*/
function mts_get_template_path( $type, $default = 'star' ) {
$template = get_stylesheet_directory() . '/wp-review/' . $type . '.php';
// Template does not exist on theme dir, use plugin dir.
if ( ! file_exists( $template ) ) {
$template = WP_REVIEW_DIR . 'rating-types/' . $type . '.php';
}
// Template does not exist, fallback to star.
if ( ! file_exists( $template ) ) {
$template = WP_REVIEW_DIR . 'rating-types/' . $default . '.php';
}
return $template;
}
function wp_review_ajax_migrate_ratings() {
$start = isset( $_POST['start'] ) ? intval( $_POST['start'] ) : 0;
$limit = 100;
if ( get_option( 'wp_review_has_migrated', false ) ) {
return;
}
global $wpdb;
$current_blog_id = get_current_blog_id();
$query = $wpdb->get_results( 'SELECT * from '.$wpdb->base_prefix.'mts_wp_reviews WHERE blog_id = '.$current_blog_id.' LIMIT '.$limit.' OFFSET '.$start );
foreach ( $query as $review ) {
if ($review->rate == 0)
continue; // skip 0-star ratings
if ( $insert = wp_insert_comment( array(
'user_id' => $review->user_id,
'comment_type' => WP_REVIEW_COMMENT_TYPE_VISITOR,
'comment_post_ID' => $review->post_id,
'comment_parent' => 0,
'comment_content' => sprintf(__('Visitor Rating: %s', 'wp-review'), sprintf( __( '%s Stars' , 'wp-review' ), $review->rate ) ),
'comment_author_IP' => $review->user_ip,
'comment_date' => gmdate( 'Y-m-d H:i:s', ( strtotime( $review->date ) + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) ),
'comment_date_gmt' => gmdate( 'Y-m-d H:i:s', strtotime( $review->date ) ),
'comment_approved' => 1
) ) ) {
if ( update_comment_meta( $insert, WP_REVIEW_VISITOR_RATING_METAKEY, $review->rate ) ) {
// Purge cache.
mts_get_post_reviews( $review->post_id, true );
} else {
wp_delete_comment( $insert );
}
}
}
$end = $start + count($query);//$wpdb->num_rows;
//$migrated_rows = get_option( 'wp_review_migrated_rows', 0 );
update_option( 'wp_review_migrated_rows', $end );
$total_rows = $wpdb->get_var( 'SELECT COUNT(*) FROM '.$wpdb->base_prefix.'mts_wp_reviews WHERE blog_id = '.$current_blog_id );
$migration_finished = 0;
if ( $total_rows == $end ) {
update_option( 'wp_review_has_migrated', 1 );
$migration_finished = 1;
}
echo wp_json_encode( array( 'start' => $start, 'lastrow' => $end, 'rowsleft' => $total_rows - $end, 'finished' => $migration_finished ) );
die();
}
/*
* Custom Rating Types
*
*/
$wp_review_rating_types = array();
function wp_review_register_rating_type( $rating_type, $args ) {
global $wp_review_rating_types;
if (empty($args['output_template']) && empty($args['template']))
return false;
// If it has combined 'template'
// or 'input_template' (for user rating)
if (!empty($args['template']) || !empty($args['input_template']))
$args['user_rating'] = true;
else
$args['user_rating'] = false;
$wp_review_rating_types[$rating_type] = $args;
return true;
}
add_action( 'init', 'wp_review_register_default_rating_types' );
function wp_review_register_default_rating_types() {
wp_review_register_rating_type( 'star', array(
'label' => __('Star', 'wp-review'),
'max' => 5,
'decimals' => 1,
'value_text' => __('%s Stars', 'wp-review'),
'value_text_singular' => __('%s Star', 'wp-review'),
'input_template' => WP_REVIEW_DIR . 'rating-types/star-input.php',
'output_template' => WP_REVIEW_DIR . 'rating-types/star-output.php',
) );
wp_review_register_rating_type( 'point', array(
'label' => __('Point', 'wp-review'),
'max' => 10,
'decimals' => 1,
'value_text' => __('%s/10', 'wp-review'),
'value_text_singular' => __('%s/10', 'wp-review'),
'input_template' => WP_REVIEW_DIR . 'rating-types/point-input.php',
'output_template' => WP_REVIEW_DIR . 'rating-types/point-output.php',
) );
wp_review_register_rating_type( 'percentage', array(
'label' => __('Percentage', 'wp-review'),
'max' => 100,
'decimals' => 0,
'value_text' => __('%s%%', 'wp-review'),
'value_text_singular' => __('%s%%', 'wp-review'),
'input_template' => WP_REVIEW_DIR . 'rating-types/percentage-input.php',
'output_template' => WP_REVIEW_DIR . 'rating-types/percentage-output.php',
) );
}
function wp_review_get_post_review_type( $post_id = null ) {
global $post, $wp_review_rating_types;
if ( empty( $post_id ) ) {
if ( is_a( $post, 'WP_Post') )
$post_id = $post->ID;
else
return '';
}
$type = get_post_meta( $post_id, 'wp_review_type', true );
if ( empty( $type ) )
return ''; // not a review
$output = '';
if ( isset( $wp_review_rating_types[$type] ) )
$output = $type;
else
$output = 'star'; // fallback if specific $type is not available anymore
return apply_filters( 'wp_review_get_review_type', $output, $post_id );
}
function wp_review_get_post_user_review_type( $post_id = null ) {
global $post, $wp_review_rating_types;
if ( empty( $post_id ) )
$post_id = $post->ID;
$type = wp_review_get_post_review_type( $post_id );
if ( empty( $type ) )
return ''; // not a review
$userreview_type = get_post_meta( $post_id, 'wp_review_user_review_type', true );
if ( empty( $userreview_type ) )
$userreview_type = 'star';
$userreviews = in_array( wp_review_get_user_rating_setup( $post_id ), array( WP_REVIEW_REVIEW_VISITOR_ONLY ) );
if ( ! $userreviews )
return ''; // user ratings not enabled
$output = '';
if ( isset( $wp_review_rating_types[$userreview_type] ) && $wp_review_rating_types[$userreview_type]['user_rating'] )
$output = $userreview_type;
else
$output = 'star'; // fallback if specific $type is not available
return apply_filters( 'wp_review_get_user_review_type', $output, $post_id );
}
/*
* Custom Box Templates
*
*/
function wp_review_get_post_box_template( $post_id ) {
global $post, $wp_review_rating_types;
if ( empty( $post_id ) )
$post_id = $post->ID;
$type = wp_review_get_post_review_type( $post_id );
if ( empty( $type ) )
return ''; // not a review
$template = get_post_meta( $post_id, 'wp_review_box_template', true );
if ( empty( $template ) || ! wp_review_locate_box_template( $template ) )
$template = 'default.php'; // fallback to default.php
return apply_filters( 'wp_review_get_box_template', $template, $post_id );
}
function wp_review_locate_box_template( $template_name, $return_full_path = true ) {
// We look for box templates in:
// 1. plugins_dir/box-templates
// 2. theme_dir/wp-review
// 3. childtheme_dir/wp-review
// 4... Use filter to add more
$default_paths = array(
WP_REVIEW_DIR.'box-templates',
get_template_directory().'/wp-review',
get_stylesheet_directory().'/wp-review',
);
$template_paths = apply_filters( 'wp_review_box_template_paths', $default_paths );
$paths = array_reverse($template_paths);
$located = '';
$path_partial = '';
foreach ($paths as $path) {
if (file_exists($full_path = trailingslashit($path).$template_name)) {
$located = $full_path;
$path_partial = $path;
break;
}
}
return ($return_full_path ? $located : $path_partial);
}
/**
* Shows rating using output template
*
* @param mixed $value rating value
* @param mixed $post_id optional post ID
* @return [type] [description]
*/
function wp_review_rating( $value, $post_id = null, $args = array() ) {
global $wp_review_rating_types, $post;
if ( ! empty( $args['user_rating'] ) ) {
$type = wp_review_get_post_user_review_type( $post_id );
} else {
$type = wp_review_get_post_review_type( $post_id );
}
if ( empty( $type ) )
return '';
if (empty($post_id))
$post_id = $post->ID;
$options = get_option('wp_review_options');
$custom_colors = get_post_meta( $post_id, 'wp_review_custom_colors', true );
$colors['color'] = get_post_meta( $post_id, 'wp_review_color', true );
if( empty($colors['color']) ) $colors['color'] = '#333333';
$colors['type'] = get_post_meta( $post_id, 'wp_review_type', true );
$colors['fontcolor'] = get_post_meta( $post_id, 'wp_review_fontcolor', true );
$colors['bgcolor1'] = get_post_meta( $post_id, 'wp_review_bgcolor1', true );
$colors['bgcolor2'] = get_post_meta( $post_id, 'wp_review_bgcolor2', true );
$colors['bordercolor'] = get_post_meta( $post_id, 'wp_review_bordercolor', true );
if ( ! $custom_colors && ! empty($options['colors'] ) && is_array($options['colors'] ) ) {
$colors = array_merge($colors, $options['colors']);
}
$colors = apply_filters('wp_review_colors', $colors, $post_id);
// Override colors if is_admin()
if (is_admin() && !defined('DOING_AJAX')) {
$admin_colors = array(
'color' => '#444444',
'bgcolor1' => '#ffffff',
);
$colors = array_merge($colors, $admin_colors);
}
$color = $colors['color'];
// don't allow higher rating than max
if ($value > $wp_review_rating_types[$type]['max']) {
$value = $wp_review_rating_types[$type]['max'];
}
$template = $wp_review_rating_types[$type]['output_template'];
$comment_rating = false;
set_query_var( 'rating', compact( 'value', 'post_id', 'type', 'args', 'comment_rating', 'color', 'colors' ) );
ob_start();
load_template( $template, false );
$review = ob_get_contents();
ob_end_clean();
return $review;
}
function wp_review_user_rating( $post_id = null, $args = array() ) {
global $wp_review_rating_types;
$type = wp_review_get_post_user_review_type( $post_id );
if ( empty( $type ) )
return '';
$review = '';
$postReviews = mts_get_post_reviews( $post_id );
$value = $postReviews['rating'];
$count = $postReviews['count'];
$total = get_post_meta( $post_id, 'wp_review_total', true );
$user_id = '';
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
}
if ( $value == '' ) {
$value = '0.0';
}
if ( hasPreviousReview( $post_id, $user_id, wp_review_get_user_ip(), WP_REVIEW_COMMENT_TYPE_VISITOR ) || ( ! is_user_logged_in() && ! empty( $options['registered_only'] ) ) ) {
return wp_review_rating( $value, $post_id, array( 'user_rating' => true ) ); // return just output template
}
$options = get_option('wp_review_options');
$custom_colors = get_post_meta( $post_id, 'wp_review_custom_colors', true );
$colors['color'] = get_post_meta( $post_id, 'wp_review_color', true );
if( empty($colors['color']) ) $colors['color'] = '#333333';
$colors['type'] = get_post_meta( $post_id, 'wp_review_type', true );
$colors['fontcolor'] = get_post_meta( $post_id, 'wp_review_fontcolor', true );
$colors['bgcolor1'] = get_post_meta( $post_id, 'wp_review_bgcolor1', true );
$colors['bgcolor2'] = get_post_meta( $post_id, 'wp_review_bgcolor2', true );
$colors['bordercolor'] = get_post_meta( $post_id, 'wp_review_bordercolor', true );
if ( ! $custom_colors && ! empty($options['colors'] ) && is_array($options['colors'] ) ) {
$colors = array_merge($colors, $options['colors']);
}
$colors = apply_filters('wp_review_colors', $colors, $post_id);
$color = $colors['color'];
$rating_type_template = $wp_review_rating_types[$type]['input_template'];
$comment_rating = false;
set_query_var( 'rating', compact( 'value', 'post_id', 'comment_rating', 'args', 'color', 'colors' ) );
ob_start();
load_template( $rating_type_template, false );
$review = ''.ob_get_contents().'
';
ob_end_clean();
if ( $value !== '0.0' && $total === '' ) {// dont'show if no user ratings and there is review
$review .= '
';
}
return $review;
}
/**
* Returns WP Review box html using the box template chosen for the review
* Replaces wp_review_get_data()
*
* @param [type] $post_id [description]
* @return [type] [description]
*/
function wp_review_get_review_box( $post_id = null ) {
global $post;
if (empty($post_id))
$post_id = $post->ID;
$type = wp_review_get_post_review_type( $post_id );
if ( ! $type )
return '';
// Load variables
$options = get_option('wp_review_options');
/* Retrieve the meta box data. */
$heading = get_post_meta( $post_id, 'wp_review_heading', true );
$desc_title = get_post_meta( $post_id, 'wp_review_desc_title', true );
if ( ! $desc_title ) $desc_title = __('Summary', 'wp-review');
$desc = get_post_meta( $post_id, 'wp_review_desc', true );
$items = get_post_meta( $post_id, 'wp_review_item', true );
$type = get_post_meta( $post_id, 'wp_review_type', true );
$total = get_post_meta( $post_id, 'wp_review_total', true );
$hide_desc = get_post_meta( $post_id, 'wp_review_hide_desc', true );
$schema = wp_review_get_review_schema( $post_id );
$links = get_post_meta( $post_id, 'wp_review_links', true );
$custom_author = get_post_meta( $post_id, 'wp_review_custom_author', true );
$author_field = get_post_meta( $post_id, 'wp_review_author', true );
$author = ( !$author_field || empty( $author_field ) || !$custom_author ) ? get_the_author() : $author_field;
$add_backlink = ! empty( $options['add_backlink'] ) ? true : false;
$colors = array();
$colors['custom_colors'] = get_post_meta( $post_id, 'wp_review_custom_colors', true );
$colors['custom_location'] = get_post_meta( $post_id, 'wp_review_custom_location', true );
$colors['custom_width'] = get_post_meta( $post_id, 'wp_review_custom_width', true );
$colors['color'] = get_post_meta( $post_id, 'wp_review_color', true );
if( empty($colors['color']) ) $colors['color'] = '#333333';
$colors['type'] = get_post_meta( $post_id, 'wp_review_type', true );
$colors['fontcolor'] = get_post_meta( $post_id, 'wp_review_fontcolor', true );
$colors['bgcolor1'] = get_post_meta( $post_id, 'wp_review_bgcolor1', true );
$colors['bgcolor2'] = get_post_meta( $post_id, 'wp_review_bgcolor2', true );
$colors['bordercolor'] = get_post_meta( $post_id, 'wp_review_bordercolor', true );
$colors['total'] = get_post_meta( $post_id, 'wp_review_total', true );
if ( ! $colors['custom_colors'] && ! empty($options['colors'] ) && is_array($options['colors'] ) ) {
$colors = array_merge($colors, $options['colors']);
}
$colors = apply_filters('wp_review_colors', $colors, $post_id);
$width = get_post_meta( $post_id, 'wp_review_width', true );
if (empty($width)) $width = 100;
$align = get_post_meta( $post_id, 'wp_review_align', true );
if (empty($align)) $align = 'left';
if (!$colors['custom_width']) {
$width = ! empty($options['width']) ? $options['width'] : 100;
$align = ! empty($options['align']) ? $options['align'] : 'left';
}
$post_types = get_post_types( array('public' => true), 'names' );
$excluded_post_types = apply_filters('wp_review_excluded_post_types', array('attachment'));
$allowed_post_types = array_diff($post_types, $excluded_post_types);
$user_review = in_array( wp_review_get_user_rating_setup( $post_id ), array( WP_REVIEW_REVIEW_VISITOR_ONLY ) );
$user_review_type = '';
$user_review_total = '';
$user_review_count = 0;
$user_has_reviewed = false;
if ( $user_review ) {
$user_review_type = wp_review_get_post_user_review_type( $post_id );
}
if ( $user_review ) {
$postReviews = mts_get_post_reviews( $post_id );
$user_review_total = $postReviews['rating'];
$user_review_count = $postReviews['count'];
$user_id = is_user_logged_in() ? get_current_user_id() : 0;
$uip = wp_review_get_user_ip();
if ( hasPreviousReview( $post_id, $user_id, $uip, WP_REVIEW_COMMENT_TYPE_VISITOR ) )
$user_has_reviewed = true;
}
$template = wp_review_get_post_box_template( $post_id );
$box_template_path = wp_review_locate_box_template( $template );
// pass variables to template
set_query_var( 'review', compact(
'post_id',
'type',
'heading',
'author',
'items',
'hide_desc',
'desc',
'desc_title',
'total',
'colors',
'width',
'align',
'schema',
'links',
'user_review',
'user_review_type',
'user_review_total',
'user_review_count',
'user_has_reviewed',
'add_backlink'
) );
ob_start();
load_template( $box_template_path, false );
$review = ob_get_contents();
ob_end_clean();
$review = apply_filters('wp_review_get_data', $review, $post_id, $type, $total, $items);
return $review;// . wp_review_color_output( $post_id ); // add color CSS to output
}
function wp_review_get_box_template_info( $template = false ) {
$default_template_headers = array(
'Name' => 'WP Review',
'TemplateURI' => 'Template URI',
'Version' => 'Version',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI'
);
if ( ! $template )
$template = wp_review_get_post_box_template();
$path = wp_review_locate_box_template( $template );
if ( $path )
return get_file_data( $path, $default_template_headers );
else
return array( $default_template_headers );
}
/**
* Returns absolute path to template directory.
* @return string path
*/
function wp_review_get_box_template_directory() {
$template = wp_review_get_post_box_template();
if ( ! $template )
return '';
$current_template_directory = wp_review_locate_box_template( $template );
return dirname($current_template_directory);
}
/**
* Returns template directory URI. To be used in template file.
* @return string path
*/
function wp_review_get_box_template_directory_uri() {
// let's hope this will work in most cases
return get_bloginfo( 'url' ).'/'.str_replace(ABSPATH, '', wp_review_get_box_template_directory());
}
function wp_review_get_box_templates_list() {
$default_paths = array(
WP_REVIEW_DIR.'box-templates',
get_template_directory().'/wp-review',
get_stylesheet_directory().'/wp-review',
);
$paths = apply_filters( 'wp_review_box_template_paths', $default_paths );
$templates = array();
foreach ($paths as $path) {
$path = trailingslashit( $path );
// Look for files containing our header 'Launcher template'
$files = (array) wp_review_scandir( $path, 'php', 2 );
foreach ( $files as $file => $full_path ) {//echo '
'.$file.' - '.$full_path;
if ( ! $full_path || ! preg_match( '|WP Review:(.*)$|mi', file_get_contents( $full_path ), $header ) )
continue;
$templates[ $file ] = wp_review_get_box_template_info( $file );
$templates[ $file ]['path'] = $path;
}
}
return $templates;
}
function wp_review_get_rating_types() {
global $wp_review_rating_types;
return $wp_review_rating_types;
}
function wp_review_scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) {
if ( ! is_dir( $path ) )
return false;
if ( $extensions ) {
$extensions = (array) $extensions;
$_extensions = implode( '|', $extensions );
}
$relative_path = trailingslashit( $relative_path );
if ( '/' == $relative_path )
$relative_path = '';
$results = scandir( $path );
$files = array();
foreach ( $results as $result ) {
if ( '.' == $result[0] )
continue;
if ( is_dir( $path . '/' . $result ) ) {
if ( ! $depth || 'CVS' == $result )
continue;
$found = wp_review_scandir( $path . '/' . $result, $extensions, $depth - 1 , $relative_path . $result );
$files = array_merge_recursive( $files, $found );
} elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) {
$files[ $relative_path . $result ] = $path . '/' . $result;
}
}
return $files;
}
add_action( 'init', 'wp_review_add_admin_columns' );
function wp_review_add_admin_columns() {
$post_types = get_post_types( array('public' => true), 'names' );
$excluded_post_types = apply_filters('wp_review_excluded_post_types', array('attachment'));
$allowed_post_types = array_diff($post_types, $excluded_post_types);
foreach ($allowed_post_types as $key => $value) {
// Add post list table column
add_filter('manage_'.$value.'_posts_columns', 'wp_review_post_list_column');
// Post list table column content
add_action('manage_'.$value.'_posts_custom_column', 'wp_review_post_list_column_content', 10, 2);
}
}
function wp_review_post_list_column($defaults) {
$defaults['wp_review_rating'] = __('Rating', 'wp-review');
return $defaults;
}
function wp_review_post_list_column_content($column_name, $post_ID) {
if ($column_name == 'wp_review_rating') {
$total = get_post_meta( $post_ID, 'wp_review_total', true );
if ( $total )
echo wp_review_rating($total, $post_ID);
else
echo ''.__( 'No Rating', 'wp-review' ).'';
}
}
function wp_review_get_backlink() {
$backlink_text = ''.sprintf(__('Powered by %s', 'wp-review'), ''.__('WP Review', 'wp-review').'').'';
return $backlink_text;
}
// Notice about migrating ratings
add_action( 'admin_notices', 'wp_review_migrate_notice' );
add_action('admin_init', 'wp_review_migrate_notice_ignore');
function wp_review_migrate_notice_ignore() {
global $current_user;
$user_id = $current_user->ID;
/* If user clicks to ignore the notice, add that to their user meta */
if ( isset($_GET['wp_review_migrate_notice_ignore']) && '1' == $_GET['wp_review_migrate_notice_ignore'] ) {
add_user_meta($user_id, 'wp_review_migrate_notice_ignore', 'true', true);
}
}
function wp_review_migrate_notice() {
// Migrate
global $wpdb, $current_user;
$user_id = $current_user->ID;
if ( get_user_meta($user_id, 'wp_review_migrate_notice_ignore') )
return;
$has_migrated = get_option( 'wp_review_has_migrated', false );
if ($has_migrated)
return;
$current_blog_id = get_current_blog_id();
$total_rows = 0;
$rows_left = 0;
$migrated_rows = get_option( 'wp_review_migrated_rows', 0 );
if ( ! $has_migrated && $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->base_prefix}mts_wp_reviews'") == "{$wpdb->base_prefix}mts_wp_reviews") {
// Table exists and not migrated (fully) yet
$total_rows = $wpdb->get_var( 'SELECT COUNT(*) FROM '.$wpdb->base_prefix.'mts_wp_reviews WHERE blog_id = '.$current_blog_id );
$rows_left = $total_rows - $migrated_rows;
}
if (!$rows_left)
return;
?>
'.__('Settings > WP Review > Migrate Ratings', 'wp-review').''); ?>
ID;
/* Check that the user hasn't already clicked to ignore the message */
/* Only show the notice 2 days after plugin activation */
if ( ! get_user_meta($user_id, 'wp_review_ignore_notice') && time() >= (get_option( 'wp_review_activated', 0 ) + (2 * 24 * 60 * 60)) ) {
echo '';
printf(__('
Create Reviews Easily & Rank Higher In Search Engines - WP Review Pro Plugin
'), '?wp_review_admin_notice_ignore=0');
echo "
";
}
}
add_action('admin_init', 'wp_review_admin_notice_ignore');
function wp_review_admin_notice_ignore() {
global $current_user;
$user_id = $current_user->ID;
/* If user clicks to ignore the notice, add that to their user meta */
if ( isset($_GET['wp_review_admin_notice_ignore']) && '0' == $_GET['wp_review_admin_notice_ignore'] ) {
add_user_meta($user_id, 'wp_review_ignore_notice', 'true', true);
}
}