I need to sort my products by rating in a wp_query loop:
this is my code:
switch($ordering){
case 'default':
$meta_key = '';
$order = 'asc';
$orderby = 'menu_order title';
break;
case 'popularity':
$meta_key = '';
$order = 'desc';
$orderby = 'total_sales';
break;
case 'low_to_high':
$meta_key = '_price';
$order = 'asc';
$orderby = 'meta_value_num';
break;
case 'high_to_low':
$meta_key = '_price';
$order = 'desc';
$orderby = 'meta_value_num';
break;
case 'newness':
$meta_key = '';
$order = 'desc';
$orderby = 'date';
break;
case 'rating':
$meta_key = '';
$order = 'desc';
$orderby = 'rating';
break;
}
$args_products_sorting = array(
'post_type' => 'product',
'posts_per_page' => -1,
'orderby' => $orderby,
'order' => $order,
'meta_key' => $meta_key
);
Where is the error ?
If i set in url ?orderby=rating
it works correctly.
Thanks.
I need to sort my products by rating in a wp_query loop:
this is my code:
switch($ordering){
case 'default':
$meta_key = '';
$order = 'asc';
$orderby = 'menu_order title';
break;
case 'popularity':
$meta_key = '';
$order = 'desc';
$orderby = 'total_sales';
break;
case 'low_to_high':
$meta_key = '_price';
$order = 'asc';
$orderby = 'meta_value_num';
break;
case 'high_to_low':
$meta_key = '_price';
$order = 'desc';
$orderby = 'meta_value_num';
break;
case 'newness':
$meta_key = '';
$order = 'desc';
$orderby = 'date';
break;
case 'rating':
$meta_key = '';
$order = 'desc';
$orderby = 'rating';
break;
}
$args_products_sorting = array(
'post_type' => 'product',
'posts_per_page' => -1,
'orderby' => $orderby,
'order' => $order,
'meta_key' => $meta_key
);
Where is the error ?
If i set in url ?orderby=rating
it works correctly.
Thanks.
Share Improve this question edited Sep 20, 2015 at 19:56 fuxia♦ 107k38 gold badges255 silver badges459 bronze badges asked Sep 20, 2015 at 18:28 FrancescoFrancesco 1911 gold badge2 silver badges5 bronze badges 2 |5 Answers
Reset to default 10 +50You should use 'orderby' => 'meta_value_num'
and 'meta_key' => 'rating'
as specified by the WordPress Codec. Using meta_value_num
with the assumption your ratings are numeric values
Reference: Orderby Parameters
Seems like there are a lot of meta keys you can order by (here is a list I’ve found). However I couldn’t find anything rating related. I searched for rating
in the WooCommerce source code and found this line: includes/abstracts/abstract-wc-product.php#L1087
So here is what finally worked for me in the context of using the WooCommerce PHP REST API client:
function getProducts(WP_REST_Request $request) {
global $wc_api_client;
$category = $request->get_param('category');
// $filters = $request->get_param('filters');
$orderby = $request->get_param('orderby');
$args = null;
$wc_query = new WC_Query();
switch ( $orderby ) {
case 'date':
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'date',
'filter[order]' => 'DESC'
);
break;
case 'price':
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'meta_value_num',
'filter[order]' => 'ASC',
'filter[orderby_meta_key]' => '_price'
);
break;
case 'price-desc':
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'meta_value_num',
'filter[order]' => 'DESC',
'filter[orderby_meta_key]' => '_price'
);
break;
case 'popularity':
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'meta_value_num',
'filter[order]' => 'DESC',
'filter[orderby_meta_key]' => 'total_sales'
);
break;
case 'rating':
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'meta_value_num',
'filter[order]' => 'DESC',
'filter[orderby_meta_key]' => '_wc_average_rating'
);
break;
default:
$args = array(
'filter[limit]' => 6,
'filter[category]' => $category
);
}
try {
$raw = $wc_api_client->products->get('', $args);
return $raw['products'];
} catch (Exception $e) {
return new WP_Error('no_products', 'Couldn’t find any products', array('status' => 404));
}
}
I used something like that and it works
switch ($order_by){ case 'price': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_price'; $args['order'] = 'asc'; break; case 'price-desc': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_price'; $args['order'] = 'desc'; break; case 'rating': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_wc_average_rating'; $args['order'] = 'desc'; break; case 'popularity': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = 'total_sales'; $args['order'] = 'desc'; break; }
Try this . Use WC_Shortcode_Products to generate the wc loop with sort parameters were used at default wc shop page
for($i=1;$i<=$num;$i++){
$atts = array_merge(array(
'columns' => $columns,
'orderby' => $order_by,
'order' => $sort_by,//rating , population , price high to low ,....
'rows' => $rows,
'page' => $i,
));
$shortcode = new WC_Shortcode_Products($atts, 'recent_products');
echo $shortcode->get_content();
}
use this codefor arg
$args = array(
'post_type' => 'product',
'orderby' => $args = array(
'filter[limit]' => 6,
'filter[category]' => $category,
'filter[orderby]' => 'meta_value_num',
'filter[order]' => 'DESC',
'filter[orderby_meta_key]' => '_wc_average_rating'
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $category
)
),
'posts_per_page' => $product_number
);
rating
, use_wc_average_rating
instead – Kevin Florenz Daus Commented Oct 30, 2020 at 8:14