{"id":229463,"date":"2022-11-05T16:50:00","date_gmt":"2022-11-05T13:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229463"},"modified":"2022-11-09T07:12:01","modified_gmt":"2022-11-09T04:12:01","slug":"ameliorations-de-la-lisibilite-de-wp_query-pour-la-maintenance","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ameliorations-de-la-lisibilite-de-wp_query-pour-la-maintenance\/","title":{"rendered":"Am\u00e9liorations de la lisibilit\u00e9 de WP_Query (pour la maintenance)"},"content":{"rendered":"\n<p>Travailler avec <a href=\"https:\/\/tommcfarlin.com\/passing-variables-in-wordpress-wp-query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>, en particulier lorsque vous effectuez un travail personnalis\u00e9 en dehors de l&rsquo;habituel &quot;obtenir des messages et les afficher sur un mod\u00e8le&quot; peut \u00eatre puissant. Cela est particuli\u00e8rement vrai pour certains des arguments avanc\u00e9s (comme utiliser <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a>, par exemple) .<\/p>\n<p>C&rsquo;est aussi plut\u00f4t bien que la mise en place du processus ait une mani\u00e8re standard de faire les choses. \u00c0 savoir:<\/p>\n<ol>\n<li>D\u00e9finir les arguments,<\/li>\n<li>Instanciez WP_Query,<\/li>\n<li>V\u00e9rifiez s&rsquo;il y a des messages,<\/li>\n<li>Faites une boucle \u00e0 travers eux,<\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=g2JNxeWO_wA\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Terminez<\/a> -les .<\/li>\n<\/ol>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/g2JNxeWO_wA\" frameborder=\"0\"><\/iframe><\/div>\n<p>Mais si vous arrivez l\u00e0 o\u00f9 vous effectuez un travail avanc\u00e9, comme travailler avec un type de publication personnalis\u00e9 \u00e0 partir d&rsquo;une solution tierce, devoir charger des m\u00e9dias, d\u00e9terminer si quelque chose existe avant de travailler avec, alors cela peut \u00eatre un un peu plus compliqu\u00e9 \u00e0 travailler, n&rsquo;est-ce pas ?<\/p>\n<p>J&rsquo;ai trouv\u00e9 que, comme avec n&rsquo;importe quoi dans la programmation, le d\u00e9composer en modules beaucoup plus lisibles (ou fonctions ou pi\u00e8ces ou tout ce que vous voudriez les appeler) peut rendre le travail beaucoup plus facile.<\/p>\n<p>Voici donc une fa\u00e7on dont je travaille pour am\u00e9liorer la lisibilit\u00e9 de WP_Query dans une vari\u00e9t\u00e9 de choses que j&rsquo;ai faites r\u00e9cemment.<\/p>\n<h2>Am\u00e9liorations de la lisibilit\u00e9 de WP_Query<\/h2>\n<p>Avant de parcourir un exemple, il convient de souligner qu&rsquo;il y a certaines choses que la fa\u00e7on dont WP_Query est configur\u00e9 que nous ne pouvons pas faire.<\/p>\n<p>Par exemple, une fois la requ\u00eate instanci\u00e9e, nous ne pourrons peut-\u00eatre pas faire des choses beaucoup plus avanc\u00e9es avec (je veux dire, mettre en place des tests unitaires qui ne n\u00e9cessitent pas le c\u0153ur de WordPress va \u00eatre impossible).<\/p>\n<p>C&rsquo;est le visage de celui qui ne peut pas suivre votre code.<\/p>\n<p>Cela dit, voici un exemple de ce \u00e0 quoi cela peut ressembler lorsque vous d\u00e9marrez, puis comment il peut \u00eatre refactoris\u00e9 pour avoir des fonctions plus petites, chacune \u00e9tant plus intentionnelle qu&rsquo;une longue m\u00e9thode.<\/p>\n<h3>Un exemple<\/h3>\n<p>Pour cet article, disons que j&rsquo;ai besoin d&rsquo;interroger la base de donn\u00e9es pour tous les articles et articles publi\u00e9s et que je souhaite les ordonner par ID.<\/p>\n<p>Ensuite, je veux d\u00e9terminer si un outil tiers lui a attribu\u00e9 des m\u00e9tadonn\u00e9es qui correspondent \u00e0 un mod\u00e8le que je peux ensuite attribuer par programme en fonction d&rsquo;un th\u00e8me que j&rsquo;ai.<\/p>\n<p>Peut-\u00eatre que la version initiale du code pourrait ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-00-wp-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Assume this is defined within the context of a class.\nconst MAPPING = [\n        'employers'       =&gt; 'page-past-word.php',\n        'biography'       =&gt; 'page-biography.php',\n        'accomplishments' =&gt; 'page-csv.php',\n    ];\n\n\/* Snip the rest of the class for brevity *\/\n\npublic function map_templates() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $template_query = new WP_Query( $args );\n\n    if ($template_query-&gt;have_posts()) {\n        while ($template_query-&gt;have_posts()) {\n            $template_query-&gt;the_post();\n\n            $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n            if ('' === $template_id) {\n                continue;\n            }\n\n                \/\/ The third-party's template post name can be used to map our custom template.\n            $template_info = get_post( $template_id );\n            $template_name = $template_info-&gt;post_name;\n\n            if (isset( self::MAPPING[ $template_name ])) {\n\n                $template_file = self::MAPPING[ $template_name ];\n                update_post_meta( $post_id, '_wp_page_template', $template_file );\n            }\n        }\n    }\n}\n<\/code><\/pre>\n<p>C&rsquo;est beaucoup de code pour faire pas mal de travail pour une fonction. \u00c0 tout le moins, il expose tout ce qui doit arriver, n&rsquo;est-ce pas ?<\/p>\n<p>Avant d&rsquo;aller plus loin, notez que le tableau de mappage n&rsquo;est qu&rsquo;un exemple, mais les cl\u00e9s repr\u00e9sentent la cl\u00e9 m\u00e9ta pour <strong>le mapper<\/strong>, et cela nous aide \u00e0 mapper la d\u00e9finition de la\u00a0 valeur <strong>_wp_page_template<\/strong> quand vient le temps de le mapper aux fichiers de mod\u00e8le WordPress r\u00e9els.<\/p>\n<p>Alors, comment cela peut-il \u00eatre d\u00e9compos\u00e9?<\/p>\n<h3>1 Coup d&rsquo;envoi<\/h3>\n<p>La premi\u00e8re chose que nous voulons faire est de cr\u00e9er une fonction qui met le tout en mouvement. Vous pouvez choisir de le faire de plusieurs mani\u00e8res.<\/p>\n<p>Voici comment j&rsquo;ai choisi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-01-map-page-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de le faire<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>En termes simples, il utilisera quelques fonctions d&rsquo;assistance &#8211; que je documenterai toutes ci-dessous &#8211; puis attribuera les mod\u00e8les que nous avons dans le tableau de mappage d\u00e9fini ci-dessus.<\/p>\n<h3>2 Charger les publications et les pages<\/h3>\n<p>Naturellement, la premi\u00e8re chose que nous voulons faire est de configurer une fonction \u00e0 appeler qui renverra les r\u00e9sultats de la requ\u00eate\u00a0:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_posts_and_pages() {\n\n  $args = [\n    'post_type'      =&gt; array( 'post', 'page' ),\n    'post_status'    =&gt; 'publish',\n    'orderby'        =&gt; 'ID',\n    'order'          =&gt; 'ASC',\n    'posts_per_page' =&gt; -1,\n  ];\n  $posts = new WP_Query( $args );\n\n  return $posts;\n}\n<\/code><\/pre>\n<p>Cela renvoie les r\u00e9sultats de la requ\u00eate. De cette fa\u00e7on, nous pouvons d\u00e9terminer si nous devons effectuer des travaux suppl\u00e9mentaires que nous disons dans l&rsquo;essentiel \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente\u00a0:<\/p>\n<pre><code>&lt;?php\n\npublic function map_page_templates() {\n\n  $posts = $this-&gt;load_posts_and_pages();\n  if ($posts-&gt;have_posts()) {\n    $this-&gt;assign_templates( $posts );\n  }\n}<\/code><\/pre>\n<p>Si ce n&rsquo;est pas le cas, nous avons termin\u00e9. Sinon, \u00e9videmment, on continue.<\/p>\n<h3>3 R\u00e9cup\u00e9rer l&rsquo;ID de mod\u00e8le tiers<\/h3>\n<p>Ensuite, l&rsquo;id\u00e9e d&rsquo;attribuer des mod\u00e8les &#8211; comme indiqu\u00e9 dans le code ci-dessus &#8211; semble assez simple, mais il y a quelques choses que nous devons faire en premier\u00a0:<\/p>\n<ol>\n<li>parcourir les messages,<\/li>\n<li>r\u00e9cup\u00e9rez l&rsquo;ID tiers du mod\u00e8le,<\/li>\n<li>r\u00e9cup\u00e9rez le nom du mod\u00e8le tiers,<\/li>\n<li>assignez le mod\u00e8le \u00e0 partir de la constante de mappage d\u00e9finie pr\u00e9c\u00e9demment dans la classe.<\/li>\n<\/ol>\n<p>L&rsquo;it\u00e9ration initiale de la fonction peut ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-03-assign-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_templates( WP_Query $posts) {\n\n  while ($posts-&gt;have_posts()) {\n    $posts-&gt;the_post();\n\n    $template_id = $this-&gt;get_template_id( get_the_ID() );\n    if ('' === $template_id) {\n      continue;\n    }\n\n    $template_name = $this-&gt;get_template_name( $template_id );\n    if (null === $template_name) {\n      continue;\n    }\n\n    $this-&gt;assign_template( get_the_ID(), $template_name );\n  }\n  wp_reset_postdata();\n}\n<\/code><\/pre>\n<p>Mais comme vous pouvez le voir, il existe encore des fonctions d&rsquo;assistance qui ont besoin de d\u00e9finitions. Des choses comme la possibilit\u00e9 d&rsquo;obtenir l&rsquo;ID du mod\u00e8le, le nom du mod\u00e8le et, finalement, d&rsquo;attribuer le mod\u00e8le.<\/p>\n<p>Notez cependant que si l&rsquo;une des fonctions d&rsquo;assistance ne renvoie pas de valeur utile, nous continuons la boucle. Ceci est n\u00e9cessaire si ce n&rsquo;est pour une autre raison que de s&rsquo;assurer que nous n&rsquo;essayons pas de mapper des mod\u00e8les qui n&rsquo;existent pas (mais je trouve que cela facilite \u00e9galement la lecture).<\/p>\n<h3>4 Trouver le fichier auquel l&rsquo;ID de mod\u00e8le correspond<\/h3>\n<p>Ensuite, une petite fonction peut \u00eatre utilis\u00e9e pour examiner l&rsquo;ID de mod\u00e8le tiers et d\u00e9terminer si nous pouvons mapper cette valeur sur les pages qui existent <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-04-get-template-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dans notre base de donn\u00e9es<\/a>.<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_id( $post_id) {\n\n  $template_id = get_post_meta( $post_id, 'third_party_template_id', true );\n  return $template_id;\n}\n<\/code><\/pre>\n<p>Si ce n&rsquo;est pas le cas, nous pouvons renvoyer une cha\u00eene vide, puis demander \u00e0 la fonction qui a invoqu\u00e9 cette v\u00e9rification particuli\u00e8re de voir si cela vaut la peine de continuer avec la boucle que nous avons d\u00e9finie.<\/p>\n<h3>5 Saisissez le nom du mod\u00e8le<\/h3>\n<p>En supposant que nous ayons un ID de publication valide, nous devons maintenant <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-05-get-template-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">r\u00e9cup\u00e9rer le nom du mod\u00e8le<\/a> \u00e0 partir du tableau de mappage d\u00e9fini plus t\u00f4t dans la publication\u00a0:<\/p>\n<pre><code>&lt;?php\n\nprivate function get_template_name( $template_id) {\n\n  $template_info = get_post( $template_id );\n  $template_name = $template_info-&gt;post_name;\n\n  if (isset( self::MAPPING[ $template_name ])) {\n    return $template_name;\n  } else {\n    return null;\n  }\n}\n<\/code><\/pre>\n<p>Voici le truc\u00a0: soit nous allons renvoyer le nom du mod\u00e8le, soit nous allons renvoyer une valeur nulle. Encore une fois, c&rsquo;est pour que nous puissions d\u00e9terminer si nous devons continuer avec la boucle d&rsquo;attribution de mod\u00e8les ou non.<\/p>\n<h3>6 Affectez le mod\u00e8le<\/h3>\n<p>Enfin, nous pouvons r\u00e9cup\u00e9rer l&rsquo;ID du mod\u00e8le fourni par le tiers et l&rsquo;utiliser pour le <a href=\"https:\/\/gist.github.com\/tommcfarlin\/90b954c3afde140c8573d1934172537f#file-06-assign-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mapper au fichier<\/a> que nous avons inclus avec notre travail, comme indiqu\u00e9 pr\u00e9c\u00e9demment dans l&rsquo;article\u00a0:<\/p>\n<pre><code>&lt;?php\n\nprivate function assign_template( $post_id, $template_name) {\n\n  $template_file = self::MAPPING[ $template_name ];\n  update_post_meta( $post_id, '_wp_page_template', $template_file );\n}\n<\/code><\/pre>\n<p>Et c&rsquo;est finalement ainsi que vous pouvez cr\u00e9er un code et des fonctions beaucoup plus petits, plus faciles \u00e0 lire et \u00e0 utiliser lorsque vous travaillez avec des requ\u00eates l\u00e9g\u00e8rement plus compliqu\u00e9es.<\/p>\n<h2>Et donc, des am\u00e9liorations de lisibilit\u00e9<\/h2>\n<p>Pour ceux qui ont l&rsquo;habitude d&rsquo;\u00e9crire, de lire de longues m\u00e9thodes ou de faire des choses comme la plupart des tutoriels sur le Web montrent comment faire les choses dans WordPress, cela peut ressembler \u00e0 beaucoup de code inutile.<\/p>\n<p>Mais consid\u00e9rez ceci :<\/p>\n<ol>\n<li>Les m\u00e9thodes plus longues sont plus difficiles \u00e0 lire,<\/li>\n<li>Ils peuvent \u00eatre plus difficiles \u00e0 d\u00e9boguer,<\/li>\n<li>Et ils ne d\u00e9composent pas le probl\u00e8me en \u00e9l\u00e9ments plus g\u00e9rables.<\/li>\n<\/ol>\n<p>Bien s\u00fbr, j&rsquo;aimerais diviser cela en encore plus de classes avec leurs responsabilit\u00e9s, et je pense que cela peut \u00eatre fait, mais \u00e9tant donn\u00e9 la nature de WP_Query, cela n\u00e9cessiterait un peu plus de travail.<\/p>\n<p>J&rsquo;ai donc essay\u00e9 de trouver le plus de terrain d&rsquo;entente possible.<\/p>\n<p>Si vous travaillez avec des utilisations m\u00eame l\u00e9g\u00e8rement plus avanc\u00e9es de WP_Query, je vous recommande au moins d&rsquo;envisager de le d\u00e9composer en plus petits morceaux.<\/p>\n<p>Cela aide \u00e0 prendre soin de la lisibilit\u00e9, potentiellement de toute maintenabilit\u00e9, et \u00e0 \u00e9crire un code plus propre plut\u00f4t qu&rsquo;une longue m\u00e9thode avec trop de conditions et s&rsquo;appuyant sur une vari\u00e9t\u00e9 d&rsquo;autres donn\u00e9es.<\/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>Travailler avec la lisibilit\u00e9 WP_Query peut \u00eatre difficile. Voici un exemple de la fa\u00e7on dont je d\u00e9compose l&rsquo;utilisation de l&rsquo;API dans certains de mes propres travaux.<\/p>\n","protected":false},"author":1,"featured_media":220946,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,862],"tags":[1167,1167],"class_list":["post-229463","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229463","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=229463"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229463\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/220946"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}