# Ordonner manuellement des contenus avec menu_order et page-attributes

> Trier des fiches par date ou par titre ne suffit pas toujours : parfois, c'est l'ordre manuel du client qui doit primer. Voici comment l'activer.

- Auteur : Clément Hadrot
- Publié le : 2021-02-16
- Mis à jour le : 2021-02-16
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/ordonner-contenus-menu-order/

## L’essentiel

- page-attributes ajoute la métabox d'ordre
- menu_order pilote le tri dans les requêtes
- Un glisser-déposer simple complète l'expérience

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`.

> L'essentiel à retenir : page-attributes ajoute la métabox d'ordre ; menu_order pilote le tri dans les requêtes ; Un glisser-déposer simple complète l'expérience

```
$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_order` pour chaque identifiant avec `wp_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.
