web-dev-qa-db-fra.com

Demande de formulaire $ _POST avec admin-post

J'ai essayé d'utiliser un formulaire avec le balisage suivant à l'aide de l'action admin-post.php

<form method='post' action='admin-post.php'>

J'utilise le crochet d'action suggéré par Wordpress pour procéder aux paramètres $ _POST et cela fonctionne bien. Cependant, après exécution, j'ai eu une page blanche et aucune redirection vers la page des plugins. Bien sûr, je pourrais définir une redirection personnalisée avec le référant, mais est-ce le comportement normal?

Une solution de contournement consiste à utiliser action="" et à obtenir la demande dans mon code de plug-in normal.

7
Rubberducker

Peut-être un peu tard, mais je suis tombé sur ça quand j'avais des problèmes pour le comprendre, alors j'ai pensé fournir ce que j'ai découvert pour les futures personnes.

J'ai trouvé que les principes de base sont d'avoir une entrée cachée nommée action et que sa valeur est un identifiant de jeu personnalisé. Par exemple

<input name='action' type="hidden" value='custom_form_submit'>

Avec cette entrée et votre action de formulaire pointant sur admin-post.php, une action peut être définie. Nous définissons cette action en utilisant admin_post_custom_form_submit.

Pour rendre les choses plus compliquées, nous pouvons utiliser un wp_nonce_field qui, à mon avis, est un élément fondamental de la sécurité. Fondamentalement, il ajoute une valeur $ _POST aléatoire. C'est suffisant.

Ensuite, nous voulons définir notre action comme suit:

add_action('admin_post_custom_form_submit','our_custom_form_function');

Ainsi, lorsqu'un formulaire est soumis à admin-post.php et qu'il existe une valeur d'action de custom_form_submit, la fonction our_custom_form_function sera appelée! :RÉ

function our_custom_form_function(){
    //print_r($_POST);
    //you can access $_POST, $GET and $_REQUEST values here. 
    wp_redirect(admin_url('admin.php?page=your_custom_page_where_form_is'));
   //apparently when finished, die(); is required. 
}

Maintenant, vous dites que vous obtenez une page blanche. C'est parce que nous devons rediriger notre formulaire. J'ai utilisé une simple wp_redirect()

J'espère que cela a aidé :) Je vais essayer de comprendre comment je peux faire une validation et redonner des erreurs à notre formulaire de redirection. Je pense que l'idée la plus simple serait de créer une valeur $_GET et de la trouver sur notre page, mais ce n'est pas génial, n'est-ce pas?

J'ai également constaté qu'une fois que $_POST est soumis, il est effacé !! DX Ceci est probablement lié à la redirection. Je vais avoir un google et voir ce que je peux trouver: d

J'espère que cela a aidé :)

METTRE À JOUR

J'ai fait un peu plus de travail et je me suis rendu compte que le seul moyen réel de renvoyer des valeurs est d'utiliser la variable $ _GET. De cette façon, vous pouvez ressaisir n'importe quelle valeur de publication. N'oubliez pas d'utiliser urlencode() pour vous assurer que les caractères spéciaux tels que "@", etc., sont inclus.

J'avais plus d'une page avec ce sur quoi je travaillais, alors j'ai créé 2 redirections différentes vers les différentes pages et inclus les erreurs, etc. Le vérifié pour eux au-dessus de ma forme.

Une autre fonction pratique. http_build_request() peut transformer des tableaux en tableaux sécurisés pour que vous puissiez les envoyer via des requêtes $ _GET, etc.

16
sourRaspberri

Avant de rediriger, vous pouvez enregistrer les erreurs de validation et publier les valeurs dans un transitoire. Ces valeurs persisteront après la redirection d'URL.

C’est exactement comme cela que WP core le fait pour l’API de configuration lorsqu’il renvoie des erreurs.

Alors:

-valider les données de formulaire

des données de post-stockage en transitoire avec set_transient ()

-store les erreurs en transitoire

-redirect pour former la sortie

-check pour les erreurs en transitoire

-charger des valeurs de publication dans des champs de formulaire à partir de transitoires

Vous pouvez utiliser une session ou l'API Options au lieu d'un transitoire.

Maintenant, j'ai expérimenté différentes manières de traiter les soumissions de formulaires à la fois sur le front-end et sur l'administrateur. Je ne suis pas sûr que admin_post_ {action} soit pratique à cause de la nécessité de conserver les données et les erreurs lors de la redirection. L'utilisation du hook init ou admin_init pour vérifier la soumission d'un formulaire peut être plus facile. Vous pouvez également simplement poster votre formulaire sur la même page et traiter la soumission du formulaire avant son affichage.

3
mos fetish