web-dev-qa-db-fra.com

Utiliser Orderby et meta_value_num pour commander les numéros en premier, puis les chaînes

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 qui trie par 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" soit affiché en premier.

Y at-il un moyen de modifier cela, ou un hack rapide que je pourrais utiliser pour trier le tableau par la suite et mettre les prix "POA" en dernier?

14
Shaun

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

'orderby' => 'meta_value_num',

à:

'orderby' => 'meta_value meta_value_num',
22
Bainternet

J'ai trouvé cette solution en combinant le code de @bonger et https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when

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' );
2
Gangesh