Cum să folosești nonce în formulare de trimitere din frontend?
Mulțumită diverselor postări de aici am reușit să creez un formular pentru trimitere din frontend. După aproximativ 24 de ore de ajustări, am reușit în sfârșit să fac totul să funcționeze, inclusiv redirecționarea către o pagină de 'succes' după trimitere, dar nu știu ce să fac cu nonce.
Aici este pagina formularului: http://pastebin.com/YWyXL3jY
Și aici este pagina de succes: http://pastebin.com/3Usu0Pt6
Ambele sunt șabloane personalizate de pagină (știu că formatarea este puțin dezordonată momentan deoarece diferite părți provin din surse diferite, și probabil nu voi folosi funcția de încărcare fișiere deoarece prefer să folosesc un plugin pentru securitate mai bună).
Trebuie ca nonce să fie procesat înainte ca utilizatorul să fie redirecționat către pagina de succes? Nu am deloc experiență cu nonce și sunt un programator PHP care folosește metoda 'copiază și lipește', așa că vă rog să fiți înțelegători!
Mulțumesc enorm pentru orice sfat pe care îl puteți oferi :)

Folosește următorul cod înainte de tag-ul pe partea de front-end.
wp_nonce_field('name_of_your_action', 'name_of_your_nonce_field');
Codul de mai sus va genera două câmpuri de input ascunse în interiorul tag-ului form. Acum poți verifica nonce-ul în backend unde vei procesa formularul. Folosește următorul cod pentru a verifica nonce-ul pe care tocmai l-ai creat.
if(wp_verify_nonce($_REQUEST['name_of_your_nonce_field'], 'name_of_your_action')){
// Nonce-ul se potrivește și este valid. Poți face orice acum.
} else {
// Nonce invalid. Poți arunca o eroare aici.
}
O observație: fii atent cum "name_of_your_action" este primul argument al funcției 'wp_nonce_field()' și este al doilea argument al funcției 'wp_verify_nonce()'. :) Deci, nu-l folosi ca prim argument în ambele funcții. Mulți oameni fac această greșeală, așa că am vrut să menționez.

Pentru a adăuga un nonce într-un formular puteți utiliza următoarea funcție:
wp_nonce_field($action, $name, $referer, $echo)
- $action = (opțional) acesta este un șir de caractere care reprezintă numele acțiunii
- $name = (opțional) acesta este un șir de caractere care reprezintă numele nonce-ului. Dacă lăsați acest câmp gol, WordPress va folosi implicit "_wpnonce"
Exemplu:
Interfață:
<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value=" <?php echo $id; ?> " />
<input type="text" name="rec_name" value=" <?php echo $name; ?> " />
<input type="submit" value="Șterge" />
</form>
Backend:
$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action' ) ) die( 'Verificarea de securitate a eșuat' );
Sursa: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

Folosește aceasta pentru nuanță și verificare.
wp_nonce_field('test_action', 'submit_post');
Aceasta va genera câmpul de nounce și poți verifica cu codul de mai jos.
if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
/// fă-ți treaba
}else{
/// aruncă o eroare
}

Pornind de la această pagină: http://codex.wordpress.org/WordPress_Nonces
Apoi, uitându-ne la utilizarea pentru wp_verify_nonce
și exemplul de utilizare a wp_nonce_field
, trebuie să verifici rezultatul verificării și să decizi ce să faci (de obicei să oprești execuția cu die
, dar în cazul tău probabil să echo
un mesaj de eșec). Probabil că poți folosi verificarea drept "verificare dacă formularul a fost trimis" la linia 8:
if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
/* eșec */
} else {
/* succes, procesare, redirecționare */
}
Presupunând că răspunsul este un succes, atunci ai putea să efectuezi următoarea acțiune - cum ar fi afișarea unui mesaj de confirmare sau, în cazul tău, redirecționarea paginii. Doar asigură-te că faci redirecționarea înainte de a afișa orice conținut.
Ceva de luat în considerare - http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ - deși în acest caz, deoarece creezi conținut, cred că tipul menționează că este "corect" să folosești nonce.
