{"id":230697,"date":"2022-12-06T16:24:00","date_gmt":"2022-12-06T13:24:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230697"},"modified":"2022-12-06T16:24:08","modified_gmt":"2022-12-06T13:24:08","slug":"sur-lecriture-de-fonctions-wordpress-lisibles","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/sur-lecriture-de-fonctions-wordpress-lisibles\/","title":{"rendered":"Sur l&rsquo;\u00e9criture de fonctions WordPress lisibles"},"content":{"rendered":"\n<p>L&rsquo;une des choses que je trouve toujours int\u00e9ressantes (\u00e0 la fois du point de vue de la programmation et du point de vue de WordPress), est la suivante\u00a0:<\/p>\n<p>J&rsquo;aime garder le code s\u00e9par\u00e9 de sorte que le code responsable de l&rsquo;interaction avec WordPress soit rel\u00e9gu\u00e9 \u00e0 son espace de noms tandis que le reste de notre code est plac\u00e9 de mani\u00e8re appropri\u00e9e ailleurs.<\/p>\n<p>Je pense que c&rsquo;est pourtant <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fr\/un-guide-simple-pour-organiser-des-cours-centres-sur-wordpress\/\" title=\"\u00e9vident .\">\u00e9vident .<\/a><\/strong><\/p>\n<p>Quand il s&rsquo;agit d&rsquo;\u00e9crire du code, cependant, cela ne veut pas dire qu&rsquo;il faut se contenter de la fa\u00e7on dont nous \u00e9crivons nos classes et les organisons ensuite. Qu&rsquo;en est-il des choses \u00e0 un niveau l\u00e9g\u00e8rement plus granulaire\u00a0?<\/p>\n<p>Autrement dit, que se passerait-il si nous devions consid\u00e9rer les m\u00e9thodes comme faisant partie d&rsquo;un ensemble plus large et nous assurer qu&rsquo;elles font \u00e9galement bien leur travail\u00a0? Bien s\u00fbr, des gens comme <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> ont \u00e9crit sur ce genre de choses pendant la majeure partie de leur carri\u00e8re et l&rsquo;ont pr\u00each\u00e9 \u00e0 des gens comme nous.<\/p>\n<p>Mais ces concepts sont quelque chose que vous commencez simplement \u00e0 faire et que vous les appliquez ensuite pour de bon. Les paradigmes changent, nous sommes meilleurs aujourd&rsquo;hui qu&rsquo;hier, et il peut y avoir plusieurs fa\u00e7ons de r\u00e9aliser le m\u00eame genre de chose.<\/p>\n<p>Ainsi, lorsqu&rsquo;il s&rsquo;agit de cr\u00e9er des fonctions WordPress lisibles pour un domaine sp\u00e9cifique, \u00e0 quoi cela pourrait-il ressembler ?<\/p>\n<h2>Fonctions WordPress lisibles<\/h2>\n<p>Pour ceux qui connaissent les principes <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID<\/a> ou tout ce qui parle d&rsquo;\u00e9crire un bon code, l&rsquo;une des choses sur lesquelles beaucoup de ces gens \u00e9crivent est la longueur \u00e0 laquelle une m\u00e9thode devrait \u00eatre.<\/p>\n<p>J&rsquo;ai tendance \u00e0 les consid\u00e9rer comme des r\u00e8gles plut\u00f4t que comme des lois parce que parfois, les m\u00e9thodes ne peuvent pas \u00eatre aussi courtes. Je veux dire, je suppose qu&rsquo;ils le pourraient, mais \u00e0 un moment donn\u00e9, cela ressemble \u00e0 de la microgestion de code, non\u00a0?<\/p>\n<p>Et faire quelque chose pour le plaisir de faire est une chose, mais faire quelque chose pour le plaisir d&rsquo;une programmation significative en est une autre. Je choisirai le plus tard \u00e0 chaque fois.<\/p>\n<p>Quoi qu&rsquo;il en soit, voici un exemple\u00a0: disons que vous avez du code appel\u00e9 via Ajax et avant de poursuivre l&rsquo;op\u00e9ration, vous devez savoir si un type de publication personnalis\u00e9 existe.<\/p>\n<p>Les \u00e9tapes pour faire quelque chose comme \u00e7a pourraient aller comme suit :<\/p>\n<ul>\n<li>lancer l&rsquo;appel Ajax,<\/li>\n<li>v\u00e9rifier la s\u00e9curit\u00e9 nonce pour v\u00e9rifier qu&rsquo;il s&rsquo;agit d&rsquo;une demande valide,<\/li>\n<li>v\u00e9rifier si des donn\u00e9es existent,<\/li>\n<li>si c&rsquo;est le cas, renvoie un message de r\u00e9ussite\u00a0; sinon, renvoie un message d&rsquo;erreur.<\/li>\n<\/ul>\n<p>Tout cela peut \u00eatre fait dans un seul message, bien s\u00fbr, mais supposons que nous voulions \u00e9crire cela dans une s\u00e9rie d&rsquo;appels faciles \u00e0 lire o\u00f9 le code s&rsquo;auto-documente, dans une certaine mesure (cela ne veut pas dire que je Je suis contre les commentaires &#8211; je ne le suis pas du tout, mais cela ne veut pas dire que nous voulons que notre code ne soit pas clair, n&rsquo;est-ce pas\u00a0?).<\/p>\n<p>Tout d&rsquo;abord, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;appel Ajax<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Ensuite, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nous avons une fonction<\/a><\/strong> c\u00f4t\u00e9 serveur pour v\u00e9rifier explicitement le nonce de s\u00e9curit\u00e9 (ceci, bien s\u00fbr, suppose que vous le configurez correctement sur le front-end):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>Apr\u00e8s cela, nous voulons <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e9rifier si les donn\u00e9es existent\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>\u00c0 partir de l\u00e0, nous sommes alors en mesure de travailler avec l&rsquo;objet de r\u00e9ponse Ajax en \u00e9valuant sa propri\u00e9t\u00e9 de succ\u00e8s et en r\u00e9agissant en cons\u00e9quence.<\/p>\n<h2>Aller plus loin<\/h2>\n<p>Allons un peu plus loin et disons que les produits existent et que nous voulons r\u00e9cup\u00e9rer tous leurs identifiants de publication. Faire cela avec WP_Query est assez facile mais disons, pour le plaisir, nous voulons nous interfacer directement avec la base de donn\u00e9es.<\/p>\n<p>Notez qu&rsquo;il s&rsquo;agit davantage d&rsquo;un exercice visant \u00e0 montrer une mani\u00e8re de faire quelque chose plut\u00f4t que de plaider en faveur de l&rsquo;utilisation <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de $wpdb<\/a><\/strong> sur <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. C&rsquo;est le contenu d&rsquo;un tout autre article.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.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-162675-61e7429944302.png\" alt=\"Sur l&#039;\u00e9criture de fonctions WordPress lisibles\"><\/a><\/p>\n<p>Quoi qu&rsquo;il en soit, nous avons donc d\u00e9termin\u00e9 que les donn\u00e9es existent. Prenons donc un tableau de tous les ID de publication et renvoyons-le ou un tableau vide. Cela ressemblerait peut-\u00eatre <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>Une fois les valeurs retourn\u00e9es, nous pouvons alors les op\u00e9rer comme bon nous semble.<\/p>\n<h2>Quel est le but de tout cela ?<\/h2>\n<p>D&rsquo;une mani\u00e8re g\u00e9n\u00e9rale, c&rsquo;est pour nous aider \u00e0 penser au code de telle mani\u00e8re que nous soyons capables de le lire presque aussi pr\u00e8s que possible du mot \u00e9crit. C&rsquo;est-\u00e0-dire que nous pouvons pointer vers un morceau de code comme par exemple\u00a0:<\/p>\n<blockquote>\n<p>D&rsquo;abord, nous allons voir si quelque chose existe. Sinon, nous enverrons une erreur\u00a0; sinon, nous allons r\u00e9cup\u00e9rer les donn\u00e9es et ensuite travailler dessus.<\/p>\n<\/blockquote>\n<p>Certes, je parle en termes moins concrets ici, mais c&rsquo;est parce que je ne sais pas n\u00e9cessairement sur quoi vous travaillez, pas plus que vous ne savez sur mon travail. Mais vous voyez l&rsquo;id\u00e9e, n&rsquo;est-ce pas ?<\/p>\n<p>Et de plus, si vous cherchez un code de test unitaire d\u00e9coupl\u00e9 de WordPress, cela peut \u00eatre fait gr\u00e2ce \u00e0 l&rsquo;utilisation d&rsquo;interfaces qui simulent les fonctions ou m\u00eame qui ex\u00e9cutent des requ\u00eates directes sur la base de donn\u00e9es sans avoir besoin d&rsquo;utiliser WordPress.<\/p>\n<p>Mais, comme pour certains des points mentionn\u00e9s ci-dessus, c&rsquo;est le sujet d&rsquo;un autre article.<\/p>\n<p>J&rsquo;\u00e9cris actuellement un livre \u00e9lectronique (avec une vari\u00e9t\u00e9 d&rsquo;autres contenus premium). Si vous \u00eates int\u00e9ress\u00e9, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">regardez ce que vous obtenez<\/a>.<\/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>Que signifie r\u00e9ellement \u00e9crire des fonctions WordPress lisibles ? Il n&rsquo;y a pas de bonne r\u00e9ponse unique, parfaite et pr\u00e9cise, mais peut-\u00eatre que cette approche vous aidera.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[862],"tags":[1167],"class_list":["post-230697","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230697","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=230697"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230697\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}