Utilisation de Orderby et meta_value_num pour les numéros de commande en premier, puis les chaînes

12

J'ai une liste de produits, chacun avec un prix dans un champ personnalisé stocké sous forme de texte tel que "2.50" ou "5.00" et je les affiche sur la page avec une requête personnalisée triant le prix:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

Cela fonctionne très bien pour les prix, mais certains prix sont "POA" et je voudrais les montrer en dernier, mais les commandes ci-dessus de telle sorte que "POA" s'affiche en premier.

Existe-t-il un moyen de modifier cela ou un hack rapide que je pourrais utiliser pour trier le tableau après et mettre les prix "POA" en dernier?

    
posée Shaun 13.03.2012 - 12:42

2 réponses

20

L'argument OrderBy pouvant prendre plus d'un paramètre, la solution devait changer:

'orderby' => 'meta_value_num',

à:

'orderby' => 'meta_value meta_value_num',
    
réponse donnée Bainternet 13.03.2012 - 14:26
1

J'ai trouvé cette solution en combinant le code de @bonger et enlace

Et ça marche bien.

Fonction

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

Avant la requête

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
    
réponse donnée Gangesh 19.08.2016 - 14:47

Lire d'autres questions sur les étiquettes