Reputation: 77
I wrote this code in functions.php
file of my active theme:
add_filter( 'woocommerce_get_catalog_ordering_args',
'custom_woocommerce_get_catalog_ordering_args' );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
$orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
if ( 'random_list' == $orderby_value ) {
$args['orderby'] = 'date';
$args['order'] = 'desc';
$args['meta_key'] = '';
}
return $args;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );
function custom_woocommerce_catalog_orderby( $sortby ) {
$sortby['random_list'] = 'DESC SORT';
return $sortby;
}
I am trying to sort products by Desc, but products still sorting by default (ASC).
How can I sort them by DESC?
Upvotes: 2
Views: 17404
Reputation: 1859
Another snippet in the comments of Mike Jolley's Gist worked for me:
add_filter('woocommerce_get_catalog_ordering_args', 'custom_default_catalog_orderby');
function custom_default_catalog_orderby( $args ) {
if(!isset( $_GET['orderby'] ) ) {
$args['orderby'] = 'date';
$args['order'] = 'dsc';
return $args;
}
}
This forces the most recent products to appear first, which in my client's case was only working on the main Shop page but not on Product Category archives. This snippet fixed it, others did not. The bigger question for me is why WooCommerce still has so many major bugs!
Ref: https://gist.github.com/mikejolley/1622323
Upvotes: 0
Reputation: 11
This code worked for me.
/**
* This code should be added to functions.php of your theme
**/
add_filter('woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby');
function custom_default_catalog_orderby() {
return 'date'; // Can also use title and price
}
I found it here https://gist.github.com/mikejolley/1622323
Upvotes: 0
Reputation: 11
This code should be added to functions.php
of your theme
add_filter('woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby');
function custom_default_catalog_orderby() {
return 'date'; // Can also use title and price
}
Upvotes: 1
Reputation: 254492
You can use a custom function hooked in woocommerce_product_query
action hook this way:
add_action( 'woocommerce_product_query', 'default_catalog_ordering_desc', 10, 2 );
function default_catalog_ordering_desc( $q, $query ){
if( $q->get( 'orderby' ) == 'menu_order title' )
$q->set( 'order', 'DESC' );
}
Code goes in functions.php file of your active child theme (or active theme) or in any plugin file.
Tested and works.
Upvotes: 8
Reputation: 77
add_action( 'woocommerce_product_query', 'default_catalog_ordering_desc', 10, 2 );
function default_catalog_ordering_desc( $q, $query ){
if( $q->get( 'orderby' ) == 'date' )
$q->set( 'order', 'DESC' );
}
Upvotes: -2
Reputation: 473
You need to decide first that by which field you want to sort either price title etc. But i have written all the possible ways u can use it,
add_filter( 'woocommerce_get_catalog_ordering_args','custom_query_sort_args' );
function custom_query_sort_args() {
// Sort by and order
$current_order = ( isset( $_SESSION['orderby'] ) ) ? $_SESSION['orderby'] : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
switch ( $current_order ) {
case 'date' :
$orderby = 'date';
$order = 'desc';
$meta_key = '';
break;
case 'price' :
$orderby = 'meta_value_num';
$order = 'asc';
$meta_key = '_price';
break;
case 'title' :
$orderby = 'meta_value';
$order = 'asc';
$meta_key = '_woocommerce_product_short_title';
break;
default :
$orderby = 'menu_order title';
$order = 'asc';
$meta_key = '';
break;
}
$args = array();
$args['orderby'] = $orderby;
$args['order'] = $order;
if ($meta_key) :
$args['meta_key'] = $meta_key;
endif;
return $args;
}
Upvotes: 3