$ _POST Formularanfrage mit Admin-Post


10

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

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

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

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


3
Wenn Sie admin-post.phpund admin_postAktion verwenden, müssen Sie zurück zu Ihrer Plugin-Seite umleiten .
Cybmeta

Diese Informationen sollten dem Kodex hinzugefügt werden. Da war ich mir nicht sicher.
Rubberducker

1
Wenn Sie das Formular an admin-post.php senden, geht der Benutzer in admin.post.php. Sehen Sie sich einfach den Inhalt dieser Datei an, um zu wissen, dass nichts gedruckt wird. Überprüfen Sie einfach das Authentifizierungscookie und führen Sie die Funktionen aus, die admin_initzuerst und admin_postspäter verknüpft sind .
Cybmeta

1
wp_redirectfunktioniert nicht beim Versenden von Formularen mit admin-post. Es wird ein Fehler ausgegeben, dass Header bereits gesendet wurden. Dies scheint also eine wertlose Methode zu sein, um ein Formular zu veröffentlichen und anschließend irgendwo umzuleiten.
Solomon Closson

Antworten:


19

Vielleicht etwas spät, aber ich bin darauf gestoßen, als ich Probleme hatte, es herauszufinden, also dachte ich, ich würde das, was ich herausgefunden habe, für zukünftige Leute liefern.

Ich habe festgestellt, dass die Grundprinzipien darin bestehen, eine versteckte Eingabe zu benennen action, deren Wert eine benutzerdefinierte Set-ID ist. Zum Beispiel

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

Mit dieser Eingabe können Sie Ihre Formularaktion admin-post.phpfestlegen, die auf eine Aktion verweist . Wir setzen diese Aktion mit admin_post_custom_form_submit.

Um die Dinge komplizierter zu machen, können wir ein verwenden, wp_nonce_fielddas meiner Meinung nach ein grundlegendes Sicherheitssachen ist. Grundsätzlich wird ein zufälliger $ _POST-Wert 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 gesendet wird admin-post.phpund ein Aktionswert custom_form_submitder Funktion our_custom_form_functionaufgerufen wird! : 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 verwendetwp_redirect()

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

Ich habe auch festgestellt, dass einmal eingereicht $_POSTgelöscht wird !! DX Dies hat wahrscheinlich mit der Umleitung zu tun. Ich werde googeln und sehen, was ich finden kann: d

Hoffe das hat geholfen :)

AKTUALISIEREN

Ich habe noch etwas 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 zu verwenden, urlencode()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 usw. eingefügt. Die haben über meinem Formular nach ihnen gesucht.

Eine weitere praktische Funktion. http_build_request()kann Arrays in 'url sichere' Arrays verwandeln, so dass Sie sie über $ _GET-Anfragen usw. senden können.


Hallo Bruder, danke, das funktioniert für mich ..! aber ein Problem ist da, wie kann ich den Fehler auf setzen, den admin.php?page=your_custom_page_where_form_is ich add_settings_error()für den Anzeigefehler verwendet habe, aber es wird kein Fehler angezeigt, weil die Seite umgeleitet wird ..! Kannst du mir bitte dabei helfen? danke
Bhavik Hirani

Hi @BhavikHirani Ich verwende WordPress nicht mehr wirklich, aber ich vermute, Sie müssen Ihre Validierung vor dem Funktionsaufruf wp_redirect durchführen und eine if-Anweisung haben, die besagt, dass Ihre Validierung vor der Umleitung bestanden wurde. Hoffe das hilft?
Bashleigh

Nach dem Absenden des Formulars möchte ich die Erfolgsmeldung in 'admin.php? page = your_custom_page_where_form_is' anzeigen. Wie ist das möglich?
Rijo

@ Rijo versucht Echo?
Bashleigh

Jede Methode hat ihre eigenen Anwendungsfälle. Diese Methode übergibt Daten in der URL über $_GET. Dies ist in Ordnung für einige grundlegende Informationen, wie das Anzeigen des Namens oder der E-Mail-Adresse oder das Übergeben einer ?success=trueFlagge, die Ihre Erfolgsmeldung auslöst. Es funktioniert jedoch nicht für die Rückgabe großer Datenmengen aus der Formularübermittlung, Anwendungsfall, sie senden das Formular und es gibt Daten von einer API zurück.
Wade

4

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

Genau so macht es WP Core für die Settings-API, wenn Fehler zurückgegeben werden.

Damit:

-validieren Sie Formulardaten

-speichere Postdaten in transient mit set_transient ()

-Speichern Sie alle vorübergehenden Fehler

-umleiten, um Ausgabe zu bilden

-Überprüfen Sie auf vorübergehende Fehler

-Laden Sie Post-Werte von transient in Formularfelder

Sie können eine Sitzung oder die Options-API anstelle eines Transienten verwenden.

Jetzt habe ich mit verschiedenen Methoden zum Behandeln von Formularübermittlungen sowohl im Frontend als auch im Administrator experimentiert. Ich bin mir nicht sicher, ob admin_post_ {action} so praktisch ist, da Daten und Fehler während der Umleitung beibehalten werden müssen. Die Verwendung des Hooks init oder admin_init zum Überprüfen der Formularübermittlung ist möglicherweise einfacher. Sie können Ihr Formular auch einfach wieder auf derselben Seite veröffentlichen und die Formularübermittlung bearbeiten, bevor das Formular angezeigt wird.


Hinweis: set_transient()hat eine maximale Länge von 172 Zeichen. Dies ist eine plausible Option, wenn Sie keine GET-Variablen verwenden oder nicht verwenden können und es nicht viele Daten gibt. AFAIK, Wordpress verwendet keine Sitzungen (standardmäßig). Für ein Plugin ist dies möglicherweise unangemessen. Options API wäre eine schreckliche Wahl. - Die letzte Option, wenn Sie eine API aufrufen und eine große Datenmenge zurückgeben müssen, ist das POSTEN an die Site / Seite selbst. - Das admin-post.phpist begrenzt und wahrscheinlich nicht die richtige Wahl, wenn Sie eine große Datenmenge zurückgeben müssen.
Wade

2

Die kurze Antwort lautet, dass Sie die ganze Arbeit erledigen müssen: Speichern Sie die Benutzereingaben in der Datenbank, überprüfen Sie sie auf Fehler oder Erfolg und leiten Sie sie nach Abschluss weiter, wo immer Sie möchten.

Wenn Sie erneut zum Formular umleiten möchten, können Sie ein Feld verwenden, das durch wp_nonce()Einfügen in das $_POSTvon Ihrem Formular gesendete Array generiert wird :$_POST['_wp_http_referer']

Schließlich können Sie eine Erfolgs- oder Fehlermeldung mit umleiten und senden wp_safe_redirect(), esc_url_raw()und add_query_arg().

add_action( 'admin_post_my-action', 'my_save_form_function' );
add_action( 'admin_post_nopriv_my-action', 'my_save_form_function' );
function my_save_form_function() {
    if ( ! empty( $_POST['_wp_http_referer'] ) ) {
        $form_url = esc_url_raw( wp_unslash( $_POST['_wp_http_referer'] ) );
    } else {
        $form_url = home_url( '/' );
    }
    if ( isset( $_POST['name'] )
        && isset( $_POST['description'] )
        && isset( $_POST['my-nonce'] )
        && wp_verify_nonce(
            sanitize_text_field( wp_unslash( $_POST['my-nonce'] ) ),
            'my-action'
        )
        ) {

        // Save your form data...

        //All  works fine ?
        wp_safe_redirect(
            esc_url_raw(
                add_query_arg( 'my_status', 'success', $form_url )
            )
        );
        exit();
    } else {
        wp_safe_redirect(
            esc_url_raw(
                add_query_arg( 'my_status', 'error', $form_url )
            )
        );
        exit();
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.