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?
L'argument OrderBy
pouvant prendre plus d'un paramètre, la solution devait changer:
'orderby' => 'meta_value_num',
à:
'orderby' => 'meta_value meta_value_num',
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' );