it-swarm.com.de

$ _POST Formularanfrage mit Admin-Post

Ich habe versucht, ein Formular mit dem folgenden Markup mit der Aktion admin-post.php zu verwenden.

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

Ich verwende den Aktions-Hook vorgeschlagen von Wordpress , um die $ _POST-Parameter fortzusetzen, und es funktioniert einwandfrei. Nach der Ausführung habe ich jedoch eine leere Seite und keine Weiterleitung zurück zur Plugins-Seite erhalten. Natürlich könnte ich eine benutzerdefinierte Weiterleitung mit dem Referer festlegen, aber ist das das normale Verhalten?

Eine Problemumgehung besteht darin, action="" zu verwenden und die Anfrage in meinem normalen Plugin-Code abzurufen.

7
Rubberducker

Vielleicht ein bisschen zu spät, aber ich bin darauf gestoßen, als ich Probleme hatte, es herauszufinden, so dass ich dachte, ich würde liefern, was ich für zukünftige Leute herausgefunden habe.

Ich habe herausgefunden, dass die Grundprinzipien darin bestehen, eine versteckte Eingabe mit dem Namen action zu haben, deren Wert eine benutzerdefinierte Set-ID ist. Zum Beispiel

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

Mit dieser Eingabe und Ihrer Formularaktion, die auf admin-post.php verweist, kann eine Aktion festgelegt werden. Wir setzen diese Aktion mit admin_post_custom_form_submit.

Um die Sache noch komplizierter zu machen, können wir einen wp_nonce_field verwenden, der meiner Meinung nach eine grundlegende Sicherheitssache ist. Grundsätzlich wird ein zufälliger Wert für $ _POST hinzugefügt. Meinetwegen.

Als nächstes wollen wir unsere Aktion so einstellen:

add_action('admin_post_custom_form_submit','our_custom_form_function');

Wenn also ein Formular an admin-post.php gesendet wird und ein Aktionswert von custom_form_submit vorhanden ist, wird die Funktion our_custom_form_function aufgerufen! : D

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

Jetzt sagst du, du bekommst eine weiße Seite. Dies liegt daran, dass wir zu unserem Formular zurückkehren müssen. Ich habe eine einfache wp_redirect() verwendet

Hoffe, das hat geholfen :) Ich werde versuchen, herauszufinden, wie ich einige Überprüfungen durchführen und Fehler an unser Weiterleitungsformular zurückgeben kann. Ich denke, die einfachste Idee wäre, einen $_GET -Wert zu erstellen und diesen auf unserer Seite zu finden, aber es ist nicht großartig, oder?

Ich habe auch festgestellt, dass der einmal eingereichte $_POST gelöscht wird !! DX Dies hat wahrscheinlich mit der Umleitung zu tun. Ich werde mal googeln und nachsehen, was ich finden kann: d

Hoffe das hat geholfen :)

UPDATE

Ich habe noch ein bisschen gearbeitet und festgestellt, dass die einzige Möglichkeit, Werte zurückzugeben, die Verwendung der Variablen $ _GET ist. Auf diese Weise können Sie alle Post-Werte erneut eingeben. Vergessen Sie nicht, urlencode() zu verwenden, um sicherzustellen, dass Sonderzeichen wie '@' usw. enthalten sind.

Ich hatte mehr als eine Seite mit dem, woran ich arbeitete, also habe ich 2 verschiedene Weiterleitungen zu den verschiedenen Seiten durchgeführt und die Fehler eingeschlossen und so weiter. Die haben oberhalb meines Formulars nach ihnen gesucht.

Eine weitere praktische Funktion. http_build_request() kann Arrays in 'url-sichere' Arrays umwandeln, sodass Sie sie über $ _GET-Anforderungen usw. senden können.

16
sourRaspberri

Vor der Umleitung können Sie alle Validierungsfehler speichern und Werte in einem Transienten veröffentlichen. Diese Werte bleiben nach der URL-Umleitung erhalten.

Dies ist genau die Vorgehensweise von WP core für die Einstellungs-API, wenn Fehler zurückgegeben werden.

So:

-validieren Sie Formulardaten

-store post data in transient mit set_transient ()

-Speichern Sie alle Fehler in vorübergehenden

-redirect zur Ausgabe

-Überprüfen Sie auf Fehler in transienten

-Laden Sie Post-Werte aus Transienten in Formularfelder

Sie können eine Sitzung oder die Options-API anstelle einer vorübergehenden Sitzung verwenden.

Jetzt habe ich mit verschiedenen Methoden experimentiert, um Formularübermittlungen sowohl im Frontend als auch im Admin-Bereich zu verarbeiten. Ich bin mir nicht sicher, ob admin_post_ {action} so praktisch ist, da Daten und Fehler über die Umleitung hinweg beibehalten werden müssen. Die Verwendung des Hooks init oder admin_init zum Überprüfen auf eine Formularübermittlung ist möglicherweise einfacher. Sie können Ihr Formular auch einfach wieder auf derselben Seite veröffentlichen und die Übermittlung des Formulars verarbeiten, bevor das Formular angezeigt wird.

3
mos fetish