6

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;
}
  • btw. there is no chance to rename the post-types, they do exist and the content is already in.. – honk31 Feb 10 '15 at 10:48
  • I would honestly just use usort to sort the returned array by post type – Pieter Goosen Feb 10 '15 at 11:05
  • @PieterGoosen could you be more precise? I honestly don't really understand the result in $orderby, so I don't know how to sort it. (I found an answer, but if usort would be a better way, I'd like to know it..)(See I use capitals now, just for you..) – honk31 Feb 10 '15 at 11:11
10

I found the key: SQL CASE Expression

add_filter( 'posts_orderby', 'order_search_by_posttype', 10, 2 );
function order_search_by_posttype( $orderby, $wp_query ){
    if( ! $wp_query->is_admin && $wp_query->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;
}
|improve this answer|||||
  • I actually think this will do perfectly. Had my mind elsewhere :-). Searching within the same table should be quick without any sinificant loss (if any) in performance. +1 for posting a solution. – Pieter Goosen Feb 10 '15 at 11:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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