I am using WooCommerce and would would like to show the "out of stock" products last in the query on the archive page. How can I do that?

Currently we are making the newest product show first with the following custom query:

add_action( 'pre_get_posts', 'mik_exclude_category' );
function mik_exclude_category( $query ) {
    if ( $query->is_main_query() ) {
        $query->set( 'orderby', 'date' );
        $query->set( 'order', 'DESC' );

So, we would like to do both. Show the newest products first, but show "out of stock" products last no matter how new they are.

Sincerely, Mika


If we only have two stock statuses, namely outofstock and instock, we can very easily achieve sorting with pre_get_posts

add_action( 'pre_get_posts', function ( $q ) {
    if (   !is_admin()                 // Target only front end 
         && $q->is_main_query()        // Only target the main query
         && $q->is_post_type_archive() // Change to suite your needs
    ) {
        $q->set( 'meta_key', '_stock_status' );
        $q->set( 'orderby',  'meta_value'    );
        $q->set( 'order',    'ASC'           );

You should adjust that to your needs

| improve this answer | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.