1

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

3

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'           );
    }
}, PHP_INT_MAX );

You should adjust that to your needs

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