WP_Query trié par chiffres puis lettres

De base, WordPress permet de trier par ordre alphabétique. Ca se complique lorsque les données de cette colonne sont soit des chiffres, soit des nombres, soit un mix des deux.

Si vous voulez trier par ordre alphabétique en ayant les nombres d’abord puis les chaines ensuite, vous allez avoir un tri non souhaité.
Ex de tri :

  • 1
  • 100
  • 2
  • 3
  • chaine

Le résultat souhaité est :

  • 1
  • 2
  • 3
  • 100
  • chaine

Voici donc une méthode pour modifier le résultat. En ajoutant un filtre, il faut simplement modifier la valeur de l’order by avant l’exécution de la requête.
Bien entendu, il ne faut pas oublier de rétablir la valeur de l’order by après l’exécution de la requête.

args = array(

	....

	'meta_key' => 'my_custom_field',
	'orderby' => 'meta_value',
	'order' => 'ASC'
);

function orderByNumberThenLetters($orderby = '') {
	return " case  when wp_postmeta.meta_value regexp '^[0-9]' then 1 when wp_postmeta.meta_value regexp '^[a-zA-Z]' then 2 end, wp_postmeta.meta_value * 1, wp_postmeta.meta_value ";
}

add_filter('posts_orderby', 'orderByNumberThenLetters');
$linesPost = new WP_Query($args);
remove_filter('posts_orderby', 'orderByNumberThenLetters');