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