{"id":233551,"date":"2023-02-16T17:00:00","date_gmt":"2023-02-16T14:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233551"},"modified":"2022-11-11T00:18:28","modified_gmt":"2022-11-10T21:18:28","slug":"guida-come-utilizzare-correttamente-ajax-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/guida-come-utilizzare-correttamente-ajax-in-wordpress\/","title":{"rendered":"Guida: come utilizzare correttamente AJAX in WordPress"},"content":{"rendered":"\n<p>AJAX \u00e8 una tecnica che puoi utilizzare in Javascript per recuperare i dati dal server e aggiornare il contenuto della tua pagina senza ricaricarla nel tuo browser. In questo post analizzeremo come utilizzare correttamente AJAX in WordPress.<\/p>\n<p>La maggior parte di voi probabilmente ha familiarit\u00e0 con l&#8217;esecuzione di richieste AJAX al di fuori di WordPress e desidera esaminare come farlo in WordPress. Potresti chiederti le seguenti domande:<\/p>\n<ol>\n<li>A quale URL dovresti inviare le tue richieste AJAX nel tuo Javascript.<\/li>\n<li>Come catturare effettivamente la richiesta AJAX in PHP, recuperare i suoi dati e inviare qualcosa indietro.<\/li>\n<li>Assicurati che le tue richieste AJAX siano sicure.<\/li>\n<\/ol>\n<p>In WordPress puoi eseguire richieste AJAX in admin e\/o frontend; il processo \u00e8 lo stesso con alcune differenze nella risposta alle domande di cui sopra. Entriamo subito!<\/p>\n<h2>Le basi per eseguire la richiesta AJAX in WordPress<\/h2>\n<p>La prima cosa di cui hai bisogno \u00e8, ovviamente, il javascript a cui vuoi inviare la richiesta AJAX. Dovrebbe essere accodato utilizzando un <a href=\"https:\/\/awhitepixel.com\/blog\/all-about-adding-styles-and-scripts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">metodo valido per aggiungere script a WordPress<\/a>, frontend o backend. Molto probabilmente hai gi\u00e0 impostato uno script in cui hai solo bisogno della parte dell&#8217;invio o della richiesta di qualcosa da WordPress.<\/p>\n<p>La pubblicazione di AJAX in WordPress richiede il passaggio di una variabile oggetto Javascript come dati alla richiesta. Nell&#8217;oggetto \u00e8 necessario fornire come minimo un immobile; &#8216; <code>action<\/code>&#8216;. Il valore della <code>action<\/code>propriet\u00e0 &#8216; &#8216; \u00e8 una stringa che pu\u00f2 essere (quasi) qualsiasi cosa tu voglia. Questa azione \u00e8 ci\u00f2 che dice a WordPress come instradare la richiesta AJAX. Ma definisce anche parte del nome dell&#8217;hook a cui dovrai agganciarti in PHP per gestire la richiesta AJAX.<\/p>\n<p>Quando si tratta di rispondere alla domanda 1 sopra: a quale URL dovresti inviare la tua richiesta AJAX? Questo varia a seconda che lo script sia accodato in admin o frontend. Poich\u00e9 AJAX \u00e8 gi\u00e0 integrato nelle schermate di amministrazione di WordPress, puoi semplicemente utilizzare la variabile globale <code>ajaxurl<\/code>. Ma per le richieste frontend diventa un po&#8217; pi\u00f9 complicato perch\u00e9 \u00e8 necessario fornire manualmente l&#8217;URL AJAX insieme al proprio Javascript. Altro su quello di seguito.<\/p>\n<p>Per gestire le richieste AJAX in PHP, ti colleghi all&#8217;azione <code>wp_ajax_&lt;your action name&gt;<\/code>. Se desideri eseguire richieste AJAX nel frontend per utenti non registrati, puoi anche collegarti a <code>wp_ajax_nopriv_&lt;your action name&gt;<\/code>. Altro su quello di seguito. All&#8217;interno della tua funzione agganciata puoi accedere ai dati passati da Javascript facendo riferimento <code>$_POST<\/code>all&#8217;array. Per restituire qualcosa, fai semplicemente eco a qualcosa. Questa \u00e8 la risposta breve alla domanda 2 sopra.<\/p>\n<p>Entriamo subito nel codice. Inizieremo con come aggiungere richieste AJAX nel pannello di amministrazione.<\/p>\n<h2>Esecuzione di richieste AJAX nell&#8217;amministratore di WordPress<\/h2>\n<p>Presumo che tu abbia gi\u00e0 accodato uno script che reagisce ad alcune azioni dell&#8217;utente, raccoglie dati ed \u00e8 pronto per eseguire una richiesta AJAX, sia per aggiornare qualcosa, sia per richiedere alcune informazioni da WordPress. Il codice seguente \u00e8 un esempio molto semplificato; il codice accoda un file Javascript nel tema all&#8217;amministratore e all&#8217;interno del codice Javascript imposta alcune variabili casuali, esegue AJAX al caricamento della pagina e restituisce la risposta nella console.<\/p>\n<pre><code>add_action('admin_enqueue_scripts', function() {\n    wp_enqueue_script('awhitepixel-script', get_stylesheet_directory_uri(). '\/assets\/js\/awhitepixel-ajax.js', ['jquery'], '', true);\n});<\/code><\/pre>\n<pre><code>jQuery(document).ready(function($) {\n    var data = {\n        'action': 'awhitepixel_send_something',\n        'something': 'Hello world',\n        'another_thing': 14\n    }\n    $.post(ajaxurl, data, function(response) {\n        console.log(response);\n    });\n});<\/code><\/pre>\n<p>Come puoi vedere nel codice Javascript sopra, hai impostato un oggetto Javascript (pensalo come un array) con tutti i dati che vuoi trasmettere, inclusa l&#8217;importante <code>action<\/code>propriet\u00e0 &#8216; &#8216;.<\/p>\n<p>Inoltre, come accennato in precedenza, poich\u00e9 AJAX \u00e8 gi\u00e0 integrato nelle schermate di amministrazione di WordPress, puoi semplicemente utilizzare la variabile globale <code>ajaxurl<\/code>come URL AJAX.<\/p>\n<p>Ora aggiungeremo il codice per accettare questa richiesta AJAX in PHP. Poich\u00e9 ho fornito &quot; <code>awhitepixel_send_something<\/code>&quot; come valore di <code>action<\/code>&quot;, ho bisogno di agganciarmi <code>wp_ajax_awhitepixel_send_something<\/code>.<\/p>\n<pre><code>add_action('wp_ajax_awhitepixel_send_something', function() {\n    $something = $_POST['something'];\n    $another_thing = (int) $_POST['another_thing'];\n\u00a0\n    echo 'You sent '. $something. ' with '. $another_thing;\n\u00a0\n    wp_die();\n});<\/code><\/pre>\n<p>All&#8217;interno della tua funzione agganciata hai pieno accesso a WordPress; puoi utilizzare qualsiasi funzione, query di WordPress e accedere a variabili globali (ad es <code>$wpdb<\/code>. per query di database). Tutte le variabili che hai passato in Javascript saranno disponibili all&#8217;interno <code>$_POST<\/code>dell&#8217;array con le chiavi che hai fornito nell&#8217;oggetto Javascript.<\/p>\n<p>\u00c8 facoltativo restituire qualcosa a Javascript (ad esempio quando vuoi inviare solo una richiesta per aggiornare o salvare qualcosa e non hai bisogno di conferma). Se vuoi restituire qualcosa, semplicemente <code>echo<\/code>il tuo output. Per l&#8217;output di variabili pi\u00f9 complesse rispetto a una semplice stringa, dovresti restituirlo come un array codificato json in modo che Javascript possa leggerlo e analizzarlo correttamente. Qualcosa come questo;<\/p>\n<pre><code>$pass_back = ['something' =&gt; 'a value', 'another_thing' =&gt; 42];\necho json_encode($pass_back);<\/code><\/pre>\n<p>Un&#8217;ultima nota importante sull&#8217;ultima riga; <code>wp_die()<\/code>. Tutte le funzioni di callback AJAX dovrebbero &quot;chiudere il thread&quot; o terminare correttamente eseguendo <code>die()<\/code>o <code>exit()<\/code>. In WordPress utilizziamo <code>wp_die()<\/code>per una corretta integrazione ma il risultato \u00e8 lo stesso. Se ti capita di ottenere uno strano &quot;0&quot; nelle tue risposte AJAX, \u00e8 molto probabile che tu non ha fatto <code>wp_die()<\/code>o <code>die()<\/code>.Sempre, assicurati sempre &quot;muori&quot; alla fine di tutte le funzioni agganciate a <code>wp_ajax<\/code>.<\/p>\n<h2>Esecuzione di richieste AJAX nel frontend di WordPress<\/h2>\n<p>Il processo di esecuzione di AJAX nel frontend \u00e8 lo stesso dell&#8217;amministratore, ma un po&#8217; pi\u00f9 complicato nel rispondere alla domanda 1: a quale URL dovrebbe pubblicare AJAX. Nell&#8217;esempio precedente per l&#8217;esecuzione di AJAX in admin avevamo gi\u00e0 una variabile Javascript globale, <code>ajaxurl<\/code>, ma questa variabile non \u00e8 disponibile frontend. Dobbiamo fornirlo noi stessi. Per ottenere il valore dell&#8217;URL AJAX di WordPress che utilizzi <code>admin_url('admin-ajax.php')<\/code>(s\u00ec, &quot;URL amministratore&quot; per frontend).<\/p>\n<p>Quando si accoda uno script frontend che eseguir\u00e0 richieste AJAX nel proprio tema o plug-in, \u00e8 necessario passare l&#8217;URL AJAX di WordPress come variabile a quel Javascript, utilizzando <code>wp_localize_script()<\/code>.<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script('awhitepixel-ajaxscript', get_stylesheet_directory_uri(). '\/assets\/js\/frontendajax.js', ['jquery']);\n    $variable_to_js = [\n        'ajax_url' =&gt; admin_url('admin-ajax.php')\n    ];\n    wp_localize_script('awhitepixel-ajaxscript', 'Theme_Variables', $variable_to_js);\n});<\/code><\/pre>\n<p>Ora, nel tuo Javascript hai accesso a un oggetto Javascript globale <code>Theme_Variables<\/code>(questo nome pu\u00f2 essere qualsiasi cosa tu voglia), con l&#8217;URL AJAX di WordPress come valore per <code>ajax_url<\/code>la propriet\u00e0 &#8216; &#8216;. La tua funzione AJAX sarebbe qualcosa del genere:<\/p>\n<pre><code>jQuery(document).ready(function($) {\n    var data = {\n        'action': 'awhitepixel_frontend_stuff',\n        'something': 'Hello world',\n        'another_thing': 14\n    }\n    $.post(Theme_Variables.ajax_url, data, function(response) {\n        console.log(response);\n    });\n});<\/code><\/pre>\n<p>Quando si ha a che fare con AJAX nel frontend c&#8217;\u00e8 un&#8217;altra cosa da tenere a mente riguardo all&#8217;hook che usi per accettare le richieste AJAX. Ti colleghi ancora a <code>wp_ajax_&lt;your action name&gt;<\/code>, ma questo hook funzioner\u00e0 solo per i visitatori che hanno effettuato l&#8217;accesso. Se desideri eseguire richieste AJAX per i visitatori che non hanno effettuato l&#8217;accesso, devi (anche) agganciarti a <code>wp_ajax_nopriv_&lt;your action name&gt;<\/code>. Normalmente per le richieste AJAX front-end necessarie per il corretto funzionamento del tema, ti collegherai a entrambi, indirizzandoli entrambi alla stessa funzione.<\/p>\n<pre><code>add_action('wp_ajax_awhitepixel_frontend_stuff', 'awhitepixel_ajax_frontend');\nadd_action('wp_ajax_nopriv_awhitepixel_frontend_stuff', 'awhitepixel_ajax_frontend');\nfunction awhitepixel_ajax_frontend() {\n    $something = $_POST['something'];\n    $another_thing = (int) $_POST['another_thing'];\n\u00a0\n    echo 'You sent '. $something. ' with '. $another_thing;\n    wp_die();\n}<\/code><\/pre>\n<p>Per quanto riguarda il contenuto della tua funzione agganciata AJAX, \u00e8 lo stesso delle richieste dell&#8217;amministratore. Hai accesso completo a WordPress, ottieni le variabili passate da <code>$_POST<\/code>, facoltativamente restituisci qualcosa eseguendo <code>echo<\/code>e dovresti sempre, sempre ricordarti di &quot;morire&quot; con <code>wp_die()<\/code>alla fine.<\/p>\n<h2>Protezione delle tue richieste AJAX<\/h2>\n<p>Poich\u00e9 AJAX semplifica il passaggio dei dati tra script e back-end, dovresti assolutamente prendere i passaggi necessari per rendere sicuro il tuo codice. Ci\u00f2 include la sanificazione di tutti i dati prima di salvarli, ma anche l&#8217;utilizzo della funzionalit\u00e0 &quot;nonce&quot; di WordPress per verificare se le richieste provengono da posizioni corrette e accettate. Leggi la <a href=\"https:\/\/developer.wordpress.org\/themes\/theme-security\/using-nonces\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentazione di WordPress su nonce<\/a> se non hai familiarit\u00e0 con essa.<\/p>\n<p>La premessa di base \u00e8 questa; utilizzi un metodo WordPress generando un valore nonce (<code>wp_create_nonce()<\/code>) o generando un campo di input nascosto con il valore nonce (<code>wp_nonce_field()<\/code>). Nella tua richiesta AJAX trasmetti il \u200b\u200bvalore nonce (che \u00e8 codificato da WordPress) nella richiesta e nella parte accettante (<code>wp_ajax_<\/code>hook) verifichi il nonce con quello che hai impostato originariamente.<\/p>\n<p>Aggiungiamo un po&#8217; di sicurezza al codice di esempio che abbiamo fatto sopra. Per prima cosa genereremo un nonce e lo passeremo nel nostro <code>wp_localize_script<\/code>insieme all&#8217;URL AJAX. Come parametro per <code>wp_create_nonce()<\/code>impostare una stringa univoca che solo noi dovremmo conoscere, per cos\u00ec dire. Nell&#8217;esempio seguente vado per &#8216; <code>awhitepixel-nonce<\/code>&#8216;.<\/p>\n<pre><code>add_action('wp_enqueue_scripts', function() {\n    wp_enqueue_script('awhitepixel-ajaxscript', get_stylesheet_directory_uri(). '\/assets\/js\/frontendajax.js', ['jquery']);\n    $variable_to_js = [\n        'ajax_url' =&gt; admin_url('admin-ajax.php'),\n        'nonce' =&gt; wp_create_nonce('awhitepixel-nonce')\n    ];\n    wp_localize_script('awhitepixel-ajaxscript', 'Theme_Variables', $variable_to_js);\n});<\/code><\/pre>\n<p>Ci\u00f2 che viene passato come &#8216; <code>nonce<\/code>&#8216; nelle nostre variabili Javascript al frontend \u00e8 un numero casuale generato da WordPress. Nessuno tranne noi, autori di questo script, sa che il nonce valido \u00e8 &#8216; <code>awhitepixel-nonce<\/code>&#8216;. Nel nostro Javascript, raccogliamo il valore nonce e lo ritrasmettiamo nella nostra richiesta AJAX:<\/p>\n<pre><code>jQuery(document).ready(function($) {\n    var data = {\n        'action': 'awhitepixel_frontend_stuff',\n        'something': 'Hello world',\n        'another_thing': 14,\n        'nonce': Theme_Variables.nonce\n    }\n    $.post(Theme_Variables.ajax_url, data, function(response) {\n        console.log(response);\n    });\n});<\/code><\/pre>\n<p>E infine nella nostra <code>wp_ajax<\/code>funzione hook dovremmo iniziare controllando se il nonce era valido con <code>wp_verify_nonce()<\/code>. Forniamo la stringa univoca che abbiamo impostato sopra e se WordPress non corrisponde al valore codificato univoco trasmesso con questa stringa, terminiamo immediatamente:<\/p>\n<pre><code>add_action('wp_ajax_awhitepixel_frontend_stuff', 'awhitepixel_ajax_frontend');\nadd_action('wp_ajax_nopriv_awhitepixel_frontend_stuff', 'awhitepixel_ajax_frontend');\nfunction awhitepixel_ajax_frontend() {\n    if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'awhitepixel-nonce')) {\n        wp_die(-1);\n    }\n\u00a0\n    $something = $_POST['something'];\n    $another_thing = (int) $_POST['another_thing'];\n\u00a0\n    echo 'You sent '. $something. ' with '. $another_thing;\n    wp_die();\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questa guida analizzeremo come utilizzare correttamente AJAX in WordPress. Analizzeremo come aggiungere richieste AJAX nell&#8217;amministrazione e nel frontend e come gestire la sicurezza.<\/p>\n","protected":false},"author":1,"featured_media":224900,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,896,720,835,1110,804,804,835,720,844,844,865,865],"tags":[1168],"class_list":["post-233551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-guida-per-principianti","category-n-a","category-php-6","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=233551"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233551\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224900"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}