# admin_post_ et admin_post_nopriv_ : traiter un formulaire sans passer par l’AJAX

> Pour un simple envoi de formulaire suivi d'une redirection, admin-post.php reste souvent plus simple et plus robuste qu'une action AJAX. Voici quand le préférer.

- Auteur : WordPress Développement
- Publié le : 2020-06-06
- Mis à jour le : 2020-06-06
- Catégorie : Extensions
- URL : https://www.wpmoderne.fr/extensions/admin-post-nopriv-traiter-formulaire-sans-ajax/

## L’essentiel

- Pas de JavaScript requis pour fonctionner
- Une redirection classique après traitement
- Fonctionne même sans JavaScript activé

```
<form method="post" action="/wp-admin/admin-post.php">
    <input type="hidden" name="action" value="wpm_contact">
    ...
</form>
```

Ce fragment de formulaire, sans une seule ligne de JavaScript, suffit à déclencher un traitement complet côté serveur via `admin-post.php`. Face à une action AJAX qui demande un script pour intercepter la soumission, sérialiser les champs et gérer la réponse, cette approche mérite d'être reconsidérée chaque fois qu'un formulaire n'a pas besoin de mise à jour dynamique de la page.

Le choix entre les deux mécanismes revient souvent par réflexe vers l'AJAX, jugé plus moderne, alors que de nombreux formulaires - contact, inscription, demande de devis - se contentent très bien d'un envoi classique suivi d'une redirection vers une page de confirmation.

## Comprendre ce que fait admin-post.php

Le fichier `admin-post.php` agit comme un routeur générique : il reçoit n'importe quelle requête `POST` ou `GET` contenant un paramètre `action`, puis déclenche le hook correspondant. Comme pour les actions AJAX, deux hooks distincts existent selon le public visé :

```
add_action( 'admin_post_wpm_contact', 'wpm_traiter_contact' );
add_action( 'admin_post_nopriv_wpm_contact', 'wpm_traiter_contact' );

function wpm_traiter_contact() {
    if ( ! isset( $_POST['wpm_contact_nonce'] ) ||
        ! wp_verify_nonce( $_POST['wpm_contact_nonce'], 'wpm_contact_action' ) ) {
        wp_die( 'Requête invalide.' );
    }

    $email   = sanitize_email( wp_unslash( $_POST['email'] ?? '' ) );
    $message = sanitize_textarea_field( wp_unslash( $_POST['message'] ?? '' ) );

    // Traitement métier : enregistrement, envoi de notification, etc.

    wp_safe_redirect( add_query_arg( 'contact', 'envoye', wp_get_referer() ) );
    exit;
}
```

## La redirection change la logique de retour utilisateur

Contrairement à une action AJAX qui renvoie une réponse JSON traitée par du JavaScript, un formulaire soumis via `admin-post.php` se termine naturellement par une redirection HTTP classique avec `wp_safe_redirect()`. Le visiteur revient sur une page normale du site, éventuellement enrichie d'un paramètre d'URL pour afficher un message de confirmation.

> L'essentiel à retenir : Pas de JavaScript requis pour fonctionner ; Une redirection classique après traitement ; Fonctionne même sans JavaScript activé

Cette redirection présente un avantage souvent sous-estimé : elle fonctionne même si JavaScript est désactivé, bloqué par une extension de navigateur ou simplement en échec de chargement. Pour un formulaire de contact ou une demande de devis, cette robustesse compte davantage que l'expérience « sans rechargement de page » que promet l'AJAX.

### Afficher le message de confirmation

- Récupérer le paramètre d'URL avec `isset( $_GET['contact'] )` dans le template concerné
- Échapper la sortie avec `esc_html()` même pour un message généré côté serveur
- Prévoir un cas d'erreur distinct, par exemple `contact=erreur`, pour ne pas afficher un succès à tort

## Quand préférer malgré tout une action AJAX

Le formulaire classique perd son intérêt dès que l'interface a besoin de réagir sans rechargement : afficher un indicateur de progression, valider un champ en direct, ou insérer le résultat dans la page sans navigation. Dans ces cas, l'AJAX reste justifié, au prix d'un script supplémentaire à maintenir et tester.

| Critère | admin-post.php | Action AJAX |
| --- | --- | --- |
| JavaScript requis | Non | Oui |
| Retour utilisateur | Redirection classique | Réponse JSON traitée en JS |
| Complexité de mise en œuvre | Faible | Moyenne à élevée |
| Interaction sans rechargement | Non | Oui |

## Un nonce reste indispensable dans les deux cas

Que le traitement passe par `admin-post.php` ou par `admin-ajax.php`, l'absence de nonce expose exactement au même risque : une requête forgée depuis un autre site, envoyée à l'insu du visiteur pendant qu'il navigue ailleurs. `wp_verify_nonce()` et `wp_nonce_field()` s'utilisent de façon identique quel que soit le mécanisme choisi.

> Sur nos projets, la question qui tranche entre les deux mécanismes n'est jamais « lequel est le plus moderne » mais « l'interface a-t-elle réellement besoin de rester en place après l'envoi ».

## En résumé

admin-post.php mérite sa place à côté de l'AJAX plutôt qu'en dessous : pour un formulaire simple qui se termine par une redirection, il évite un script à écrire, à minifier et à maintenir, tout en restant fonctionnel sans JavaScript. Réserver l'AJAX aux interactions qui exigent réellement de rester sur la même page permet d'alléger le code du thème ou de l'extension sans rien sacrifier côté sécurité.
