{"id":230688,"date":"2022-12-06T13:16:00","date_gmt":"2022-12-06T10:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230688"},"modified":"2022-11-09T23:32:43","modified_gmt":"2022-11-09T20:32:43","slug":"un-guide-simple-pour-organiser-des-cours-centres-sur-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/un-guide-simple-pour-organiser-des-cours-centres-sur-wordpress\/","title":{"rendered":"Un guide simple pour organiser des cours centr\u00e9s sur WordPress"},"content":{"rendered":"\n<p>L&rsquo;une des choses sur lesquelles j&rsquo;ai fait un effort beaucoup plus concert\u00e9, probablement plus que jamais auparavant, est la gestion de la s\u00e9paration des pr\u00e9occupations entre les classes responsables de l&rsquo;interface avec WordPress et celles charg\u00e9es de travailler avec le domaine probl\u00e9matique.<\/p>\n<p>Par exemple, disons que vous travaillez sur un plugin et qu&rsquo;il va communiquer avec une API tierce. De plus, ce plugin proposera \u00e9galement des menus, des types de publication, des taxonomies, etc. dans la zone d&rsquo;administration de WordPress.<\/p>\n<p>Il y a deux domaines de responsabilit\u00e9 ici :<\/p>\n<ol>\n<li>la zone responsable de la r\u00e9solution g\u00e9n\u00e9rale du probl\u00e8me,<\/li>\n<li>la zone responsable de l&rsquo;interfa\u00e7age avec WordPress.<\/li>\n<\/ol>\n<p>Vous pouvez faire valoir qu&rsquo;il est important de tester les zones qui communiquent avec WordPress, mais je sais aussi que ce sont des API \u00e9prouv\u00e9es qui ont leur propre ensemble de tests.<\/p>\n<p>Au lieu de cela, nous devrions nous concentrer sur les tests unitaires et s\u00e9parer notre logique m\u00e9tier de WordPress.<\/p>\n<p>Mais ce n&rsquo;est pas le propos de ce post. Au lieu de cela, il s&rsquo;agit plut\u00f4t d&rsquo;un moyen de pr\u00e9senter potentiellement un projet lorsqu&rsquo;une partie de celui-ci s&rsquo;interfacera avec WordPress.<\/p>\n<p>J&rsquo;ai parl\u00e9 de l&rsquo;importance et des avantages des espaces de noms dans des articles pr\u00e9c\u00e9dents afin de ne pas plonger trop profond\u00e9ment dans cette discussion ici.<\/p>\n<p>Au lieu de cela, je suis int\u00e9ress\u00e9 \u00e0 parler de l&rsquo;organisation des fichiers au niveau du syst\u00e8me de fichiers et au niveau de l&rsquo;espace de noms, afin qu&rsquo;ils soient clairement s\u00e9par\u00e9s dans leurs domaines de sp\u00e9cialisation et afin que nous puissions nous assurer que nous concentrons, disons, nos tests unitaires (et d&rsquo;autres tests) sur les zones les plus critiques.<\/p>\n<h3>R\u00e9sum\u00e9 des m\u00e9ta-bo\u00eetes<\/h3>\n<p>J&rsquo;aime m&rsquo;assurer que la structure de mon r\u00e9pertoire et de mes fichiers refl\u00e8te celle de mes espaces de noms. Bien s\u00fbr, cela aide \u00e0 l&rsquo;organisation des fichiers, mais aussi \u00e0 une organisation conceptuelle.<\/p>\n<p>Autrement dit, si je vais travailler avec des bo\u00eetes de m\u00e9ta, je sais que je peux probablement trouver les fichiers de bo\u00eete de m\u00e9ta dans un r\u00e9pertoire imbriqu\u00e9 avec le r\u00e9pertoire <strong>WordPress<\/strong> parent, puis dans un sous-r\u00e9pertoire <strong>Admin<\/strong> suivi d&rsquo;un r\u00e9pertoire <strong>MetaBox<\/strong>.<\/p>\n<p>\u00c0 cette fin, \u00e0 quoi pourrait ressembler un ensemble de classes con\u00e7ues pour travailler avec des m\u00e9ta-bo\u00eetes si nous \u00e9crivions du code pour elles de mani\u00e8re r\u00e9utilisable\u00a0? Compte tenu de ce que nous savons des m\u00e9ta-bo\u00eetes, nous savons que nous aurons probablement besoin des \u00e9l\u00e9ments suivants\u00a0:<\/p>\n<ul>\n<li>une classe abstraite qui d\u00e9finit le type de publication auquel chaque m\u00e9ta-bo\u00eete sera li\u00e9e,<\/li>\n<li>deux fonctions pour la bo\u00eete m\u00e9ta &#8211; une pour l&rsquo;enregistrer, une pour afficher le contenu,<\/li>\n<li>un r\u00e9pertoire pour contenir la vue ou la pr\u00e9sentation de la meta box,<\/li>\n<li>un fichier qui servira de ladite vue.<\/li>\n<\/ul>\n<p>Compte tenu des points ci-dessus, peut-\u00eatre que la structure du r\u00e9pertoire ressemblerait \u00e0 ceci\u00a0:<\/p>\n<\/p>\n<p>Ensuite, nous avons un code qui refl\u00e8te cette structure. Autrement dit, dans notre r\u00e9pertoire <strong>WordPress<\/strong>, nous aurions le sous-r\u00e9pertoire <strong>Admin<\/strong> puisque la bo\u00eete m\u00e9ta est affich\u00e9e dans la zone d&rsquo;administration de WordPress, et nous aurions le sous-r\u00e9pertoire <strong>View<\/strong> qui contiendrait le fichier responsable de l&rsquo;affichage des informations.<\/p>\n<p>Cela nous oblige \u00e0 cr\u00e9er quelques classes comme indiqu\u00e9 ci-dessus. Peut-\u00eatre que la classe de base abstraite <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-00-abstract-metabox-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemblerait \u00e0 ceci\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeWordPressAdminMetaBox;\n\nabstract class AbstractMetaBox\n{\n    protected $postType;\n\n    public function __construct()\n    {\n        $this-&gt;postType = 'acme_post_type';\n    }\n\n    abstract public function render();\n    abstract public function display();\n}\n<\/code><\/pre>\n<p>Ensuite, une impl\u00e9mentation concr\u00e8te \u00e9tendrait la classe et <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemblerait \u00e0 ceci\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeWordPressAdminMetaBox;\n\nclass AcmeMetaBox extends AbstractMetaBox\n{\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function render()\n    {\n        add_meta_box(\n            'acme-product-image',\n            'Product Image',\n            [$this, 'display'],\n            $this-&gt;postType,\n            'side',\n            'default'\n        );\n    }\n\n    \/**\n     * {@inheritdoc}\n     *\/\n    public function display()\n    {\n        include_once plugin_dir_path(__FILE__).'Views\/acme-product-image.php';\n    }\n}\n<\/code><\/pre>\n<p>Et enfin, la vue de la classe contiendrait tout code de balisage et de mod\u00e8le <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-02-acme-product-image-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pour le rendu des informations<\/a><\/strong>\u00a0:<\/p>\n<pre><code>&lt;div class=\"product-image-metabox\"&gt;\n    &lt;p&gt;\n        &lt;img src=\"&lt;?= esc_html(get_post_meta(get_the_ID(), 'product_image', true)); ?&gt;\" alt=\"&lt;?= esc_attr(get_the_title()); ?&gt;\" \/&gt;\n        &lt;input type=\"text\" value=\"&lt;?= esc_html(get_post_meta(get_the_ID(), 'product_image', true)); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Cela nous donne exactement ce dont nous avons besoin d&rsquo;une mani\u00e8re bien organis\u00e9e et r\u00e9utilisable pour travailler avec les m\u00e9ta-bo\u00eetes. Il peut \u00e9galement \u00eatre r\u00e9p\u00e9t\u00e9 pour des \u00e9l\u00e9ments tels que les menus, les types de publication, les taxonomies, etc.<\/p>\n<p>Mais je m&rsquo;\u00e9gare.<\/p>\n<h3>Un mot sur les tests unitaires (avec PHPUnit)<\/h3>\n<p>Comme je l&rsquo;ai mentionn\u00e9 plus t\u00f4t dans l&rsquo;article, je pense que les classes de tests unitaires qui r\u00e9solvent des probl\u00e8mes propres \u00e0 notre espace de probl\u00e8mes sont importantes. Cela signifie que vous devez indiquer \u00e0 votre fichier de configuration PHPUnit d&rsquo;exclure vos fichiers centr\u00e9s sur WordPress.<\/p>\n<p>L&rsquo;avantage de ce que j&rsquo;ai expos\u00e9 ci-dessus est que cela devient trivialement facile. En termes simples, vous pouvez <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2fd7f50706c3f1767dc8b5c2b7deefff#file-03-phpunit-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ajouter ceci<\/a><\/strong> \u00e0 votre fichier <strong>phpunit.xml<\/strong>\u00a0:<\/p>\n<pre><code>&lt;testsuites&gt;\n  &lt;testsuite name=\"Plugin\"&gt;\n    &lt;directory&gt;.\/tests&lt;\/directory&gt;\n    &lt;exclude&gt;.\/tests\/phpunit&lt;\/exclude&gt;\n    &lt;exclude&gt;.\/src\/WordPress&lt;\/exclude&gt;\n  &lt;\/testsuite&gt;\n&lt;\/testsuites&gt;<\/code><\/pre>\n<p>Cela vous donne la possibilit\u00e9 de vous concentrer sur l&rsquo;\u00e9criture de tests sp\u00e9cifiquement pour votre espace de probl\u00e8mes tout en vous assurant que vous \u00e9crivez un code bas\u00e9 sur WordPress \u00e9volutif, maintenable et r\u00e9utilisable.<\/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>L&rsquo;organisation du code pour les classes centr\u00e9es sur WordPress nous aide \u00e0 nous concentrer davantage sur notre domaine \u00e0 la fois en termes de r\u00e9solution du probl\u00e8me et en termes d&rsquo;\u00e9criture de tests unitaires.<\/p>\n","protected":false},"author":1,"featured_media":236089,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717],"tags":[1167],"class_list":["post-230688","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230688","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=230688"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230688\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236089"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}