sobhan
sobhan

Reputation: 77

Sort products by DESC order in Woocommerce

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

Answers (6)

Jesse Nickles
Jesse Nickles

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

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

user11919626
user11919626

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

LoicTheAztec
LoicTheAztec

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

sobhan
sobhan

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

baiju jha
baiju jha

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

Related Questions