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

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