Le WordPress d'aujourd'hui, décodé pour les développeurs

Extensions

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.

Par WordPress Développement • 6 juin 2020 • 4 min de lecture • Aucun commentaire
admin_post_ et admin_post_nopriv_ : traiter un formulaire sans passer par l'AJAX
<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èreadmin-post.phpAction AJAX
JavaScript requisNonOui
Retour utilisateurRedirection classiqueRéponse JSON traitée en JS
Complexité de mise en œuvreFaibleMoyenne à élevée
Interaction sans rechargementNonOui

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi