On utilise donc ici la fonction WordPress getPosts() pour récupérer les lots et les afficher sous forme de liste dans une jolie boucle. Cette fonction accepte un seul paramètre (en fait un tableau de paramètres) qui indiquera les critères pour la récupération des articles (oui, bon : des posts) :

$args = array(
  'posts_per_page'   => 5,
  'offset'           => 0,
  'category'         => '',
  'category_name'    => '',
  'orderby'          => 'date',
  'order'            => 'DESC',
  'include'          => '',
  'exclude'          => '',
  'meta_key'         => '',
  'meta_value'       => '',
  'post_type'        => 'post',
  'post_mime_type'   => '',
  'post_parent'      => '',
  'author'	         => '',
  'author_name'	     => '',
  'post_status'      => 'publish',
  'suppress_filters' => true 
);

$posts_array = get_posts($args);

Cette fonction retourne un tableau d'objets WP_Post et nous en venons donc au fait : le tri naturel.

Admettons que l'on ait les cinq titres d'articles suivants :

  • Lot 12 - Manche de pioche hyper ergonomique
  • Lot 3 - Crêpes véritables à acheter assez rapidement
  • Lot 2 - Polochon vert à tendance pourpre pâle
  • Lot 10 - Botte unique pied droit en parfait état de marche
  • Lot 1 - Couverture en laine véritable 60 % acrylique

Facile ! me direz-vous ; pour les trier, il suffit de passer les paramètres orderby => title et order => ASC à la fonction getPosts() pour avoir une super chouette liste classée dans l'ordre des lots.

Eh ben non.

Non, en effet, notre liste va être classée comme ceci :

  • Lot 1 - Couverture en laine véritable 60 % acrylique
  • Lot 10 - Botte unique pied droit en parfait état de marche
  • Lot 12 - Manche de pioche hyper ergonomique
  • Lot 2 - Polochon vert à tendance pourpre pâle
  • Lot 3 - Crêpes véritables à acheter assez rapidement

Mais, c'est diablerie ! me direz-vous. Vous êtes d'ailleurs très bavard aujourd'hui. Vous avez raison, cependant. C'est un tri très logique, et qui dit logique, dit informatique, dit aussi machine et bavoir, mais je ne suis pas certain de ce dernier.

Enfin ! voilà qu'intervient ce fameux tri naturel dont on me chauffe depuis la lecture du titre de ce billet. Oui. Chouette, hein. Le tri naturel consiste en fait à trier les données comme le ferait un être humain, d'où le rapport à la nature, je suppose. Enfin.

Nous allons donc trier les articles une seconde fois, ce qui n'est pas très optimisé, mais c'est bon pour cet exemple, non ? En effet, la fonction getPosts() aura déjà opéré un tri machine alphabétique avec ceci :

$arg_data = array(
  'posts_per_page'   => $page_num,
  'post_type'        => 'ultimate-auction',
  'auction-status'   => 'live',
  'post_status'      => 'publish',
  'orderby'          => 'title',
  'order'            => 'ASC',
  'paged'            => $paged,
  'suppress_filters' => false
);

$wdm_auction_array = get_posts($arg_data);

Comme vous le voyez, on trie une première fois ici par titre et en ordre ascendant.

Mais nous allons en rajouter une couche avec cette belle fonction PHP :

usort($wdm_auction_array, function($a, $b) {
  return strnatcmp($a->post_title, $b->post_title);
});

Trois lignes, mais que d'informations ! Très bien, je détaille.

D'abord, la fonction usort permet de trier un tableau en utilisant une fonction de comparaison. Ça commence donc assez bien.

Cette fonction accepte deux paramètres : le tableau à trier et la fonction qui va être utilisée pour le tri du tableau. Vous noterez l'utilisation d'une fonction anonyme dans ce cas-ci, ce qui est possible depuis la version 5.3 de PHP, soit dit en passant.

Nous en arrivons au vif du sujet, avec la fonction strnatcomp qui, comme son nom tend à l'indiquer, compare des chaînes de caractères avec l'algorithme d'« ordre naturel ». Elle va comparer la propriété définie de chaque objet avec celle de l'objet suivant dans le tableau. Le post_title de l'élément a sera donc comparé avec celui de l'élément b, et ainsi de suite.

Puisque la fonction usort modifie directement le tableau passé en paramètre, le résultat est donc maintenant le suivant :

  • Lot 1 - Couverture en laine véritable 60 % acrylique
  • Lot 2 - Polochon vert à tendance pourpre pâle
  • Lot 3 - Crêpes véritables à acheter assez rapidement
  • Lot 10 - Botte unique pied droit en parfait état de marche
  • Lot 12 - Manche de pioche hyper ergonomique

Fou ! Oui, fou.