Cerere formular $_POST cu admin-post

4 feb. 2015, 16:14:38
Vizualizări: 40.5K
Voturi: 18

Am încercat să folosesc un formular cu următorul marcaj folosind acțiunea admin-post.php

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

Folosesc hook-ul de acțiune sugerat de WordPress pentru a procesa parametrii $_POST și funcționează bine. Totuși, după executare primesc o pagină goală și nu există redirecționare înapoi la pagina plugin-urilor. Desigur, aș putea seta o redirecționare personalizată cu referrer-ul, dar este acesta comportamentul normal?

O soluție alternativă este să folosesc action="" și să preiau cererea în codul normal al plugin-ului meu.

4
Comentarii

Dacă folosești admin-post.php și acțiunea admin_post, trebuie să redirecționezi înapoi către pagina ta de plugin.

cybmeta cybmeta
4 feb. 2015 20:15:04

Această informație ar trebui adăugată în codex. Nu eram sigur de asta.

Rubberducker Rubberducker
5 feb. 2015 10:46:53

Dacă trimiți formularul către admin-post.php, admin-post.php este locul unde merge utilizatorul. Doar verifică conținutul acelui fișier pentru a ști că nu afișează nimic, doar verifică cookie-ul de autentificare și rulează mai întâi funcțiile agățate de admin_init și apoi pe cele de admin_post.

cybmeta cybmeta
5 feb. 2015 10:59:36

wp_redirect nu funcționează atunci când trimiteți formulare cu admin-post. Va returna o eroare că antetele au fost deja trimise, așa că această metodă pare a fi inutilă pentru trimiterea unui formular și încercarea de a redirecționa ulterior către altă pagină.

Solomon Closson Solomon Closson
2 dec. 2016 09:26:22
Toate răspunsurile la întrebare 3
5
27

Poate un pic târziu, dar am dat peste asta când aveam probleme în a înțelege cum funcționează, așa că am decis să împărtășesc ceea ce am aflat pentru viitorii oameni.

Am descoperit că principiile de bază sunt să ai un input ascuns numit action și valoarea lui să fie un identificator personalizat. De exemplu:

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

Cu acest input și cu acțiunea formularului setată către admin-post.php, poți configura o acțiune. Setăm această acțiune folosind admin_post_custom_form_submit.

Pentru a face lucrurile mai complicate, putem folosi un wp_nonce_field, care cred că este un mecanism de bază pentru securitate. Practic, adaugă o valoare aleatoare în $_POST. Destul de simplu.

Apoi, vrem să setăm acțiunea astfel:

add_action('admin_post_custom_form_submit','our_custom_form_function');

Așadar, când un formular este trimis către admin-post.php și există o valoare action cu valoarea custom_form_submit, funcția our_custom_form_function va fi apelată! :D

function our_custom_form_function(){
    //print_r($_POST);
    //poți accesa valorile $_POST, $GET și $_REQUEST aici.
    wp_redirect(admin_url('admin.php?page=your_custom_page_where_form_is'));
    //aparent, când ai terminat, este necesar să folosești die();.
}

Acum spui că primești o pagină albă. Asta se întâmplă pentru că trebuie să redirecționăm înapoi către formularul nostru. Am folosit o simplă wp_redirect().

Sper că acest lucru a fost de ajutor :) Încerc să aflu cum pot face niște validări și să returnez erori înapoi la formularul nostru. Cred că cea mai simplă idee ar fi să folosesc o valoare $_GET și să o găsesc pe pagina noastră, dar nu este grozav, nu-i așa?

De asemenea, am descoperit că, odată trimis, $_POST este golit!! DX Probabil are legătură cu redirecționarea. O să caut pe Google să văd ce pot găsi :d

Sper că acest lucru a fost de ajutor :)

ACTUALIZARE

Am făcut niște lucrări suplimentare și am realizat că singura modalitate reală de a returna valori este să folosești variabila $_GET. În acest fel, poți reintroduce orice valori postate. Doar nu uita să folosești urlencode() pentru a te asigura că caracterele speciale, cum ar fi '@' și altele, sunt incluse.

Aveam mai mult de o pagină în ceea ce lucram, așa că am făcut 2 redirecționări diferite către pagini diferite și am inclus erorile și altele. Am verificat pentru ele deasupra formularului meu.

O altă funcție utilă. http_build_request() poate transforma array-uri în array-uri 'sigure pentru URL', astfel încât să le poți trimite prin cereri $_GET etc.

7 sept. 2015 13:44:07
Comentarii

Salut frate, mulțumesc, funcționează pentru mine..! dar am o problemă, cum pot seta eroarea pe admin.php?page=your_custom_page_where_form_is am folosit add_settings_error() pentru a afișa eroarea, dar nu afișează nicio eroare pentru că pagina se redirecționează..! poți să mă ajuți cu asta, te rog..?

mersi

Bhavik Hirani Bhavik Hirani
2 sept. 2017 09:23:06

Salut @BhavikHirani, nu mai folosesc WordPress acum, dar cred că ar trebui să faci validarea înainte de apelul funcției wp_redirect și să ai o condiție if care să verifice dacă validarea a trecut înainte de redirecționare. Sper că te ajută?

bashleigh bashleigh
4 sept. 2017 11:12:02

după trimiterea formularului, vreau să afișez un mesaj de succes în 'admin.php?page=your_custom_page_where_form_is' cum este posibil acest lucru?

Rijo Rijo
24 mar. 2018 04:48:41

@Rijo ai încercat cu echo?

bashleigh bashleigh
26 mar. 2018 11:54:43

Fiecare metodă are cazurile sale de utilizare. Această metodă transmite date în URL prin $_GET. Aceasta ar fi potrivită pentru unele informații de bază, cum ar fi afișarea numelui sau email-ului lor, sau pentru a transmite un flag ?success=true care declanșează mesajul de succes. Cu toate acestea, nu va funcționa pentru returnarea unor cantități mari de date din trimiterea formularului, de exemplu, când utilizatorul trimite formularul și acesta returnează date dintr-un API.

CyberPunkCodes CyberPunkCodes
24 ian. 2020 22:06:03
1

Înainte de redirecționare, puteți salva orice erori de validare și valori ale postării într-un transient. Aceste valori vor persista după redirecționarea URL-ului.

Acesta este exact modul în care nucleul WP o face pentru API-ul de Setări atunci când returnează erori.

Deci:

-validează datele din formular

-salvează datele postării într-un transient cu set_transient()

-salvează orice erori în transient

-redirecționează către afișarea formularului

-verifică dacă există erori în transient

-încarcă valorile postării în câmpurile formularului din transient

Ați putea utiliza o sesiune sau API-ul de Opțiuni în locul unui transient.

Acum, am experimentat diverse metode de gestionare a trimiterilor de formulare atât pe frontend, cât și pe admin. Nu sunt sigur că admin_post_{action} este atât de convenabil din cauza necesității de a persista datele și erorile pe parcursul redirecționării. Folosirea hook-urilor init sau admin_init pentru a verifica o trimitere de formular ar putea fi mai ușoară. De asemenea, ați putea trimite formularul înapoi pe aceeași pagină și procesa trimiterea formularului înainte de afișarea acestuia.

22 sept. 2015 07:14:54
Comentarii

Notă: set_transient() are o lungime maximă de 172 de caractere. Aceasta este o opțiune plauzibilă dacă nu utilizați sau nu puteți utiliza variabile GET și nu este o cantitate mare de date. Din câte știu, WordPress nu utilizează sesiuni (în mod implicit), așa că pentru un plugin, acest lucru poate fi nepotrivit. API-ul de opțiuni ar fi o alegere proastă. -- Ultima opțiune, dacă trebuie să accesați un API și să returnați o cantitate mare de date, este să faceți un POST către site/pagină în sine. -- admin-post.php este limitat și probabil nu este alegerea potrivită dacă trebuie să returnați o cantitate mare de date.

CyberPunkCodes CyberPunkCodes
24 ian. 2020 22:14:46
1

Răspunsul scurt este că tu trebuie să faci toată munca: să salvezi datele introduse de utilizator în baza de date, să verifici erorile sau succesul, și să redirecționezi oriunde dorești când ai terminat.

Dacă vrei să redirecționezi înapoi la formular, poți folosi un câmp generat de wp_nonce() inclus în array-ul $_POST trimis de formularul tău: $_POST['_wp_http_referer']

În final, poți redirecționa și trimite un mesaj de succes sau eroare folosind wp_safe_redirect(), esc_url_raw() și 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'
        )
        ) {

        // Salvează datele din formular...

        // Totul a funcționat corect?
        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();
    }
}
10 dec. 2019 10:28:25
Comentarii

mă redirecționează către wp-admin/admin-post.php?my_status=success în loc să mă întoarcă la pagina originală a formularului. Nu funcționează corespunzător

Himanshu Bansal Himanshu Bansal
2 iun. 2021 15:19:08