{"id":232032,"date":"2023-01-08T09:33:00","date_gmt":"2023-01-08T06:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232032"},"modified":"2023-01-08T09:40:46","modified_gmt":"2023-01-08T06:40:46","slug":"utilisation-dun-registre-dabonnes-et-de-services-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/utilisation-dun-registre-dabonnes-et-de-services-dans-wordpress\/","title":{"rendered":"Utilisation d&rsquo;un registre, d&rsquo;abonn\u00e9s et de services dans WordPress"},"content":{"rendered":"\n<p><strong>TL; DR\u00a0:<\/strong> Je trouve l&rsquo;utilisation d&rsquo;un registre, d&rsquo;abonn\u00e9s et de services tr\u00e8s utile lors de la cr\u00e9ation de plugins et d&rsquo;utilitaires centr\u00e9s sur le backend pour WordPress. Cet article explique comment proc\u00e9der.<\/p>\n<hr \/>\n<p>Apr\u00e8s avoir travaill\u00e9 avec des mod\u00e8les de conception, la programmation orient\u00e9e objet et WordPress pendant des ann\u00e9es, des moyens courants de r\u00e9soudre les probl\u00e8mes sont in\u00e9vitables.<\/p>\n<p>C&rsquo;est ainsi que nous avons commenc\u00e9 par cr\u00e9er des mod\u00e8les de conception orient\u00e9s objet, alors il s&rsquo;agit peut-\u00eatre d&rsquo;une variante centr\u00e9e sur WordPress.<\/p>\n<p>Bien que j&rsquo;aie \u00e9crit sur des choses telles que les registres dans des articles pr\u00e9c\u00e9dents (et ceux qui ne sont m\u00eame <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/utilisation-du-modele-de-registre-dans-wordpress\/\" title=\"pas si anciens\">pas si anciens<\/a> ), ce n&rsquo;est jamais une mauvaise id\u00e9e de revenir sur le m\u00eame sujet, surtout quand il y a quelque chose \u00e0 ajouter \u00e0 la prise pr\u00e9c\u00e9dente.<\/p>\n<h2>Un registre, des abonn\u00e9s et des services<\/h2>\n<p>Tout ce qui est d\u00e9crit ci-dessous doit \u00eatre compris dans le contexte du plugin WordPress. Autrement dit, ceci n&rsquo;est pas destin\u00e9 \u00e0 \u00eatre lu comme un moyen de travailler avec d&rsquo;autres frameworks, langages, applications ou lors de son utilisation avec d&rsquo;autres mod\u00e8les.<\/p>\n<p>N&rsquo;oubliez pas que lorsque vous lisez ceci.<\/p>\n<hr \/>\n<p>Quoi qu&rsquo;il en soit, l&rsquo;id\u00e9e g\u00e9n\u00e9rale derri\u00e8re la combinaison de ces types d&rsquo;objets est la suivante\u00a0:<\/p>\n<ol>\n<li>Le registre g\u00e8re tous les abonn\u00e9s,<\/li>\n<li>Les abonn\u00e9s \u00e9coutent les crochets au sein de WordPress (ceux qui existent ou m\u00eame les crochets personnalis\u00e9s),<\/li>\n<li>Les services effectuent le travail r\u00e9el chaque fois que l&rsquo;abonn\u00e9 les envoie.<\/li>\n<\/ol>\n<p>Le but \u00e9tant qu&rsquo;il y ait un seul endroit pour enregistrer les classes charg\u00e9es de r\u00e9partir le travail. C&rsquo;est \u00e7a.<\/p>\n<p>De plus, cela facilite \u00e9galement la s\u00e9paration des choses, de sorte que si vous souhaitez tester vos services de mani\u00e8re isol\u00e9e, c&rsquo;est beaucoup plus facile car ils ne sont pas n\u00e9cessairement \u00e9troitement coupl\u00e9s \u00e0 WordPress. Et si c&rsquo;est le cas, vous pouvez vous moquer des donn\u00e9es qui doivent \u00eatre transmises \u00e0 une fonction donn\u00e9e, puis \u00e9valuer le r\u00e9sultat.<\/p>\n<p>Ceci n&rsquo;est pas un article sur les tests, cependant, revenons aux classes r\u00e9elles.<\/p>\n<h3>Enregistrement<\/h3>\n<p>Par d\u00e9finition, le but d&rsquo;un registre est de garder une trace des choses. Lorsqu&rsquo;il s&rsquo;agit d&rsquo;impl\u00e9menter ce mod\u00e8le dans WordPress, l&rsquo;id\u00e9e est que le registre peut suivre les abonn\u00e9s (ce que je d\u00e9finirai plus loin dans cet article).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Utilisation d&#039;un registre, d&#039;abonn\u00e9s et de services dans WordPress\"><\/a><\/p>\n<p>Photo de <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> sur <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>De plus, l&rsquo;id\u00e9e est que le moment venu, ce qui sera probablement diff\u00e9rent selon la structure de votre plugin, tous les abonn\u00e9s seront instanci\u00e9s. \u00c0 ce stade, cependant, vous voudrez probablement le faire t\u00f4t dans le cycle de vie de WordPress.<\/p>\n<p>Cela dit, voici un exemple de comment utiliser le code pour enregistrer les abonn\u00e9s\u00a0:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>Ensuite, voici une fonction pour instancier les abonn\u00e9s.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Ces blocs peuvent faire partie de la m\u00eame fonction ou ils peuvent \u00eatre s\u00e9par\u00e9s selon vos besoins.<\/p>\n<h3>Les abonn\u00e9s<\/h3>\n<p>Comme mentionn\u00e9, les abonn\u00e9s sont le moyen de\u00a0:<\/p>\n<ol>\n<li>\u00c9coutez un certain crochet dans WordPress<\/li>\n<li>Envoyez un service pour effectuer le travail pr\u00e9vu pour le crochet donn\u00e9.<\/li>\n<\/ol>\n<p>Supposons donc un instant que vous vouliez faire quelque chose chaque fois qu&rsquo;un utilisateur est supprim\u00e9. Vous souhaitez instancier un service via l&rsquo;abonn\u00e9 chaque fois que ce crochet se produit.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Utilisation d&#039;un registre, d&#039;abonn\u00e9s et de services dans WordPress\"><\/a><\/p>\n<p>Photo de <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbell<\/a> sur <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Par exemple:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Notez que l&rsquo;abonn\u00e9 est au courant du service (bien qu&rsquo;il n&rsquo;en d\u00e9pende pas car il s&rsquo;agit simplement d&rsquo;un interm\u00e9diaire entre WordPress et le service) et sp\u00e9cifie le crochet sur le service qu&rsquo;il instancie.<\/p>\n<h3>Prestations de service<\/h3>\n<p>Enfin, les services sont les objets qui font tout le gros du travail dans un plugin. Cela signifie que s&rsquo;ils ont besoin de lire ou d&rsquo;\u00e9crire dans la base de donn\u00e9es, le syst\u00e8me de fichiers, le r\u00e9seau, les donn\u00e9es de processus, etc., tout se passe dans leur contexte.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Utilisation d&#039;un registre, d&#039;abonn\u00e9s et de services dans WordPress\"><\/a><\/p>\n<p>Photo par <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik Mclean<\/a> sur <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Ils peuvent \u00eatre au courant d&rsquo;autres classes, ils peuvent ne pas l&rsquo;\u00eatre. Ils peuvent impl\u00e9menter une interface ou une classe abstraite ou non. C&rsquo;est vraiment au-del\u00e0 de la port\u00e9e de ce post. Mais le fait est que, en utilisant le crochet ci-dessus comme exemple, si vous voulez faire quelque chose lorsqu&rsquo;un utilisateur est supprim\u00e9, vous le faites dans le service.<\/p>\n<p>Par exemple:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>Et c&rsquo;est la fin. Une fois le service ex\u00e9cut\u00e9, le contr\u00f4le sera rendu \u00e0 WordPress et l&rsquo;application poursuivra son ex\u00e9cution normalement.<\/p>\n<h3>Tous ensemble maintenant<\/h3>\n<p>En supposant que vous ayez un fichier d&rsquo;amor\u00e7age pour votre plug-in, ce qui est le cas pour la plupart, car c&rsquo;est l\u00e0 que le plug-in requis est d\u00e9fini, un chargeur automatique est requis et l&rsquo;instanciation du plug-in lui-m\u00eame se produit.<\/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;utilisation d&rsquo;un registre, d&rsquo;abonn\u00e9s et de services est utile lors de la cr\u00e9ation de plugins et d&rsquo;utilitaires centr\u00e9s sur le backend pour WordPress. Cet article explique comment proc\u00e9der.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,832,801,841,862],"tags":[1167],"class_list":["post-232032","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-php-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232032","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=232032"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/232032\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=232032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=232032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=232032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}