# wp_dropdown_pages : une liste déroulante de pages toute faite pour un réglage

> Reconstruire une liste déroulante de pages à la main, avec indentation et gestion de la hiérarchie, prend du temps qu'une fonction native permet d'économiser.

- Auteur : Clément Hadrot
- Publié le : 2025-05-02
- Mis à jour le : 2025-05-02
- Catégorie : Astuces
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/wp-dropdown-pages-liste-deroulante-pages-reglage/

## L’essentiel

- Génère un select complet avec hiérarchie indentée
- Marque automatiquement la page actuellement sélectionnée
- Personnalisable sans reconstruire le balisage

« wp_dropdown_pages() : Create a Dropdown of Pages » — c'est ainsi que la documentation officielle décrit cette fonction, et la description tient sa promesse : un seul appel suffit pour obtenir un menu déroulant listant toutes les pages du site, avec leur hiérarchie respectée par une indentation automatique.

Ce besoin revient souvent dans une extension : un réglage « page associée aux mentions légales », une page de destination après une action, une page de remerciement pour un formulaire. Plutôt que de parcourir `get_pages()` et construire soi-même les balises `<option>`, `wp_dropdown_pages()` fait ce travail directement.

## La fonction et ses paramètres utiles

`wp_dropdown_pages( array $args = array() )` accepte un tableau d'arguments plutôt qu'une longue liste de paramètres positionnels. Parmi les plus utiles pour un réglage d'extension :

- `selected` : l'identifiant de la page à présélectionner, typiquement la valeur déjà enregistrée dans les réglages.
- `name` et `id` : les attributs du champ, pour qu'il s'intègre au bon formulaire.
- `show_option_none` : un texte pour l'option « Aucune page », utile quand le réglage est facultatif.
- `echo` : mis à `0`, la fonction retourne le HTML au lieu de l'afficher directement, ce qui permet de l'insérer dans un contexte plus large.

## Un réglage « page de remerciement » pour un formulaire

> L'essentiel à retenir : Génère un select complet avec hiérarchie indentée ; Marque automatiquement la page actuellement sélectionnée ; Personnalisable sans reconstruire le balisage

Voici comment intégrer ce menu déroulant dans une page de réglages d'extension, pour choisir vers quelle page rediriger un visiteur après validation d'un formulaire de contact :

```
function formulaire_champ_page_remerciement() {
    $page_actuelle = (int) get_option( 'formulaire_page_remerciement' );

    wp_dropdown_pages( array(
        'name'              => 'formulaire_page_remerciement',
        'id'                => 'formulaire_page_remerciement',
        'selected'          => $page_actuelle,
        'show_option_none'  => __( '— Rester sur la même page —', 'formulaire-contact' ),
        'option_none_value' => '0',
    ) );
}
```

Le rendu final respecte la hiérarchie des pages : une page enfant apparaît légèrement indentée sous sa page parente, exactement comme dans l'écran natif de gestion des pages. Reconstruire ce détail à la main demanderait de parcourir l'arborescence récursivement et de gérer soi-même les niveaux d'indentation.

## Filtrer les pages proposées

Le tableau d'arguments accepte aussi les mêmes clés que `get_pages()`, ce qui permet de restreindre la liste sans écrire de requête séparée. Par exemple, pour exclure une page technique du choix :

```
wp_dropdown_pages( array(
    'name'    => 'formulaire_page_remerciement',
    'exclude' => get_option( 'page_on_front' ),
) );
```

## Ce que la fonction ne fait pas

Elle génère uniquement le balisage `<select>` et ses options : elle n'affiche pas de libellé associé, ne gère pas l'enregistrement de la valeur soumise, et ne valide pas que l'identifiant sélectionné correspond bien à une page publiée au moment de l'enregistrement. Ces trois responsabilités restent à la charge du code de l'extension, typiquement via `register_setting()` avec une fonction de nettoyage qui vérifie l'existence de la page avec `get_post_status()`.

> Toujours revalider côté serveur l'identifiant de page reçu, même s'il provient d'un menu déroulant généré par le cœur : rien n'empêche une requête modifiée d'envoyer un identifiant qui ne correspond à aucune page existante.

## Pourquoi ne pas utiliser wp_list_pages ici

Il est tentant de confondre `wp_dropdown_pages()` avec `wp_list_pages()`, mais les deux répondent à des besoins différents : la seconde affiche une liste de liens vers des pages, pensée pour un menu de navigation côté visiteur, quand la première produit un champ de formulaire pensé pour une sélection. Utiliser l'une à la place de l'autre demanderait une réécriture complète du balisage produit.

## En résumé

`wp_dropdown_pages()` évite de reconstruire une liste déroulante hiérarchisée à la main pour un besoin qui revient dans presque toute extension gérant des réglages liés à des pages. Le tableau d'arguments couvre la plupart des besoins courants — présélection, option vide, exclusion — et le HTML produit reste cohérent avec ce que l'administration affiche déjà ailleurs. Reste ensuite à valider correctement la valeur reçue côté serveur, comme pour tout champ de formulaire.
