phpwordpresssortingwoocommerceproduct

Set custom product sorting as default Woocommerce sorting option


In Woocommerce, I ma using the following code that adds a custom sorting option to shop catalog by modified date.

add_filter( 'woocommerce_get_catalog_ordering_args', 'enable_catalog_ordering_by_modified_date' );
function enable_catalog_ordering_by_modified_date( $args ) {
    if ( isset( $_GET['orderby'] ) ) {
        if ( 'modified_date' == $_GET['orderby'] ) {
            return array(
                'orderby'  => 'modified',
                'order'    => 'DESC',
            );
        }
    }
    return $args;
}

add_filter( 'woocommerce_catalog_orderby', 'add_catalog_orderby_by_modified_date' );
function add_catalog_orderby_by_modified_date( $orderby_options ) {
    // Rename 'menu_order' label
    $orderby_options['modified_date'] = __("Sort by modified date", "woocommerce");

    return $orderby_options ;
}

From this answer: Add sorting by modified date in Woocommerce products sort by

I would like to make that custom sorting option as the default sorting option keeping the default woocommerce option (by menu order) as a secondary option.

How can I set this sorting as woocommerce default?


Solution

  • You will use the following slight different version code, with some additional hooked functions:

    add_filter( 'woocommerce_get_catalog_ordering_args', 'enable_catalog_ordering_by_modified_date' );
    function enable_catalog_ordering_by_modified_date( $args ) {
        if ( isset( $_GET['orderby'] ) ) {
            if ( 'modified_date' == $_GET['orderby'] ) {
                return array(
                    'orderby'  => 'modified',
                    'order'    => 'DESC',
                );
            }
            // Make a clone of "menu_order" (the default option)
            elseif ( 'natural_order' == $_GET['orderby'] ) {
                return array( 'orderby'  => 'menu_order title', 'order' => 'ASC' );
            }
        }
        return $args;
    }
    
    add_filter( 'woocommerce_catalog_orderby', 'add_catalog_orderby_modified_date' );
    function add_catalog_orderby_modified_date( $orderby_options ) {
        // Insert "Sort by modified date" and the clone of "menu_order" adding after others sorting options
        return array(
            'modified_date' => __("Sort by modified date", "woocommerce"),
            'natural_order' => __("Sort by natural shop order", "woocommerce"), // <== To be renamed at your convenience
        ) + $orderby_options ;
    
        return $orderby_options ;
    }
    
    
    add_filter( 'woocommerce_default_catalog_orderby', 'default_catalog_orderby_modified_date' );
    function default_catalog_orderby_modified_date( $default_orderby ) {
        return 'modified';
    }
    
    add_action( 'woocommerce_product_query', 'product_query_by_modified_date' );
    function product_query_by_modified_date( $q ) {
        if ( ! isset( $_GET['orderby'] ) && ! is_admin() ) {
            $q->set( 'orderby', 'modified' );
            $q->set( 'order', 'DESC' );
        }
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and work.

    enter image description here