web-dev-qa-db-fra.com

Trier les résultats de la recherche par type de message

Je dois trier mes résultats de recherche par type de message personnalisé. le problème: la commande est personnalisée.

J'ai 5 types de messages différents et j'ai reçu l'ordre comme suit:

  1. artiste
  2. ouvrages d'art
  3. page
  4. poster
  5. publication

Je voudrais que l'ordre soit comme ça:

  1. artiste
  2. poster
  3. ouvrages d'art
  4. publication
  5. page

Voici ce que j'ai jusqu'à présent, les éléments sont regroupés par type de message et classés par titre. Merveilleux. Maintenant, tout ce dont j'ai besoin est la commande personnalisée.

Un indice?

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;
}
4
honk31

J'ai trouvé la clé: 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;
}
10
honk31