Ce este nonce și cum să îl folosești cu Ajax în WordPress?
Încerc să învăț cum să folosesc Ajax în WordPress în mod corect. Iată ce am învățat până acum:
Pasul 1: Creează fișierul Ajax și înregistrează-l folosind wp_enqueue_script
.
function wpdocs_theme_name_scripts() {
wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . '/js/ajxfile.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );
Pasul 2: Folosește ajax astfel în ajxfile.js:
$( document ).ready(function() {
$('#id').on('click',function (e){
alert("Funcționează");
var up = 1;
var id = $( "#id" ).data( "user_id" );
$.ajax({
type: "POST",
url: "runcode.php",
data: {up:up, id:id},
success:
function(result){
alert("rezultat");
}
});
});
});
PASUL 3: adăugarea HTML în pagină:
<a href="#" id="id" data-user_id="<?php echo $user_id = get_current_user_id(); ?>"
data-post_id="<?php echo $post_id = get_the_ID(); ?>">
<i class="fa fa-thumbs-up" aria-hidden="true"></i>
</a>
De fiecare dată când cineva face click pe link, se afișează cu succes mesajul "Funcționează". Acum vreau să preiau acele date și să le adaug în meta-datele utilizatorului. Dar mă confuzează. Și ce este acest lucru numit nonce? Poate cineva să mă îndrume în direcția corectă?

Acum am înțeles! WordPress este pur și simplu minunat. De asemenea, mulțumesc knif3r, sugestiile tale m-au ajutat foarte mult. Încerc să explic în cuvintele mele. Te rog să mă corectezi dacă greșesc.
Ce este un nonce?
Nonce este ceva similar cu un hash de securitate pentru a preveni atacurile și greșelile. Acesta creează identificatori unici pentru a verifica dacă cererea ajax vine de pe site sau nu. În termeni WordPress:
Un nonce este un "număr folosit o singură dată" pentru a proteja URL-urile și formularele de anumite tipuri de utilizare greșită, malicioasă sau altfel. Nonce-urile WordPress nu sunt numere, ci un hash format din numere și litere. De asemenea, nu sunt folosite o singură dată, ci au o "durată de viață" limitată după care expiră.
Cum se folosește?
Mai întâi trebuie să adăugăm fișierul js corect folosind
wp_enqueue_script()
. Ceva de genul:function wpdocs_theme_name_scripts() { wp_enqueue_script( 'script-name', get_stylesheet_directory_uri(). '/js/ajxfile.js', array(), '1.0.0', true ); } add_action( 'wp_enqueue_scripts', 'wpdocs_theme_name_scripts' );
Înregistrăm fișierul nostru ajxfile.js
cu numele script-name
. Acum se încarcă pe toate paginile WordPress.
Acum trebuie să folosim
wp_localize_script()
pentru a declara variabilele și aici adăugăm nonce-ul pentru a-l folosi în funcții.function wpdocs_theme_name_scripts() { wp_enqueue_script( 'script-name', get_stylesheet_directory_uri() . '/js/ajxfile.js', array(), '1.0.0', true ); wp_localize_script('script-name', 'ajax_var', array( 'url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ajax-nonce') )); }
Am înregistrat și localizat cu succes scriptul nostru.
Asigură-te să transmiți datele nonce în apelul tău ajax din
ajxfile.js
:/* global ajax_var */ $.ajax( { url: ajax_var.url, type: 'post', data: { action: 'custom_script_name', nonce: ajax_var.nonce, // transmitem nonce aici moredata: 'whatever', }, success( data ) { if ( data ) { // etc... } }, } );
Acum vrem să legăm funcția noastră de script. Am folosit:
add_action('wp_ajax_nopriv_custom_script_name', 'custom_php_ajax_function'); add_action('wp_ajax_custom_script_name', 'custom_php_ajax_function');
Folosim wp_ajax_nopriv_
și wp_ajax_
pentru a lega funcțiile noastre de cârligele WordPress. Al doilea cârlig se declanșează când un utilizator este autentificat, iar primul când nu este.
Funcția noastră va arăta astfel:
function custom_php_ajax_function() { // Verificăm securitatea nonce if ( ! wp_verify_nonce( $_POST['nonce'], 'ajax-nonce' ) ) { die ( 'Busted!'); } }
Funcția noastră va verifica dacă datele ajax trimit datele nonce ascunse cu alți parametri. Dacă nu, va afișa o eroare. Acest lucru poate ajuta cu adevărat la prevenirea atacurilor ajax. Datele Nonce
sunt o valoare ascunsă și trebuie trimise obligatoriu cu alți parametri.
Cum verificăm dacă funcționează?
- Elimină
'nonce' => wp_create_nonce('ajax-nonce')
dinwpdocs_theme_name_scripts()
și dă click pe link. Va afișa o eroare. - Acum elimină verificarea de securitate din funcția noastră și dă click pe link. Va funcționa.
Aceasta arată că funcția noastră cu verificarea de securitate nonce nu va funcționa niciodată dacă nu există date nonce. Este ascuns, așa că nimeni altcineva nu îl poate folosi. Și dacă nimeni nu îl cunoaște, atunci indiferent de câte ori rulează acel ajax, funcția noastră nu le va răspunde.
Îmi cer scuze pentru engleza mea slabă și explicația neclară. Încerc doar să ajut. Te rog să-mi spui dacă am omis ceva sau am făcut ceva greșit.

Un mic detaliu: wp_ajax_nopriv_
este pentru utilizatorii care NU sunt autentificați (ei "nu au privilegii"), iar wp_ajax_
este pentru utilizatorii care sunt autentificați. Tu ai menționat invers.

Se pare că ai înțeles corect :) Doar nu uita să folosești opțiunile de filtrare când utilizezi cereri POST/GET/REQUEST precum filter_input(INPUT_POST 'datasource');
sau alte funcții PHP cum ar fi htmlspecialchars()
și esc_attr()
sau esc_html
când folosești câmpuri ascunse pentru a transmite date către js și vei fi pe drumul cel bun.

Mulțumesc Scott, am actualizat răspunsul. Da knif3r, mulțumesc pentru sugestie. O voi ține minte.

răspuns bun. Am adăugat doar pasul în care datele nonce trebuie transmise în apelul $.ajax

Aceasta ajută foarte mult, dar nu înțeleg de ce primesc întotdeauna 0 în corpul răspunsului.
