{"id":229331,"date":"2022-11-01T09:30:00","date_gmt":"2022-11-01T06:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229331"},"modified":"2022-11-09T06:31:41","modified_gmt":"2022-11-09T03:31:41","slug":"enregistrement-de-crochets-wordpress-a-laide-dune-autre-classe","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/enregistrement-de-crochets-wordpress-a-laide-dune-autre-classe\/","title":{"rendered":"Enregistrement de crochets WordPress \u00e0 l&rsquo;aide d&rsquo;une autre classe"},"content":{"rendered":"\n<p>Dans <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/les-constructeurs-de-plugins-wordpress-ne-devraient-pas-definir-de-crochets\/\" title=\"le post d'hier\" >le post d&rsquo;hier<\/a>, j&rsquo;ai parl\u00e9 d&rsquo;un constructeur de plugins WordPress et de la raison pour laquelle les crochets ne devraient pas \u00eatre dans le constructeur.<\/p>\n<p>Bien que j&rsquo;ai mentionn\u00e9 un certain nombre de fa\u00e7ons de g\u00e9rer l&rsquo;enregistrement des hooks, je n&rsquo;ai pas pris la peine d&rsquo;entrer dans les d\u00e9tails de chacune de ces strat\u00e9gies. En ce qui me concerne, ils m\u00e9ritent leur propre article afin de fournir le plus de d\u00e9tails possible sur la fa\u00e7on de configurer quelque chose.<\/p>\n<p>Par exemple, l&rsquo;une des m\u00e9thodes que j&rsquo;ai partag\u00e9es indiquait\u00a0:<\/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<\/ul>\n<p>En d&rsquo;autres termes, il s&rsquo;agit d&rsquo;enregistrer les crochets WordPress en utilisant une approche orient\u00e9e objet pour r\u00e9duire le couplage et augmenter la coh\u00e9sion entre les composants du plugin.<\/p>\n<p>Mais qu&rsquo;est-ce que cela signifie m\u00eame? Quels sont les avantages qu&rsquo;il apporte, comment est-il configur\u00e9 et comment est-il utilis\u00e9\u00a0?<\/p>\n<h2>Enregistrement de crochets WordPress<\/h2>\n<p>Si vous lisez ceci, vous connaissez probablement le <a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Hooks:_Actions_and_Filters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">syst\u00e8me de hook<\/a> WordPress, l&rsquo;ordre dans lequel ils sont d\u00e9clench\u00e9s et comment une fonction ou une classe peut enregistrer ses fonctions aupr\u00e8s de WordPress afin qu&rsquo;elles puissent effectuer tout le travail dont elles ont besoin.<\/p>\n<p>Et nous voyons souvent des classes le faire par elles-m\u00eames. Selon le projet, je le fais moi-m\u00eame. Pour ceux qui ne connaissent pas, cela ressemble g\u00e9n\u00e9ralement <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-00-plugins-loaded-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action( 'plugins_loaded', 'acme_start' );\n\/**\n * Start the machine.\n * https:\/\/www.youtube.com\/watch?v=ysoMOefPyRs\n *\/\nfunction acme_start() {\n    $plugin = new AcmeColumn();\n}\n<\/code><\/pre>\n<p>Mais tout cela peut \u00eatre d\u00e9compos\u00e9 en classes plus coh\u00e9rentes pour finalement leur donner encore moins de responsabilit\u00e9s (une bonne chose) et pour diminuer le couplage entre une classe ou un ensemble de classes avec WordPress.<\/p>\n<p>Un exemple de design que je vais d\u00e9tailler dans cet article.<\/p>\n<p>La nature contre-intuitive de cela, cependant, est que cela n\u00e9cessitera au moins une autre classe. Mais voici comment cela fonctionne.<\/p>\n<h2>Le configurer<\/h2>\n<p>Pour les besoins de cet exemple, nous allons simplement utiliser une classe simple qui va enregistrer un certain type d&rsquo;action avec WordPress. L&rsquo;id\u00e9e de l&rsquo;architecture fonctionne quelque chose comme ceci:<\/p>\n<ol>\n<li>Il y a la classe principale qui a la fonction que nous voulons accrocher \u00e0 WordPress.<\/li>\n<li>Il y a une classe charg\u00e9e d&rsquo;orchestrer l&rsquo;accrochage de la fonction de la classe \u00e0 WordPress.<\/li>\n<\/ol>\n<p>Assez facile, non? Mais voici le hic: la classe responsable de l&rsquo;enregistrement des fonctions d&rsquo;une classe donn\u00e9e avec WordPress est le point qui n\u00e9cessite une d\u00e9cision de conception.<\/p>\n<p>Tout d&rsquo;abord, appelons la classe <strong>HookRegistry<\/strong> afin que nous puissions nous y r\u00e9f\u00e9rer correctement. Ensuite, appelons la classe avec les fonctions que nous voulons accrocher <strong>AcmeColumn<\/strong> simplement pour repr\u00e9senter une classe qui ajoute une nouvelle colonne au tableau de bord Page dans la zone d&rsquo;administration de WordPress.<\/p>\n<p>Avec cela en place, la d\u00e9cision de conception se r\u00e9sume \u00e0 ceci :<\/p>\n<ol>\n<li><strong>Le HookRegistery<\/strong> devrait-\u00a0 il conna\u00eetre <strong>AcmeColumn\u00a0?<\/strong><\/li>\n<li><strong>AcmeColumn<\/strong> devrait\u00a0 -il conna\u00eetre le <strong>HookRegistry<\/strong>? <\/li>\n<\/ol>\n<p>Je sais qu&rsquo;il existe d&rsquo;autres fa\u00e7ons d&rsquo;organiser cela et il existe \u00e9galement des strat\u00e9gies pour g\u00e9rer cela (comme l&rsquo; <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inversion de contr\u00f4le<\/a>) et ce sont des sujets qui valent la peine d&rsquo;\u00eatre explor\u00e9s, mais pour garder cette id\u00e9e initiale aussi simple que possible, je vais la d\u00e9poser pour un futur poste.<\/p>\n<h3>Utilisation de la classe<\/h3>\n<p>Compte tenu des options ci-dessus, nous transmettrons une instance de <strong>AcmeColumn<\/strong> dans <strong>HookRegistry<\/strong> lorsque les classes seront instanci\u00e9es lors du processus de d\u00e9marrage initial du plugin WordPress. Cela peut ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-startup-process-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action( 'plugins_loaded', 'acme_start' );\n\/**\n * Start the machine.\n * https:\/\/www.youtube.com\/watch?v=ysoMOefPyRs\n *\/\nfunction acme_start() {\n\n  $registry    = new HookRegistry();\n\n  $acme_column = new AcmeColumn( $registry );\n  $acme_column-&gt;start();\n}\n<\/code><\/pre>\n<p>Ensuite, chaque fois qu&rsquo;il est temps de demander \u00e0 <strong>AcmeColumn\u00a0<\/strong> d&rsquo;enregistrer sa fonction aupr\u00e8s de WordPress, nous appellerons <strong>HookRegistry<\/strong> et lui demanderons de le faire.<\/p>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-acme-column-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">AcmeColumn<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\nclass AcmeColumn {\n\n    private $registry;\n\n    public function __construct( $registry) {\n        $this-&gt;registry = $registry;\n    }\n\n    public function start() {\n        $registry-&gt;add_hook( 'filter', 'manage_edit-page_columns', $this, 'add_page_column' );\n    }\n\n    public function add_page_column( $page_columns) {\n\n        $page_columns['template'] = 'Acme Column';\n        return $page_columns;\n    } \n}\n<\/code><\/pre>\n<p>Puis le <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-02-hook-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HookRegistry<\/a> :<\/strong><\/p>\n<pre><code>&lt;?php\n\nclass HookRegistry {\n\n  public add_hook( $type, $name, $object, $method) {\n\n    $type = strtolower( $type );\n    if ('filter' !== $type || 'action' !== $type) {\n      return new WP_Error( '1', 'No proper hook type defined.' );\n    }\n  }\n\n  private function add_filter( $name, $object, $method) {\n    add_filter( $name, array( $object, $method) );\n  }\n\n  private function add_action( $name, $object, $method) {\n    add_action( $name, array( $object, $method) );\n  }\n}\n<\/code><\/pre>\n<p>En option, nous pouvons \u00e9galement maintenir une liste des diff\u00e9rentes classes et crochets qui ont \u00e9t\u00e9 enregistr\u00e9s. Cela peut \u00eatre utile ou non en fonction de votre mise en \u0153uvre, donc je partage uniquement comme &quot;voici quelque chose que vous voudrez peut-\u00eatre faire&quot;.<\/p>\n<p>Et cela pourrait <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-03-hook-registry-improved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressembler \u00e0 ceci<\/a> (en utilisant un simple tableau associatif):<\/p>\n<pre><code>&lt;?php\n\nclass HookRegistry {\n\n  private $registry;\n\n  public function __construct() {\n    $this-&gt;registery = array(); \n  }\n\n  public add_hook( $id, $type, $name, $object, $method) {\n\n    $type = strtolower( $type );\n    if ('filter' !== $type || 'action' !== $type) {\n      return new WP_Error( '1', 'No proper hook type defined.' );\n    }\n\n    if ('filter' === $type) {\n      $this-&gt;add_filter( $name, $object, $method );\n    } else {\n      $this-&gt;add_action( $name, $object, $method );\n    }\n\n    $hook_info = array(\n      $type,\n      $name,\n      $object,\n      $method,\n    );\n    $this-&gt;registry[ $id ] = $hook_info;\n  }\n\n  private function add_filter( $name, $object, $method) {\n    add_filter( $name, array( $object, $method) );\n  }\n\n  private function add_action( $name, $object, $method) {\n    add_action( $name, array( $object, $method) );\n  }\n}\n<\/code><\/pre>\n<p>Notez que dans la classe ci-dessus, elle accepte d\u00e9sormais un <strong>$id<\/strong> comme param\u00e8tre. Il existe plusieurs fa\u00e7ons d&rsquo;identifier les informations qui entrent dans un registre, la plus simple \u00e9tant de cr\u00e9er l&rsquo;ID vous-m\u00eame.<\/p>\n<p>Cependant, si vous vouliez utiliser quelque chose comme le nom du crochet ou le nom de la classe, cela fonctionnerait aussi. Notez simplement que, puisqu&rsquo;il s&rsquo;agit d&rsquo;un tableau associatif, il ne peut conserver qu&rsquo;une seule valeur par cl\u00e9, vous pouvez donc finir par supprimer les donn\u00e9es pr\u00e9c\u00e9dentes si vous ne faites pas attention.<\/p>\n<p>Quoi qu&rsquo;il en soit, c&rsquo;est quelque chose que je consid\u00e8re comme facultatif, mais s&rsquo;il est impl\u00e9ment\u00e9, il est important de s&rsquo;assurer que vous disposez des fonctions appropri\u00e9es pour r\u00e9cup\u00e9rer une instance de l&rsquo;objet par une cl\u00e9.<\/p>\n<h2>Un parmi beaucoup<\/h2>\n<p>Comme pour tout ce qui concerne ce type de travail, il est possible de le r\u00e9organiser ou de le r\u00e9orienter d&rsquo;une mani\u00e8re qui fonctionne diff\u00e9remment ou qui r\u00e9pond \u00e0 vos besoins. Le but n&rsquo;est pas de montrer le mod\u00e8le d\u00e9finitif pour savoir comment faire quelque chose, mais une fa\u00e7on de l&rsquo;aborder et de l&rsquo;adapter (un peu comme n&rsquo;importe quel mod\u00e8le de conception).<\/p>\n<p>De plus, cela vise \u00e0 s&rsquo;assurer que nos classes conservent les responsabilit\u00e9s pour lesquelles elles ont \u00e9t\u00e9 cr\u00e9\u00e9es tout en leur permettant de s&rsquo;enregistrer aupr\u00e8s de WordPress au besoin. Cette fois, cependant, la classe n&rsquo;a pas \u00e0 le faire elle-m\u00eame.<\/p>\n<p>Au lieu de cela, il passe la responsabilit\u00e9 \u00e0 une classe qui a la seule responsabilit\u00e9 d&rsquo;enregistrer lesdits crochets. Ainsi, bien qu&rsquo;il introduit plus de classes, il augmente la coh\u00e9sion et diminue le couplage.<\/p>\n<p>Cela offre des avantages en mati\u00e8re de maintenance, de test et de conception globale.<\/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>Il s&rsquo;agit d&rsquo;enregistrer les hooks WordPress en utilisant une approche orient\u00e9e objet pour diminuer le couplage et augmenter la coh\u00e9sion dans le plugin.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,811,862],"tags":[1167],"class_list":["post-229331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-plugins-2","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229331","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=229331"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229331\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}