{"id":228865,"date":"2022-10-22T18:20:00","date_gmt":"2022-10-22T15:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228865"},"modified":"2022-11-09T04:35:24","modified_gmt":"2022-11-09T01:35:24","slug":"refactoring-des-plugins-wordpress-un-petit-exemple","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/refactoring-des-plugins-wordpress-un-petit-exemple\/","title":{"rendered":"Refactoring des plugins WordPress : un petit exemple"},"content":{"rendered":"\n<p>L&rsquo;une des fa\u00e7ons dont les plugins WordPress se pr\u00e9sentent est que, du moins dans mon cas, ils commencent comme un ensemble de fonctions utilis\u00e9es pour aider \u00e0 un objectif particulier pour un projet donn\u00e9. \u00c0 partir de l\u00e0, vous pensez &quot;H\u00e9, peut-\u00eatre que quelqu&rsquo;un d&rsquo;autre trouvera cela utile.&quot;<\/p>\n<p>Au moins, c&rsquo;est mon exp\u00e9rience plus souvent qu&rsquo;autrement.<\/p>\n<p>Mais le fait est qu&rsquo;avant de le publier pour que d&rsquo;autres personnes l&rsquo;essaient, vous devez passer par le processus de nettoyage du code. Je ne parle pas non plus de refactoriser les plugins WordPress \u2013 du moins pas encore.<\/p>\n<p>Je parle de prendre le code, de l&rsquo;amener \u00e0 quelque chose qui fonctionnera comme un plugin WordPress, puis \u00e9ventuellement de refactoriser le code.<\/p>\n<h2>Refactorisation des plugins WordPress<\/h2>\n<p>Passer par l&rsquo;ensemble du processus de refactorisation des plugins WordPress &#8211; sans parler d&rsquo;un seul plugin WordPress &#8211; peut \u00eatre ardu, mais partager comment refactoriser une partie d&rsquo;un plugin est quelque chose de faisable.<\/p>\n<p>Je vais donc utiliser un exemple de la fa\u00e7on dont j&rsquo;utilisais quelque chose r\u00e9cemment (avec le code abstrait un peu pour ne pas prendre la peine de pr\u00e9ciser un projet donn\u00e9).<\/p>\n<p>Tracer la sortie id\u00e9ale des options.<\/p>\n<p>Avant de le faire, cependant, je pense qu&rsquo;il est important de partager mon processus peut diff\u00e9rer &#8211; ou probablement &#8211; diff\u00e9rer du v\u00f4tre (puisque beaucoup d&rsquo;entre nous ont des processus diff\u00e9rents).<\/p>\n<ol>\n<li>Concevoir le composant (oui, m\u00eame pas le plugin complet) dans un notebook,<\/li>\n<li>\u00c9tablissez une liste de contr\u00f4le des cas d&rsquo;utilisation dans lesquels il devrait r\u00e9ussir et quand il devrait \u00e9chouer,<\/li>\n<li>\u00c9crivez quelles donn\u00e9es sont n\u00e9cessaires, comment elles sont n\u00e9cessaires et quand elles doivent \u00eatre ignor\u00e9es<\/li>\n<li>Convertissez tout ce qui pr\u00e9c\u00e8de en code.<\/li>\n<\/ol>\n<p>Bien s\u00fbr, je ne convertis pas tout cela litt\u00e9ralement en code, mais vous voyez l&rsquo;id\u00e9e. Peut-\u00eatre que la fa\u00e7on la plus succincte de le dire est la suivante :<\/p>\n<ul>\n<li>Commencez par une longue m\u00e9thode qui sert le cas d&rsquo;utilisation id\u00e9al. Ensuite, refactorisez ce code afin que les fonctions soient plus petites et tiennent compte des cas dans lesquels le r\u00e9sultat \u00e9chouerait.<\/li>\n<\/ul>\n<p>Cela dit, voici \u00e0 quoi pourrait ressembler le code.<\/p>\n<h3>1 \u00c9crire pour le cas d&rsquo;utilisation id\u00e9al<\/h3>\n<p>Dans cet exemple, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le cas d&rsquo;utilisation id\u00e9al<\/a> est lorsque l&rsquo;utilisateur charge les options, les options sont pr\u00e9sentes, puis il doit effectuer une action si les options ont certaines valeurs.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Cette partie devrait \u00eatre facile \u00e0 lire, mais elle ne tient compte que du chemin id\u00e9al dans le code.<\/p>\n<h3>2 Soyez un peu d\u00e9fensif<\/h3>\n<p>Ensuite, j&rsquo;aime m&rsquo;assurer que les options sont d\u00e9finies avant d&rsquo;essayer de les lire. Dans certains cas, vous souhaiterez peut-\u00eatre afficher un avis, lever une exception ou consigner des informations.<\/p>\n<p>Dans cet exemple, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">je vais juste revenir<\/a> car il est facile \u00e0 lire et peut \u00eatre plus facilement ajust\u00e9 pour votre usage.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Donc, cela g\u00e8re les options, mais qu&rsquo;en est-il du cas o\u00f9 les options sont d\u00e9finies mais n&rsquo;ont pas les valeurs que nous attendons\u00a0? Cela signifie que nous devons \u00e9galement v\u00e9rifier qu&rsquo;ils le font. Et, si ce n&rsquo;est pas le cas, ignorez-les, retournez, enregistrez une erreur, lancez une exception, etc.<\/p>\n<p>Vous savez: La m\u00eame chose que ci-dessus. Sauf que, dans ce cas, je n&rsquo;entreprendrai aucune action \u00e0 moins que le code ne contienne l&rsquo;information id\u00e9ale.<\/p>\n<h3>3 Devenir un peu long<\/h3>\n<p>\u00c0 ce stade, la m\u00e9thode devient un peu longue et devient plus difficile \u00e0 lire. Bien s\u00fbr, si vous \u00eates un programmeur exp\u00e9riment\u00e9, vous pouvez faire valoir que &quot;C&rsquo;est du code, ce n&rsquo;est pas de l&rsquo;anglais&quot;, mais pourquoi ne pas viser \u00e0 le rendre un peu plus facile \u00e0 suivre\u00a0?<\/p>\n<p>De plus, cela facilite un peu le test. Mais cela d\u00e9passe le cadre de cet article. Prenons l&rsquo;\u00e9valuation des options comme premier exemple du code.<\/p>\n<ol>\n<li>C&rsquo;est quelque chose qui peut \u00eatre envelopp\u00e9 dans sa fonction qui non seulement isole cette v\u00e9rification, mais rend \u00e9galement l&rsquo;appel r\u00e9sultant un peu plus facile.<\/li>\n<li>Ensuite, prenez le deuxi\u00e8me bloc de code qui v\u00e9rifie les valeurs d&rsquo;option id\u00e9ales. Cela peut \u00e9galement \u00eatre abstrait pour les m\u00eames raisons ci-dessus.<\/li>\n<li>Et enfin, configurez une fonction pour vous assurer que les valeurs attendues sont d\u00e9finies pour chacune des <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valeurs sp\u00e9cifi\u00e9es<\/a>\u00a0:<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>Vous avez donc maintenant deux m\u00e9thodes plus petites encapsulant la m\u00eame v\u00e9rification que vous faisiez.<\/p>\n<h3>4 La fonction finale<\/h3>\n<p>\u00c0 ce stade, la fonction finale est beaucoup plus facile \u00e0 lire car elle comporte deux fonctions d&rsquo;assistance qui encapsulent leurs responsabilit\u00e9s tandis que <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">celle-ci revient \u00e0 \u00e9valuer le chemin id\u00e9al \u00e0<\/a> travers le code\u00a0:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Qu&rsquo;il suffise de dire que lorsqu&rsquo;il s&rsquo;agit de refactoriser les plugins WordPress, ce n&rsquo;est qu&rsquo;un exemple de la fa\u00e7on d&rsquo;en faire juste un segment. Mais c&rsquo;est un d\u00e9but, non ?<\/p>\n<h2>Des plugins entiers\u00a0?<\/h2>\n<p>N&rsquo;est-ce pas? Refactoriser les plugins WordPress n&rsquo;est pas une blague. Mais si vous commencez avec de petites fonctions comme celle-ci et progressez progressivement dans la base de code, cela devient plus facile.<\/p>\n<p>Et si vous passez du temps \u00e0 planifier le projet d\u00e8s le d\u00e9part, cela peut vous faire gagner beaucoup de temps en revenant en arri\u00e8re et en refactorisant ce genre de choses.<\/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>La refactorisation des plugins WordPress est un travail. Mais si vous commencez avec de petites fonctions et progressez progressivement dans la base de code, cela devient plus facile.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,748,811,862],"tags":[1167],"class_list":["post-228865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-open-source-projektmanagement-2","category-plugins-2","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228865","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=228865"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228865\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}