{"id":230542,"date":"2022-11-24T10:03:00","date_gmt":"2022-11-24T07:03:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230542"},"modified":"2022-11-09T22:53:03","modified_gmt":"2022-11-09T19:53:03","slug":"lavorare-correttamente-con-le-richieste-ajax-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/lavorare-correttamente-con-le-richieste-ajax-in-wordpress\/","title":{"rendered":"Lavorare correttamente con le richieste Ajax in WordPress"},"content":{"rendered":"\n<p>Ogni volta che lavori con API di terze parti e lo fai in modo asincrono, c&#8217;\u00e8 sempre la possibilit\u00e0 che qualunque cosa tu stia richiedendo restituir\u00e0 un risultato indesiderato.<\/p>\n<p>Forse \u00e8 un codice di errore, forse \u00e8 un avviso, o forse \u00e8 un semplice messaggio che dice qualcosa del tipo &quot;Stiamo ancora elaborando la tua richiesta da parte nostra&quot;.<\/p>\n<p>In ogni caso, di solito puoi gestirli bene sul lato server e lasciare che il lato client sappia come gestirlo. Ma se hai a che fare con quest&#8217;ultimo caso, \u00e8 l\u00ec che sei bloccato dall&#8217;elaborazione di terze parti; ci sono altre cose che puoi fare per gestire meglio questa situazione.<\/p>\n<p>Ad esempio, in quest&#8217;ultimo caso, \u00e8 meglio aspettare un po&#8217;, quindi effettuare nuovamente la richiesta per vedere se l&#8217;API ha una risposta diversa per te.<\/p>\n<p>Ma quando lo fa, richiede Ajax che ovviamente richiede JavaScript. Uno dei metodi ovvi, ma pi\u00f9 datati per farlo \u00e8 usare setInterval.<\/p>\n<p>Il problema con questo, tuttavia, \u00e8 che crea uno stack di richieste e quindi, quando la risposta \u00e8 pronta, ogni elemento nello stack ricever\u00e0 la stessa risposta.<\/p>\n<p>Questo pu\u00f2 avere un impatto drastico su un determinato server. E ci sono modi migliori per farlo.<\/p>\n<h2>Lavorare correttamente con le richieste Ajax<\/h2>\n<p>Come al solito, poich\u00e9 WordPress viene fornito con jQuery, lo user\u00f2; tuttavia, ti esorto anche, se non l&#8217;hai gi\u00e0 fatto, a guardare <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/AJAX\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajax in ES6<\/a><\/strong> per avere un&#8217;idea su come farlo in modo nativo.<\/p>\n<p>Ad ogni modo, l&#8217;idea \u00e8 questa: piuttosto che impostare un intervallo, utilizzare le funzioni Ajax integrate per valutare correttamente la risposta. E solo in determinate condizioni, riattivare la funzione.<\/p>\n<p>Caso in questione: il metodo <a href=\"https:\/\/api.jquery.com\/jquery.post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$.post<\/a> di jQuery offre alcune funzioni che possono essere utilizzate esattamente per questo. Ad esempio, offre metodi come:<\/p>\n<ul>\n<li>fatto()<\/li>\n<li>fallire()<\/li>\n<li>sempre()<\/li>\n<\/ul>\n<p>E ognuno di questi \u00e8 pensato per essere eseguito in determinate condizioni che mostrer\u00f2 momentaneamente in alcuni esempi di codice.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164533-61e766ff924f1.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164533-61e766ff924f1.png\" alt=\"Lavorare correttamente con le richieste Ajax in WordPress\" ><\/a><\/p>\n<p>Prima di farlo, per\u00f2, \u00e8 importante capire che ci sono diversi parametri che sto inviando che presumo tu abbia familiarit\u00e0 con:<\/p>\n<ul>\n<li>l&#8217;URL Ajax di WordPress (che definir\u00f2 acme.ajax_url),<\/li>\n<li>un URL al post che stiamo visualizzando (che verr\u00e0 archiviato in una variabile sUrl),<\/li>\n<li>e un nonce di sicurezza che chiamer\u00f2 acme.security<\/li>\n<\/ul>\n<p>Se una delle precedenti non \u00e8 chiara, si prega di leggere le pagine collegate per vedere come si ottiene ci\u00f2.<\/p>\n<p>Ma detto questo, ecco l&#8217;idea alla base di come gestire le risposte Ajax ripetute senza setInterval.<\/p>\n<h3>1 Una funzione per il lavoro<\/h3>\n<p>La prima cosa che devi fare \u00e8 racchiudere il lavoro che farai nella sua stessa funzione. Ci\u00f2 significa che puoi chiamarlo da qualsiasi altra parte nell&#8217;applicazione lato client o anche nel contesto di un timer (se assolutamente necessario).<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-00-initial-function-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ad esempio<\/a><\/strong> :<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n      \/\/ ...\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n      \/\/ ...\n    })\n    .always(function() {\n      \/\/ ..\n    });\n}\n<\/code><\/pre>\n<p>E, come puoi vedere, sono andato avanti e ho cancellato alcune delle funzioni che ho menzionato sopra.<\/p>\n<h3>2 Gestisci il successo<\/h3>\n<p>In caso di successo, puoi utilizzare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-01-handle-success-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una funzione anonima<\/a><\/strong> come callback per la funzione <strong>$.post<\/strong>. L&#8217;argomento principale di cui dovresti preoccuparti \u00e8 l&#8217; argomento della <strong>risposta .<\/strong><\/p>\n<p>In genere, mi piace che le mie risposte abbiano un attributo di <strong>successo<\/strong> e un attributo di <strong>errore<\/strong>. Ci\u00f2 semplifica la gestione di un caso ogni volta che la risposta \u00e8 completamente riuscita, ma i dati restituiti dal server non erano quelli che mi aspettavo.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM.\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n      \/\/ ...\n    })\n    .always(function() {\n      \/\/ ...\n    });\n}\n<\/code><\/pre>\n<p>Questo non significa necessariamente che ci sia stato un fallimento. Significa solo che tutto ci\u00f2 che stavo cercando di recuperare non \u00e8 stato trovato.<\/p>\n<h3>3 Gestire il fallimento<\/h3>\n<p>D&#8217;altra parte, ci sono momenti in cui qualcosa pu\u00f2 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-02-handle-failure-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fallire<\/a><\/strong>. Il motivo per cui ci\u00f2 accade pu\u00f2 essere dovuto a una serie di motivi e per comprenderlo correttamente, vale la pena esaminare gli argomenti forniti dal callback, vale a dire lo <strong>stato<\/strong> e l&#8217; <strong>errore<\/strong>.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM like flashing the first image.\n      $('img:first').fadeTo('fast', 0.5, function() {\n        $(this).fadeTo('fast', 1);\n      });\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      cosole.log(error);\n    })\n    .always(function() {\n      \/\/ ...\n    });\n}\n<\/code><\/pre>\n<p>Non posso fornire esempi concreti qui perch\u00e9 ogni API \u00e8 diversa; tuttavia, consiglio almeno di scrivere i dati sulla console in modo da poter capire cosa sta succedendo e come gestirlo con grazia a livello di codice.<\/p>\n<h3>4 Gestire il caso incondizionato<\/h3>\n<p>In questo caso particolare, questa funzione si attiver\u00e0 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-03-handle-always-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">indipendentemente<\/a><\/strong> dal fatto che qualcosa sia andato a buon fine o meno.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM like flashing the first image.\n      $('img:first').fadeTo('fast', 0.5, function() {\n        $(this).fadeTo('fast', 1);\n      });\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      console.log(error);\n    })\n    .always(function() {\n      \/\/ Regardless of what happens, this is where you can provide the user feedback.\n    });\n}\n<\/code><\/pre>\n<p>Questa funzione non \u00e8 qualcosa di cui potresti aver sempre bisogno (nessun gioco di parole), ma \u00e8 una solida opzione, ad esempio, per nascondere una barra di avanzamento o visualizzare qualcosa sull&#8217;interfaccia utente. Questo pu\u00f2 fornire all&#8217;utente un po&#8217; di feedback sul fatto che la richiesta ha completato il suo lavoro (di nuovo, indipendentemente dal fallimento o dall&#8217;esito positivo).<\/p>\n<h3>5 Gestisci il successo, ancora<\/h3>\n<p>Infine, il metodo <strong>done<\/strong> \u00e8 molto simile al metodo del successo, ma pensa che sia destinato a essere chiamato una seconda volta.<\/p>\n<p>Ci\u00f2 significa che dopo che la risposta \u00e8 tornata dal server con l&#8217; argomento <strong>response<\/strong>, la stessa cosa si attiver\u00e0 di nuovo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-04-handle-success-again-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una volta che tutto il resto \u00e8 stato completato<\/a>.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM.\n    })\n    .done(function(response) {\n      \/\/ Display any additional changes you may want to make based on the respnse.\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      console.log(error);\n    })\n    .always(function() {\n      \/\/ Regardless of what happens, this is where you can provide the user feedback.\n    });\n}\n<\/code><\/pre>\n<p>Questo ti d\u00e0 un&#8217;altra possibilit\u00e0 di fare tutto ci\u00f2 che vuoi fare con l&#8217;argomento della risposta ancora una volta prima che tutto sia completato.<\/p>\n<p>Lo uso raramente, ma ci sono stati momenti in cui ho voluto rimuovere un elemento solo dopo che qualcosa \u00e8 stato fatto, tutte le altre elaborazioni sono state eseguite e la risposta ha avuto successo.<\/p>\n<h2>Forse non ti serve tutto<\/h2>\n<p>Ovviamente, gran parte del codice sopra \u00e8 solo per una demo su come gestire le richieste. Ma lo scopo \u00e8 mostrare come gestire tale richiesta senza dover impostare intervalli per impilare le richieste. Invece, si sfruttano le funzioni preesistenti per, ad esempio, chiamare di nuovo la funzione se si verifica un errore.<\/p>\n<p>Ad ogni modo, questo potrebbe essere eccessivo per alcuni, ma per altri che sono abituati a usare <strong>setInterval<\/strong>, potrebbe essere un modo molto migliore per gestire le richieste Ajax che non si accumulano e inviare la stessa richiesta al server quando una risposta \u00e8 gi\u00e0 stata gestito.<\/p>\n<p>E in definitiva, questo \u00e8 l&#8217;obiettivo: codice efficiente che recuperi le informazioni di cui abbiamo bisogno senza impantanare l&#8217;API di terze parti o il browser del nostro utente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come possiamo lavorare correttamente con le richieste Ajax in modo da non accumulare risorse del server.<\/p>\n","protected":false},"author":1,"featured_media":164534,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,731,720,844,865],"tags":[1168],"class_list":["post-230542","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-javascript-6","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230542","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=230542"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230542\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164534"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}