Un client viticole voulait présenter ses cuvées dans un ordre précis : d’abord les vins phares, puis les nouveautés, puis le reste — un ordre qui ne correspond ni à la date de publication, ni à l’alphabet. Sur les pages, WordPress gère ce cas depuis toujours grâce à la colonne menu_order. Sur un type de contenu personnalisé comme des « cuvées », il faut l’activer explicitement.
Trois étapes permettent d’obtenir un tri manuel complet : déclarer le support page-attributes à l’enregistrement du CPT, adapter les requêtes d’affichage pour trier sur menu_order, puis, en option, ajouter une interface de glisser-déposer pour éviter de saisir des nombres à la main.
Activer le support page-attributes
Ce support, historiquement réservé aux pages, ajoute la métabox « Attributs » contenant le champ numérique d’ordre. Il suffit de l’ajouter à la liste des supports lors de l’appel à register_post_type().
register_post_type( 'cuvee', array(
'label' => 'Cuvées',
'public' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
'show_in_rest' => true,
) );
Une fois ce support ajouté, la métabox « Attributs » apparaît automatiquement dans l’écran d’édition, avec un simple champ numérique. Sur l’éditeur de blocs, le même champ se retrouve dans le panneau latéral, sous « Attributs de page ».
Trier les requêtes sur menu_order
Par défaut, WP_Query trie par date de publication décroissante. Pour respecter l’ordre manuel, il faut préciser explicitement les paramètres orderby et order.

$cuvees = new WP_Query( array(
'post_type' => 'cuvee',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
) );
Sur une archive native (archive-cuvee.php), le même réglage peut être imposé sans toucher au template, via le hook pre_get_posts :
function domaine_tri_archive_cuvees( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'cuvee' ) ) {
$query->set( 'orderby', 'menu_order' );
$query->set( 'order', 'ASC' );
}
}
add_action( 'pre_get_posts', 'domaine_tri_archive_cuvees' );
Attribuer les valeurs initiales
Sur un contenu existant migré depuis une autre source, la colonne menu_order vaut généralement 0 pour tous les contenus, ce qui donne un tri incohérent au premier chargement. Un script ponctuel via WP-CLI permet d’initialiser les valeurs par lot, en s’appuyant par exemple sur l’ordre alphabétique de départ :
wp post list --post_type=cuvee --orderby=title --order=ASC --field=ID | \
awk '{print NR-1, $0}' | while read ordre id; do
wp post update "$id" --menu_order="$ordre"
done
Un glisser-déposer simple en JavaScript
Saisir un nombre pour chaque contenu reste fastidieux dès qu’il y en a plus d’une dizaine. Sur la liste des articles, WordPress inclut déjà la bibliothèque jQuery UI ; un script minimal branché sur list-table permet de réordonner par glisser-déposer et d’enregistrer via admin-ajax.php.
- Rendre les lignes de la table triables avec
jQuery( '#the-list' ).sortable(). - À chaque relâchement, envoyer la nouvelle liste d’identifiants ordonnés à un point d’entrée AJAX personnalisé.
- Ce point d’entrée met à jour
menu_orderpour chaque identifiant avecwp_update_post().
function domaine_enregistrer_ordre() {
check_ajax_referer( 'domaine_ordre_cuvees' );
$ids = array_map( 'absint', $_POST['ordre'] ?? array() );
foreach ( $ids as $position => $id ) {
wp_update_post( array( 'ID' => $id, 'menu_order' => $position ) );
}
wp_send_json_success();
}
add_action( 'wp_ajax_domaine_enregistrer_ordre', 'domaine_enregistrer_ordre' );
Pour un client qui réordonne souvent son contenu, le glisser-déposer change tout : la métabox numérique fonctionne, mais personne n’a envie de recalculer des dizaines de chiffres à la main après l’ajout d’une seule fiche.
En résumé
Le support page-attributes et la colonne menu_order forment un mécanisme de tri manuel disponible depuis toujours dans WordPress, trop souvent oublié parce qu’il était historiquement réservé aux pages. Sur un type de contenu personnalisé, ces trois étapes — support déclaré, requêtes adaptées, interface de tri — suffisent à donner un contrôle total au client sur l’ordre d’affichage de son contenu.