{"id":230228,"date":"2022-11-24T09:20:00","date_gmt":"2022-11-24T06:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230228"},"modified":"2022-11-09T20:41:09","modified_gmt":"2022-11-09T17:41:09","slug":"travailler-correctement-avec-les-requetes-ajax-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/travailler-correctement-avec-les-requetes-ajax-dans-wordpress\/","title":{"rendered":"Travailler correctement avec les requ\u00eates Ajax dans WordPress"},"content":{"rendered":"\n<p>Chaque fois que vous travaillez avec des API tierces, et que vous le faites de mani\u00e8re asynchrone, il y a toujours le risque que ce que vous demandez renverra un r\u00e9sultat ind\u00e9sirable.<\/p>\n<p>Peut-\u00eatre s&rsquo;agit-il d&rsquo;un code d&rsquo;erreur, peut-\u00eatre d&rsquo;un avertissement, ou peut-\u00eatre d&rsquo;un simple message disant quelque chose comme &quot;Nous traitons toujours votre demande de notre c\u00f4t\u00e9&quot;.<\/p>\n<p>Dans chaque cas, vous pouvez g\u00e9n\u00e9ralement les g\u00e9rer correctement c\u00f4t\u00e9 serveur et indiquer au c\u00f4t\u00e9 client comment le g\u00e9rer. Mais si vous avez affaire \u00e0 ce dernier cas, c&rsquo;est l\u00e0 que vous \u00eates bloqu\u00e9 par le traitement tiers\u00a0; il y a d&rsquo;autres choses que vous pouvez faire pour mieux g\u00e9rer cette situation.<\/p>\n<p>Par exemple, dans ce dernier cas, il vaut mieux attendre un peu puis refaire la requ\u00eate pour voir si l&rsquo;API a une r\u00e9ponse diff\u00e9rente pour vous.<\/p>\n<p>Mais ce faisant, il n\u00e9cessite Ajax qui n\u00e9cessite \u00e9videmment JavaScript. L&rsquo;une des m\u00e9thodes \u00e9videntes, mais plus dat\u00e9es, consiste \u00e0 utiliser setInterval.<\/p>\n<p>Le probl\u00e8me avec cela, cependant, est qu&rsquo;il cr\u00e9e une pile de requ\u00eates, puis, lorsque la r\u00e9ponse est pr\u00eate, chaque \u00e9l\u00e9ment de la pile recevra la m\u00eame r\u00e9ponse.<\/p>\n<p>Cela peut avoir un impact consid\u00e9rable sur n&rsquo;importe quel serveur donn\u00e9. Et il existe de meilleures fa\u00e7ons de proc\u00e9der.<\/p>\n<h2>Travailler correctement avec les requ\u00eates Ajax<\/h2>\n<p>Comme d&rsquo;habitude, puisque WordPress est livr\u00e9 avec jQuery, je vais l&rsquo;utiliser ; cependant, je vous invite \u00e9galement &#8211; si vous ne l&rsquo;avez pas d\u00e9j\u00e0 fait &#8211; \u00e0 regarder <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/AJAX\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajax dans ES6<\/a><\/strong> pour avoir une id\u00e9e de la fa\u00e7on de le faire de mani\u00e8re native.<\/p>\n<p>Quoi qu&rsquo;il en soit, l&rsquo;id\u00e9e est la suivante\u00a0: plut\u00f4t que de d\u00e9finir un intervalle, utilisez les fonctions Ajax int\u00e9gr\u00e9es pour \u00e9valuer correctement la r\u00e9ponse. Et seulement sous certaines conditions, relancez la fonction.<\/p>\n<p><a href=\"https:\/\/api.jquery.com\/jquery.post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Exemple: la m\u00e9thode $.post<\/a> de jQuery offre certaines fonctions qui peuvent \u00eatre utilis\u00e9es exactement pour cela. Par exemple, il propose des m\u00e9thodes telles que :<\/p>\n<ul>\n<li>Fini()<\/li>\n<li>\u00e9chouer()<\/li>\n<li>toujours()<\/li>\n<\/ul>\n<p>Et chacun de ceux-ci est destin\u00e9 \u00e0 \u00eatre ex\u00e9cut\u00e9 sous certaines conditions dont je montrerai momentan\u00e9ment quelques exemples de code.<\/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=\"Travailler correctement avec les requ\u00eates Ajax dans WordPress\" ><\/a><\/p>\n<p>Avant de faire cela, cependant, il est important de comprendre qu&rsquo;il y a plusieurs param\u00e8tres que j&rsquo;envoie et que je suppose que vous connaissez\u00a0:<\/p>\n<ul>\n<li>l&rsquo;URL WordPress Ajax (que je d\u00e9finirai comme acme.ajax_url),<\/li>\n<li>une URL vers la publication que nous consultons (qui sera stock\u00e9e dans une variable sUrl),<\/li>\n<li>et un nonce de s\u00e9curit\u00e9 que j&rsquo;appellerai acme.security<\/li>\n<\/ul>\n<p>Si l&rsquo;un des \u00e9l\u00e9ments ci-dessus n&rsquo;est pas clair, veuillez lire les pages li\u00e9es pour voir comment cela est r\u00e9alis\u00e9.<\/p>\n<p>Mais cela dit, voici l&rsquo;id\u00e9e derri\u00e8re la fa\u00e7on dont vous pouvez g\u00e9rer les r\u00e9ponses Ajax r\u00e9p\u00e9t\u00e9es sans setInterval.<\/p>\n<h3>1 Une fonction pour le travail<\/h3>\n<p>La premi\u00e8re chose que vous devez faire est d&rsquo;envelopper le travail que vous allez faire dans sa propre fonction. Cela signifie que vous pouvez l&rsquo;appeler de n&rsquo;importe o\u00f9 ailleurs dans l&rsquo;application c\u00f4t\u00e9 client ou m\u00eame dans le contexte d&rsquo;une minuterie (si absolument n\u00e9cessaire).<\/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\">Par exemple<\/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>Et, comme vous pouvez le voir, j&rsquo;ai avanc\u00e9 et supprim\u00e9 certaines des fonctions que j&rsquo;ai mentionn\u00e9es ci-dessus.<\/p>\n<h3>2 G\u00e9rer le succ\u00e8s<\/h3>\n<p>En cas de succ\u00e8s, vous pouvez utiliser <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-01-handle-success-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une fonction anonyme<\/a><\/strong> comme rappel pour la fonction <strong>$.post<\/strong>. L&rsquo;argument principal dont vous devriez vous pr\u00e9occuper est l&rsquo; argument de <strong>r\u00e9ponse .<\/strong><\/p>\n<p>En r\u00e8gle g\u00e9n\u00e9rale, j&rsquo;aime que mes r\u00e9ponses aient un attribut de <strong>r\u00e9ussite<\/strong> et un attribut d&rsquo; <strong>\u00e9chec<\/strong>. Cela facilite la gestion d&rsquo;un cas chaque fois que la r\u00e9ponse est compl\u00e8tement r\u00e9ussie, mais que les donn\u00e9es renvoy\u00e9es par le serveur ne correspondent pas \u00e0 ce que j&rsquo;attendais.<\/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>Cela ne signifie pas n\u00e9cessairement qu&rsquo;il y a eu un \u00e9chec. Cela signifie simplement que tout ce que je cherchais \u00e0 r\u00e9cup\u00e9rer n&rsquo;a pas \u00e9t\u00e9 trouv\u00e9.<\/p>\n<h3>3 G\u00e9rer l&rsquo;\u00e9chec<\/h3>\n<p>D&rsquo;un autre c\u00f4t\u00e9, il y a des moments o\u00f9 quelque chose peut <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-02-handle-failure-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e9chouer<\/a><\/strong>. La raison pour laquelle cela se produit peut \u00eatre pour un certain nombre de raisons et pour bien le comprendre, il vaut la peine d&rsquo;inspecter les arguments fournis par le rappel, \u00e0 savoir le <strong>status<\/strong> et le <strong>error<\/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>Je ne peux pas donner d&rsquo;exemples concrets ici car chaque API est diff\u00e9rente ; Cependant, je recommande au moins d&rsquo;\u00e9crire des donn\u00e9es sur la console afin que vous puissiez comprendre ce qui se passe et comment vous pouvez le g\u00e9rer avec \u00e9l\u00e9gance au niveau du code.<\/p>\n<h3>4 G\u00e9rer le cas inconditionnel<\/h3>\n<p>Dans ce cas particulier, cette fonction se d\u00e9clenchera, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-03-handle-always-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que<\/a><\/strong> quelque chose ait r\u00e9ussi ou non.<\/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>Cette fonction n&rsquo;est pas quelque chose dont vous pourriez toujours avoir besoin (sans jeu de mots), mais c&rsquo;est une option solide pour, par exemple, masquer une barre de progression ou afficher quelque chose sur l&rsquo;interface utilisateur. Cela peut donner \u00e0 l&rsquo;utilisateur un retour indiquant que la requ\u00eate a termin\u00e9 son travail (encore une fois, ind\u00e9pendamment de l&rsquo;\u00e9chec ou du succ\u00e8s).<\/p>\n<h3>5 G\u00e9rez le succ\u00e8s, encore une fois<\/h3>\n<p>Enfin, la m\u00e9thode <strong>done<\/strong> ressemble beaucoup \u00e0 la m\u00e9thode success mais consid\u00e9rez-la comme \u00e9tant destin\u00e9e \u00e0 \u00eatre appel\u00e9e une seconde fois.<\/p>\n<p>Cela signifie qu&rsquo;apr\u00e8s le retour de la r\u00e9ponse du serveur avec l&rsquo; argument de <strong>r\u00e9ponse<\/strong>, la m\u00eame chose se d\u00e9clenchera \u00e0 nouveau <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-04-handle-success-again-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une fois que tout le reste sera termin\u00e9<\/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>Cela vous donne une autre chance de faire tout ce que vous voulez faire avec l&rsquo;argument de r\u00e9ponse une fois de plus avant que tout ne soit termin\u00e9.<\/p>\n<p>Je l&rsquo;utilise rarement, mais il y a eu des moments o\u00f9 j&rsquo;ai voulu supprimer un \u00e9l\u00e9ment uniquement apr\u00e8s que quelque chose a \u00e9t\u00e9 fait, tous les autres traitements ont \u00e9t\u00e9 effectu\u00e9s et la r\u00e9ponse a r\u00e9ussi.<\/p>\n<h2>Peut-\u00eatre que vous n&rsquo;avez pas besoin de tout<\/h2>\n<p>De toute \u00e9vidence, une grande partie du code ci-dessus est juste pour une d\u00e9monstration sur la fa\u00e7on de g\u00e9rer les demandes. Mais le but est de montrer comment g\u00e9rer ladite requ\u00eate sans avoir besoin de d\u00e9finir des intervalles pour empiler les requ\u00eates. Au lieu de cela, vous tirez parti des fonctions pr\u00e9existantes pour, par exemple, appeler \u00e0 nouveau la fonction en cas d&rsquo;erreur.<\/p>\n<p>Quoi qu&rsquo;il en soit, cela peut \u00eatre exag\u00e9r\u00e9 pour certains, mais pour d&rsquo;autres qui ont l&rsquo;habitude d&rsquo;utiliser <strong>setInterval<\/strong>, cela peut \u00eatre une bien meilleure fa\u00e7on de g\u00e9rer les requ\u00eates Ajax qui ne s&#8217;empilent pas et d\u00e9clenchent la m\u00eame requ\u00eate au serveur lorsqu&rsquo;une r\u00e9ponse a d\u00e9j\u00e0 \u00e9t\u00e9 g\u00e9r\u00e9.<\/p>\n<p>Et finalement, c&rsquo;est l&rsquo;objectif\u00a0: un code efficace qui r\u00e9cup\u00e8re les informations dont nous avons besoin sans enliser l&rsquo;API tierce ou le navigateur de notre propre utilisateur.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment nous pouvons travailler correctement avec les requ\u00eates Ajax afin de ne pas empiler les ressources du serveur.<\/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":[915,717,728,841,862],"tags":[1167],"class_list":["post-230228","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-developpeur","category-javascript-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230228"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230228\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164534"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}