{"id":229322,"date":"2022-11-01T11:46:00","date_gmt":"2022-11-01T08:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229322"},"modified":"2022-11-09T06:29:15","modified_gmt":"2022-11-09T03:29:15","slug":"les-constructeurs-de-plugins-wordpress-ne-devraient-pas-definir-de-crochets","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/les-constructeurs-de-plugins-wordpress-ne-devraient-pas-definir-de-crochets\/","title":{"rendered":"Les constructeurs de plugins WordPress ne devraient pas d\u00e9finir de crochets"},"content":{"rendered":"\n<p>Les constructeurs de plugins WordPress semblent \u00eatre de plus en plus un sujet de d\u00e9bat quand il s&rsquo;agit de ce qu&rsquo;ils devraient d\u00e9finir. J&rsquo;en ai d\u00e9j\u00e0 parl\u00e9, mais il est normal de revenir sur un sujet comme celui-ci de temps en temps, n&rsquo;est-ce pas\u00a0?<\/p>\n<p>Apr\u00e8s tout, il y a des choses que nous apprenons et des choses que nous changeons \u00e0 mesure que nous acqu\u00e9rons plus d&rsquo;exp\u00e9rience.<\/p>\n<p>Il n&rsquo;est pas du tout rare de voir des plugins d\u00e9finir des hooks et d&rsquo;autres comportements, mais je ne suis pas fan de cette approche. Au lieu de cela, je pense que la gestion de l&rsquo;enregistrement des crochets devrait \u00eatre effectu\u00e9e dans sa propre fonction ou, encore plus radicalement, g\u00e9r\u00e9e par un ensemble de classes.<\/p>\n<p>Mais avant d&rsquo;entrer dans les d\u00e9tails, je veux expliquer ce qui devrait aller dans un constructeur de plugin WordPress, pourquoi il devrait aller dans un constructeur et comment cela peut \u00eatre g\u00e9r\u00e9 lorsque vous travaillez sur vos plugins.<\/p>\n<h2>Constructeurs de plugins WordPress<\/h2>\n<p>D\u00e8s le d\u00e9part, je pense que les constructeurs doivent \u00eatre utilis\u00e9s pour une chose :<\/p>\n<ul>\n<li>Initialisation de l&rsquo;\u00e9tat d&rsquo;un objet.<\/li>\n<\/ul>\n<p>Ce qui d\u00e9finit l&rsquo;\u00e9tat initial d&rsquo;un objet peut d\u00e9pendre du fait qu&rsquo;il a \u00e9t\u00e9 cr\u00e9\u00e9 &quot;\u00e0 partir de z\u00e9ro&quot; ou s&rsquo;il est charg\u00e9 avec des informations d&rsquo;un ensemble pr\u00e9c\u00e9dent (comme une session en cours de s\u00e9rialisation). La fa\u00e7on dont je le vois\u00a0:<\/p>\n<ul>\n<li>les attributs sont des noms qui d\u00e9crivent un objet,<\/li>\n<li>les fonctions sont des verbes qui d\u00e9crivent ce que l&rsquo;objet peut faire.<\/li>\n<\/ul>\n<p>Les fonctions, bien s\u00fbr, font le travail que l&rsquo;objet est capable de faire. Ils peuvent modifier l&rsquo;\u00e9tat de l&rsquo;objet lorsqu&rsquo;il est appel\u00e9, ou ils peuvent travailler sur les arguments pass\u00e9s aux fonctions.<\/p>\n<h3>Que doit-on mettre dans un constructeur ?<\/h3>\n<p>Lorsqu&rsquo;un objet est construit, il doit simplement \u00eatre d\u00e9fini de mani\u00e8re \u00e0 ce que ses attributs soient d\u00e9finis et que ses fonctions soient pr\u00eates \u00e0 fonctionner.<\/p>\n<p>S&rsquo;il y a quelque chose dans le constructeur qui n&rsquo;a pas d&rsquo;impact sur l&rsquo;\u00e9tat initial d&rsquo;un objet, il ne devrait pas s&rsquo;y trouver.<\/p>\n<h3>Pourquoi les attributs devraient-ils \u00eatre dans un constructeur\u00a0?<\/h3>\n<p>Peut-\u00eatre une meilleure fa\u00e7on de poser cette question est:<\/p>\n<p>Pourquoi les crochets ne devraient-ils pas \u00eatre d\u00e9finis dans le constructeur\u00a0?<\/p>\n<p>Le syst\u00e8me de hook de WordPress fait partie du <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mod\u00e8le de conception pilot\u00e9 par les \u00e9v\u00e9nements<\/a> (dont je suis fan), mais l&rsquo;enregistrement des hooks ne d\u00e9crit pas l&rsquo;\u00e9tat de l&rsquo;objet. Au lieu de cela, au niveau le plus fondamental, c&rsquo;est quelque chose qui cr\u00e9e une relation avec l&rsquo;objet et WordPress.<\/p>\n<p>L&rsquo;\u00e9tat initial de l&rsquo;objet n&rsquo;a pas besoin de conna\u00eetre WordPress, d&rsquo;avoir l&rsquo;une de ses fonctions configur\u00e9es pour \u00eatre coupl\u00e9e \u00e0 WordPress ou d&rsquo;effectuer un traitement avec WordPress.<\/p>\n<p>N&rsquo;oubliez pas que les attributs sont initialis\u00e9s dans un constructeur. WordPress n&rsquo;est pas un attribut. C&rsquo;est une d\u00e9pendance. Cr\u00e9er une d\u00e9pendance, c&rsquo;est effectuer une action qui est la d\u00e9finition d&rsquo;un verbe.<\/p>\n<p>Ainsi, tous les enregistrements de hook doivent \u00eatre effectu\u00e9s dans une fonction.<\/p>\n<h3>Comment pouvons-nous g\u00e9rer l&rsquo;enregistrement des crochets\u00a0?<\/h3>\n<p>C&rsquo;est l&rsquo;un de ces sujets qui peuvent \u00eatre un article ou une s\u00e9rie d&rsquo;articles \u00e0 part enti\u00e8re.<\/p>\n<ul>\n<li>Il est possible de cr\u00e9er une classe qui maintient un registre d&rsquo;objets et les crochets avec WordPress.<\/li>\n<li>Il est \u00e9galement possible de d\u00e9finir l&rsquo;enregistrement du hook dans une fonction de la classe.<\/li>\n<li>Nous pouvons \u00e9galement faire un certain nombre de choses avec <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;inversion de d\u00e9pendance<\/a>.<\/li>\n<\/ul>\n<p>Tout ce qui pr\u00e9c\u00e8de d\u00e9passe le cadre de cet article, mais par souci de simplicit\u00e9, je vais montrer un exemple de la fa\u00e7on dont une classe peut enregistrer ses fonctions avec WordPress <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dans une fonction init<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>De cette fa\u00e7on, nous pouvons instancier l&rsquo;objet, le tester, l&rsquo;utiliser, etc., mais nous n&rsquo;avons pas \u00e0 nous occuper de tout ce qui concerne WordPress sans appeler explicitement la\u00a0 fonction <strong>init<\/strong>.<\/p>\n<p>Une fois que cela est appel\u00e9, la d\u00e9pendance est cr\u00e9\u00e9e, WordPress est n\u00e9cessaire et les choses se compliquent.<\/p>\n<h2>Oh, et cette chose de test<\/h2>\n<p>Je veux mentionner un autre point qui d\u00e9passe un peu la port\u00e9e et le but de cet article mais qui est toujours pertinent\u00a0: lorsqu&rsquo;il s&rsquo;agit de tester une classe, nous devrions \u00eatre en mesure de\u00a0:<\/p>\n<ol>\n<li>cr\u00e9er une instance de la classe,<\/li>\n<li>tester sa logique en appelant des fonctions,<\/li>\n<li>en lui passant des param\u00e8tres et en \u00e9valuant ses valeurs de retour.<\/li>\n<\/ol>\n<p>Et nous devrions \u00eatre capables de faire autant de choses que possible de mani\u00e8re isol\u00e9e. Si des crochets sont d\u00e9finis dans le constructeur, cela cr\u00e9e une d\u00e9pendance imm\u00e9diate \u00e0 WordPress qui ne devrait pas \u00eatre n\u00e9cessaire.<\/p>\n<p>WordPress ne d\u00e9crit pas l&rsquo;\u00e9tat d&rsquo;un objet. C&rsquo;est une d\u00e9pendance de l&rsquo;objet.<\/p>\n<p>Quoi qu&rsquo;il en soit, le point que j&rsquo;essaie de faire valoir est que les constructeurs de plugins WordPress ne doivent pas g\u00e9rer l&rsquo;enregistrement des crochets car les crochets ne d\u00e9crivent pas son \u00e9tat. Ils sont li\u00e9s \u00e0 quelque chose que fait la classe et nous emp\u00eachent de tester un objet isol\u00e9ment.<\/p>\n<p>Ils ont donc leur place, mais ce n&rsquo;est pas dans le constructeur.<\/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>Les constructeurs de plugins WordPress ne doivent pas g\u00e9rer l&rsquo;enregistrement des hooks car les hooks ne d\u00e9crivent pas son \u00e9tat.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,811,841,862],"tags":[1167],"class_list":["post-229322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-plugins-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229322","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=229322"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}