9

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;
}
3
  • btw. there is no chance to rename the post-types, they do exist and the content is already in..
    – honk31
    Commented Feb 10, 2015 at 10:48
  • I would honestly just use usort to sort the returned array by post type Commented Feb 10, 2015 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
    Commented Feb 10, 2015 at 11:11

1 Answer 1

24

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');
1
  • 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. Commented Feb 10, 2015 at 11:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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