{"id":228875,"date":"2022-10-22T10:19:00","date_gmt":"2022-10-22T07:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228875"},"modified":"2022-11-09T04:37:35","modified_gmt":"2022-11-09T01:37:35","slug":"arreter-lexecution-du-plugin-sans-dependance","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/arreter-lexecution-du-plugin-sans-dependance\/","title":{"rendered":"Arr\u00eater l&rsquo;ex\u00e9cution du plugin sans d\u00e9pendance"},"content":{"rendered":"\n<p>Si vous abordez de nombreux d\u00e9veloppements de plugins WordPress d&rsquo;un point de vue orient\u00e9 objet, vous finirez par atteindre un point o\u00f9 vous ne ferez pas beaucoup d&rsquo;interaction directement avec le c\u0153ur de WordPress lui-m\u00eame.<\/p>\n<p>Et, dans mon esprit, c&rsquo;est une bonne chose. C&rsquo;est le signe d&rsquo;une architecture que vous structurez correctement votre code. C&rsquo;est-\u00e0-dire:<\/p>\n<ol>\n<li>Vous avez WordPress assis au niveau fondamental,<\/li>\n<li>Vous avez un ensemble de classes qui se trouvent juste au-dessus de WordPress et qui sont charg\u00e9es d&rsquo;envoyer des informations vers et depuis WordPress entre le plugin,<\/li>\n<li>Et vous avez le reste de votre code qui comprend le reste de la fonctionnalit\u00e9.<\/li>\n<\/ol>\n<p>La fa\u00e7on dont cela est impl\u00e9ment\u00e9 peut varier, mais la fa\u00e7on g\u00e9n\u00e9rale dont je l&rsquo;imagine est la m\u00eame que j&rsquo;ai tendance \u00e0 penser \u00e0 l&rsquo;application standard <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 plusieurs niveaux<\/a> o\u00f9 vous avez la couche de donn\u00e9es, la couche d&rsquo;application et le frontal.<\/p>\n<p>Sauf pour cette fois, vous avez le WordPress, une couche pour communiquer avec WordPress et le reste de votre code, et, vous savez, le reste de votre code.<\/p>\n<p>Comment un plugin peut \u00eatre organis\u00e9.<\/p>\n<p>Alors, que se passe-t-il lorsque vous souhaitez arr\u00eater l&rsquo;ex\u00e9cution du plug-in lorsqu&rsquo;il doit interagir avec une d\u00e9pendance tierce et ne doit s&rsquo;ex\u00e9cuter que si cette d\u00e9pendance est pr\u00e9sente\u00a0?<\/p>\n<h2>Arr\u00eater l&rsquo;ex\u00e9cution du plugin<\/h2>\n<p>En raison de la nature de PHP et de WordPress, il existe plusieurs fa\u00e7ons de proc\u00e9der. Le code que je vais partager ne prescrit pas la fa\u00e7on de le faire.<\/p>\n<p>Au lieu de cela, c&rsquo;est une fa\u00e7on de le faire (qui a \u00e9t\u00e9 tir\u00e9e de quelque chose qui est en d\u00e9veloppement). De plus, je montrerai \u00e9galement comment il interagit avec quelques autres composants des plugins.<\/p>\n<h3>1 Le Constructeur<\/h3>\n<p>Si vous lisez suffisamment d&rsquo;articles sur WordPress et la programmation orient\u00e9e objet, vous constaterez probablement que les constructeurs ne doivent pas \u00eatre utilis\u00e9s pour d\u00e9finir des hooks. Et je suis d&rsquo;accord.<\/p>\n<p>Cela cr\u00e9e un niveau de couplage inutile et rend les tests plus difficiles. Quel est alors le but d&rsquo;un constructeur dans le code bas\u00e9 sur WordPress ?<\/p>\n<p>Je l&rsquo;utilise pour les m\u00eames raisons que vous attendez dans n&rsquo;importe quel autre langage: Pour initialiser les propri\u00e9t\u00e9s de la classe. Dans le code ci-dessous, vous allez voir trois choses\u00a0:<\/p>\n<ol>\n<li>J&rsquo;initialise une propri\u00e9t\u00e9,<\/li>\n<li>Je v\u00e9rifie si une d\u00e9pendance tierce existe,<\/li>\n<li>Si ce n&rsquo;est pas le cas, j&rsquo;ajoute un message d&rsquo;erreur,<\/li>\n<li>Je mets \u00e0 jour la propri\u00e9t\u00e9.<\/li>\n<\/ol>\n<p>Bien s\u00fbr, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c&rsquo;est verbeux<\/a>, mais il n&rsquo;a pas non plus recours \u00e0 un code intelligent pour initialiser les valeurs.<\/p>\n<pre><code>&lt;?php\n\npublic function __construct( $container) {\n\n    $this-&gt;can_run = true;\n\n    \/\/ If the dependency isn't installed, then add a message and flag execution to stop.\n    $this-&gt;messenger = $container-&gt;get( 'settings-messenger');\n    if (! class_exists( 'Acme_Dependency')) {\n\n        $this-&gt;messenger-&gt;add_error_message( 'The dependency is not installed.' );\n        $this-&gt;can_run = false;\n    }\n}\n<\/code><\/pre>\n<p>(Plus je vieillis, plus j&rsquo;aime le code sp\u00e9cifique car il facilite la lecture, la prise en main et la mise en route \u00e0 un rythme plus rapide que l&rsquo;alternative.)<\/p>\n<h3>2 La m\u00e9thode d&rsquo;initialisation<\/h3>\n<p>Puisque nous n&rsquo;utilisons pas de constructeur pour travailler avec les crochets WordPress, cette fonctionnalit\u00e9 devrait exister dans le contexte d&rsquo;une autre m\u00e9thode.<\/p>\n<p>Cela nous donne un endroit d\u00e9di\u00e9 pour mettre ce type de fonctionnalit\u00e9, le dissocier du reste de la classe et le faire interagir avec WordPress uniquement lorsque la m\u00e9thode est explicitement invoqu\u00e9e.<\/p>\n<p>Mais rappelez-vous, tout l&rsquo;int\u00e9r\u00eat de ce que je veux dire a \u00e0 voir avec l&rsquo;arr\u00eat de l&rsquo;ex\u00e9cution d&rsquo;un plugin &#8211; pas o\u00f9 placer les crochets.<\/p>\n<p>Alors disons que la d\u00e9pendance tierce n&rsquo;existe pas, alors quoi? Rappelons dans le constructeur, une propri\u00e9t\u00e9 a \u00e9t\u00e9 d\u00e9finie qui nous permettra de d\u00e9terminer <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">si nous devons avancer<\/a> avec la mise en place des hooks ou non :<\/p>\n<pre><code>&lt;?php\n\npublic function init() {\n\n    if (! $this-&gt;can_run) {\n        return;\n    }\n\n    add_action( 'admin_notices', array( $this, 'admin_notices') );\n}\n<\/code><\/pre>\n<p>Et quand c&rsquo;est en place, le reste du code ne s&rsquo;ex\u00e9cutera pas.<\/p>\n<h2>Beaucoup de mots, un peu de code<\/h2>\n<p>Cela ressemble \u00e0 beaucoup d&rsquo;explications pour si peu de code.<\/p>\n<p>Mais une partie de cela consiste \u00e9galement \u00e0 essayer de transmettre l&rsquo;importance d&rsquo;avoir des parties d&rsquo;un projet bas\u00e9 sur WordPress s\u00e9par\u00e9es du reste du noyau afin que les parties puissent interagir avec elles-m\u00eames sans avoir explicitement besoin de parler avec le noyau tout le temps.<\/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>Que se passe-t-il lorsque vous souhaitez arr\u00eater l&rsquo;ex\u00e9cution d&rsquo;un plug-in lorsqu&rsquo;il doit fonctionner avec une d\u00e9pendance tierce et que vous ne devez le faire que s&rsquo;il est pr\u00e9sent\u00a0?<\/p>\n","protected":false},"author":1,"featured_media":221144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,801,862],"tags":[1167],"class_list":["post-228875","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228875","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=228875"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}