Ratings in loops for sort by rating
This commit is contained in:
parent
0caca2d401
commit
261f413405
File diff suppressed because one or more lines are too long
|
@ -800,7 +800,7 @@ p.demo_store {
|
|||
}
|
||||
}
|
||||
|
||||
/* Start rating */
|
||||
/* Star rating */
|
||||
.star-rating {
|
||||
float: right;
|
||||
width: 80px;
|
||||
|
@ -815,6 +815,14 @@ p.demo_store {
|
|||
}
|
||||
}
|
||||
|
||||
.products {
|
||||
.star-rating {
|
||||
display: block;
|
||||
margin: 0 0 .5em;
|
||||
float: none;
|
||||
}
|
||||
}
|
||||
|
||||
.hreview-aggregate {
|
||||
.star-rating {
|
||||
margin: 10px 0 0 0;
|
||||
|
|
|
@ -879,25 +879,51 @@ abstract class WC_Product {
|
|||
return '<del>' . ( ( is_numeric( $from ) ) ? woocommerce_price( $from ) : $from ) . '</del> <ins>' . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . '</ins>';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the product rating in html format - ratings are stored in transient cache.
|
||||
* get_average_rating function.
|
||||
*
|
||||
* @access public
|
||||
* @param string $location (default: '')
|
||||
* @return void
|
||||
*/
|
||||
function get_rating_html( $location = '' ) {
|
||||
|
||||
if ( $location )
|
||||
$location = '_' . $location;
|
||||
|
||||
$star_size = apply_filters( 'woocommerce_star_rating_size' . $location, 16 );
|
||||
|
||||
function get_average_rating() {
|
||||
if ( false === ( $average_rating = get_transient( 'wc_average_rating_' . $this->id ) ) ) {
|
||||
|
||||
global $wpdb;
|
||||
|
||||
$average_rating = '';
|
||||
$count = $this->get_rating_count();
|
||||
|
||||
if ( $count > 0 ) {
|
||||
|
||||
$ratings = $wpdb->get_var( $wpdb->prepare("
|
||||
SELECT SUM(meta_value) FROM $wpdb->commentmeta
|
||||
LEFT JOIN $wpdb->comments ON $wpdb->commentmeta.comment_id = $wpdb->comments.comment_ID
|
||||
WHERE meta_key = 'rating'
|
||||
AND comment_post_ID = %d
|
||||
AND comment_approved = '1'
|
||||
", $this->id ) );
|
||||
|
||||
$average_rating = number_format( $ratings / $count, 2 );
|
||||
|
||||
}
|
||||
|
||||
set_transient( 'wc_average_rating_' . $this->id, $average_rating );
|
||||
}
|
||||
|
||||
return $average_rating;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_rating_count function.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function get_rating_count() {
|
||||
if ( false === ( $count = get_transient( 'wc_rating_count_' . $this->id ) ) ) {
|
||||
|
||||
global $wpdb;
|
||||
|
||||
$count = $wpdb->get_var( $wpdb->prepare("
|
||||
SELECT COUNT(meta_value) FROM $wpdb->commentmeta
|
||||
LEFT JOIN $wpdb->comments ON $wpdb->commentmeta.comment_id = $wpdb->comments.comment_ID
|
||||
|
@ -907,26 +933,40 @@ abstract class WC_Product {
|
|||
AND meta_value > 0
|
||||
", $this->id ) );
|
||||
|
||||
$ratings = $wpdb->get_var( $wpdb->prepare("
|
||||
SELECT SUM(meta_value) FROM $wpdb->commentmeta
|
||||
LEFT JOIN $wpdb->comments ON $wpdb->commentmeta.comment_id = $wpdb->comments.comment_ID
|
||||
WHERE meta_key = 'rating'
|
||||
AND comment_post_ID = %d
|
||||
AND comment_approved = '1'
|
||||
", $this->id ) );
|
||||
|
||||
if ( $count > 0 )
|
||||
$average_rating = number_format($ratings / $count, 2);
|
||||
else
|
||||
$average_rating = '';
|
||||
|
||||
set_transient( 'wc_average_rating_' . $this->id, $average_rating );
|
||||
set_transient( 'wc_rating_count_' . $this->id, $count );
|
||||
}
|
||||
|
||||
if ( $average_rating > 0 )
|
||||
return '<div class="star-rating" title="' . sprintf( __( 'Rated %s out of 5', 'woocommerce' ), $average_rating ) . '"><span style="width:' . ( $average_rating * $star_size ) . 'px"><span class="rating">' . $average_rating . '</span> ' . __( 'out of 5', 'woocommerce' ) . '</span></div>';
|
||||
else
|
||||
return '';
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the product rating in html format - ratings are stored in transient cache.
|
||||
*
|
||||
* @access public
|
||||
* @param string $location (default: '')
|
||||
* @return void
|
||||
*/
|
||||
function get_rating_html( $location = '' ) {
|
||||
|
||||
$average_rating = $this->get_average_rating();
|
||||
|
||||
if ( $average_rating > 0 ) {
|
||||
|
||||
if ( $location )
|
||||
$location = '_' . $location;
|
||||
|
||||
$star_size = apply_filters( 'woocommerce_star_rating_size' . $location, 16 );
|
||||
|
||||
$average_rating = $this->get_average_rating();
|
||||
|
||||
$rating_html = '<div class="star-rating" title="' . sprintf( __( 'Rated %s out of 5', 'woocommerce' ), $average_rating ) . '">';
|
||||
|
||||
$rating_html .= '<span style="width:' . ( $average_rating * $star_size ) . 'px"><span class="rating">' . $average_rating . '</span> ' . __( 'out of 5', 'woocommerce' ) . '</span>';
|
||||
|
||||
$rating_html .= '</div>';
|
||||
|
||||
return $rating_html;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
/**
|
||||
* Loop Rating
|
||||
*
|
||||
* @author WooThemes
|
||||
* @package WooCommerce/Templates
|
||||
* @version 2.0.0
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
global $product;
|
||||
|
||||
if ( get_option( 'woocommerce_enable_review_rating' ) == 'no' )
|
||||
return;
|
||||
?>
|
||||
|
||||
<?php if ( $rating_html = $product->get_rating_html() ) : ?>
|
||||
<?php echo $rating_html; ?>
|
||||
<?php endif; ?>
|
|
@ -183,21 +183,6 @@ function woocommerce_nav_menu_items( $items, $args ) {
|
|||
return $items;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update catalog ordering if posted.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function woocommerce_update_catalog_ordering() {
|
||||
global $woocommerce;
|
||||
|
||||
if ( isset( $_REQUEST['sort'] ) && $_REQUEST['sort'] != '' )
|
||||
$woocommerce->session->orderby = esc_attr( $_REQUEST['sort'] );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove from cart/update.
|
||||
*
|
||||
|
@ -1252,12 +1237,16 @@ function woocommerce_products_rss_feed() {
|
|||
* @return void
|
||||
*/
|
||||
function woocommerce_add_comment_rating($comment_id) {
|
||||
if ( isset($_POST['rating']) ) :
|
||||
if ( isset( $_POST['rating'] ) ) {
|
||||
global $post;
|
||||
if ( ! $_POST['rating'] || $_POST['rating'] > 5 || $_POST['rating'] < 0 ) return;
|
||||
|
||||
if ( ! $_POST['rating'] || $_POST['rating'] > 5 || $_POST['rating'] < 0 )
|
||||
return;
|
||||
|
||||
add_comment_meta( $comment_id, 'rating', (int) esc_attr( $_POST['rating'] ), true );
|
||||
|
||||
delete_transient( 'wc_average_rating_' . esc_attr($post->ID) );
|
||||
endif;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -79,6 +79,7 @@ if ( ! is_admin() || defined('DOING_AJAX') ) {
|
|||
add_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
|
||||
add_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );
|
||||
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
|
||||
add_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5 );
|
||||
|
||||
/**
|
||||
* Subcategories
|
||||
|
@ -241,13 +242,6 @@ add_action( 'get_header', 'woocommerce_clear_cart_after_payment' );
|
|||
*/
|
||||
add_filter( 'show_admin_bar', 'woocommerce_disable_admin_bar', 10, 1 );
|
||||
|
||||
/**
|
||||
* Catalog sorting/ordering
|
||||
*
|
||||
* @see woocommerce_update_catalog_ordering()
|
||||
*/
|
||||
add_action( 'init', 'woocommerce_update_catalog_ordering' );
|
||||
|
||||
/**
|
||||
* Cart Actions
|
||||
*
|
||||
|
|
|
@ -352,6 +352,19 @@ if ( ! function_exists( 'woocommerce_template_loop_price' ) ) {
|
|||
woocommerce_get_template( 'loop/price.php' );
|
||||
}
|
||||
}
|
||||
if ( ! function_exists( 'woocommerce_template_loop_rating' ) ) {
|
||||
|
||||
/**
|
||||
* Display the average rating in the loop
|
||||
*
|
||||
* @access public
|
||||
* @subpackage Loop
|
||||
* @return void
|
||||
*/
|
||||
function woocommerce_template_loop_rating() {
|
||||
woocommerce_get_template( 'loop/rating.php' );
|
||||
}
|
||||
}
|
||||
if ( ! function_exists( 'woocommerce_show_product_loop_sale_flash' ) ) {
|
||||
|
||||
/**
|
||||
|
@ -432,10 +445,9 @@ if ( ! function_exists( 'woocommerce_catalog_ordering' ) ) {
|
|||
function woocommerce_catalog_ordering() {
|
||||
global $woocommerce;
|
||||
|
||||
if ( ! isset( $woocommerce->session->orderby ) )
|
||||
$woocommerce->session->orderby = apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
|
||||
$orderby = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
|
||||
|
||||
woocommerce_get_template( 'loop/sorting.php' );
|
||||
woocommerce_get_template( 'loop/sorting.php', array( 'orderby' => $orderby ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -832,7 +832,12 @@ class Woocommerce {
|
|||
'delete_terms' => 'delete_product_terms',
|
||||
'assign_terms' => 'assign_product_terms',
|
||||
),
|
||||
'rewrite' => array( 'slug' => $product_category_slug, 'with_front' => false, 'hierarchical' => true ),
|
||||
'rewrite' => array(
|
||||
'slug' => $product_category_slug,
|
||||
'with_front' => false,
|
||||
'hierarchical' => true,
|
||||
//'ep_mask' => EP_CATEGORIES
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
|
@ -1851,6 +1856,7 @@ class Woocommerce {
|
|||
'wc_product_children_ids_',
|
||||
'wc_product_total_stock_',
|
||||
'wc_average_rating_',
|
||||
'wc_rating_count_',
|
||||
'woocommerce_product_type_', // No longer used
|
||||
'wc_product_type_', // No longer used
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue