I need to sort my search results by custom post type. the problem: the order is custom.

I do have 5 different post types and i got the order like so:

  1. artist
  2. artwork
  3. page
  4. post
  5. publication

I’d like the order to be like this:

  1. artist
  2. post
  3. artwork
  4. publication
  5. page

Here is what I have so far, the elements are grouped by their post type and get sorted by title. Wonderful. Now all I need is the custom ordering.

Any hint?

add_filter( 'posts_orderby', 'order_search_by_posttype', 10, 2 );
function order_search_by_posttype( $orderby ){
   global $wpdb;
    if( ! is_admin() && is_search() ) :
        $orderby = "{$wpdb->prefix}posts.post_type ASC, {$wpdb->prefix}posts.post_title ASC";
    endif;
    return $orderby;
}

1
1

I found the key: SQL CASE Expression

function order_search_by_posttype($orderby){
    if (!is_admin() && is_search()) :
        global $wpdb;
        $orderby =
            "
            CASE WHEN {$wpdb->prefix}posts.post_type="artist" THEN '1' 
                 WHEN {$wpdb->prefix}posts.post_type="post" THEN '2' 
                 WHEN {$wpdb->prefix}posts.post_type="artwork" THEN '3' 
                 WHEN {$wpdb->prefix}posts.post_type="publication" THEN '4' 
            ELSE {$wpdb->prefix}posts.post_type END ASC, 
            {$wpdb->prefix}posts.post_title ASC";
    endif;
    return $orderby;
}
add_filter('posts_orderby', 'order_search_by_posttype');

Leave a Reply

Your email address will not be published. Required fields are marked *