// Товары без цены или с ценой равной нулю будут в конце списка
add_filter('posts_clauses', 'order_by_stock_status', 50, 2);
function order_by_stock_status($posts_clauses) {
global $wpdb;
if (!is_admin() && is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) {
$posts_clauses['orderby'] = "price_query.price > 0 DESC, " . $posts_clauses['orderby'];
}
return $posts_clauses;
}