{"id":229685,"date":"2022-11-01T10:11:00","date_gmt":"2022-11-01T07:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229685"},"modified":"2022-11-09T15:56:34","modified_gmt":"2022-11-09T12:56:34","slug":"registrazione-degli-hook-di-wordpress-utilizzando-unaltra-classe","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/registrazione-degli-hook-di-wordpress-utilizzando-unaltra-classe\/","title":{"rendered":"Registrazione degli hook di WordPress utilizzando un&#8217;altra classe"},"content":{"rendered":"\n<p>Nel <a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-costruttori-di-plugin-di-wordpress-non-dovrebbero-definire-gli-hook\/\" title=\"post di ieri\" >post di ieri<\/a>, ho parlato di un costruttore di plugin per WordPress e del motivo per cui gli hook non dovrebbero essere nel costruttore.<\/p>\n<p>Anche se ho menzionato diversi modi per gestire la registrazione degli hook, non mi sono preoccupato di entrare nei dettagli per ciascuna di queste strategie. Per quanto mi riguarda, si meritano un proprio articolo per fornire quanti pi\u00f9 dettagli possibili su come impostare qualcosa.<\/p>\n<p>Ad esempio, uno dei metodi che ho condiviso affermava:<\/p>\n<ul>\n<li>\u00c8 possibile creare una classe che mantenga un registro degli oggetti e degli hook con WordPress.<\/li>\n<\/ul>\n<p>In altre parole, si tratta di registrare gli hook di WordPress utilizzando un approccio orientato agli oggetti per ridurre l&#8217;accoppiamento e aumentare la coesione tra i componenti del plug-in.<\/p>\n<p>Ma cosa significa? Quali sono i vantaggi che porta, come \u00e8 impostato e come viene utilizzato?<\/p>\n<h2>Registrazione di WordPress Hooks<\/h2>\n<p>Se stai leggendo questo, probabilmente hai familiarit\u00e0 con il <a href=\"https:\/\/codex.wordpress.org\/Plugin_API#Hooks:_Actions_and_Filters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sistema di hook<\/a> di WordPress, l&#8217;ordine in cui vengono attivati \u200b\u200be come una funzione o una classe pu\u00f2 registrare le sue funzioni con WordPress in modo che possano eseguire qualsiasi lavoro devono gestire.<\/p>\n<p>E spesso vediamo le classi farlo da sole. A seconda del progetto, lo faccio da solo. Per coloro che non hanno familiarit\u00e0, generalmente assomiglia <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-00-plugins-loaded-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Ma tutto questo pu\u00f2 essere suddiviso in classi pi\u00f9 coese per dare loro ancora meno responsabilit\u00e0 (una buona cosa) e per diminuire l&#8217;accoppiamento tra una classe o un insieme di classi con WordPress.<\/p>\n<p>Un esempio di un design che analizzer\u00f2 in questo post.<\/p>\n<p>La natura controintuitiva di questo, tuttavia, \u00e8 che richieder\u00e0 almeno un&#8217;altra classe. Ma ecco come funziona.<\/p>\n<h2>Configurarlo<\/h2>\n<p>Ai fini di questo esempio, useremo solo una semplice classe che registrer\u00e0 un tipo di azione con WordPress. L&#8217;idea per l&#8217;architettura funziona in questo modo:<\/p>\n<ol>\n<li>C&#8217;\u00e8 la classe principale che ha la funzione che vogliamo agganciare a WordPress.<\/li>\n<li>C&#8217;\u00e8 una classe responsabile dell&#8217;orchestrazione dell&#8217;aggancio della funzione della classe a WordPress.<\/li>\n<\/ol>\n<p>Abbastanza facile, giusto? Ma ecco il problema: la classe responsabile della registrazione delle funzioni di una determinata classe con WordPress \u00e8 il punto che richiede una decisione di progettazione.<\/p>\n<p>Per prima cosa, chiamiamo la classe <strong>HookRegistry<\/strong> in modo da potervi riferire correttamente. Successivamente, chiamiamo la classe con le funzioni che vogliamo agganciare ad <strong>AcmeColumn<\/strong> semplicemente per rappresentare una classe che aggiunge una nuova colonna alla dashboard della Pagina nell&#8217;area di amministrazione di WordPress.<\/p>\n<p>Con questo in atto, la decisione progettuale si riduce a questo:<\/p>\n<ol>\n<li><strong>L&#8217; HookRegistery<\/strong> dovrebbe sapere di <strong>AcmeColumn?<\/strong><\/li>\n<li><strong>AcmeColumn<\/strong> dovrebbe conoscere <strong>HookRegistry<\/strong>? <\/li>\n<\/ol>\n<p>So che ci sono altri modi per organizzare questo e ci sono anche strategie su come gestirlo (come l&#8217; <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inversione del controllo<\/a>) e questi sono argomenti che vale la pena esplorare, ma per mantenere questa idea iniziale il pi\u00f9 semplice possibile, lo mostrer\u00f2 per un post futuro.<\/p>\n<h3>Usando la classe<\/h3>\n<p>Date le opzioni precedenti, passeremo un&#8217;istanza di <strong>AcmeColumn<\/strong> in <strong>HookRegistry<\/strong> quando le classi vengono istanziate durante il processo di avvio iniziale del plugin di WordPress. Questo potrebbe assomigliare <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-startup-process-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a questo<\/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>Successivamente, ogni volta che \u00e8 il momento di fare in modo che <strong>AcmeColumn\u00a0<\/strong> registri la sua funzione con WordPress, chiameremo <strong>HookRegistry<\/strong> e gli indicheremo di farlo.<\/p>\n<p>Innanzitutto, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-01-acme-column-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">AcmeColumn<\/a> :<\/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>Quindi <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>Facoltativamente, possiamo anche mantenere un elenco delle varie classi e hook che sono stati registrati. Questo potrebbe essere utile o meno a seconda della tua implementazione, quindi lo condivido esclusivamente come &quot;ecco qualcosa che potresti voler fare&quot;.<\/p>\n<p>E potrebbe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/340900ba153fa9c3b30b83f7b163210c#file-03-hook-registry-improved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assomigliare a questo<\/a> (usando un semplice array associativo):<\/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>Si noti che nella classe sopra, ora accetta un <strong>$id<\/strong> come parametro. Esistono diversi modi per identificare le informazioni che stanno entrando in un registro, il pi\u00f9 semplice dei quali \u00e8 creare l&#8217;ID da soli.<\/p>\n<p>Tuttavia, se volessi usare qualcosa come il nome dell&#8217;hook o il nome della classe, funzionerebbe anche questo. Tieni presente che poich\u00e9 si tratta di un array associativo, pu\u00f2 mantenere un solo valore per chiave, quindi puoi finire per eliminare i dati precedenti se non stai attento.<\/p>\n<p>Indipendentemente da ci\u00f2, questo \u00e8 qualcosa che considero facoltativo, ma se \u00e8 implementato, \u00e8 importante assicurarsi di disporre delle funzioni appropriate per recuperare un&#8217;istanza dell&#8217;oggetto tramite una chiave.<\/p>\n<h2>Uno dei tanti<\/h2>\n<p>Come per qualsiasi cosa relativa a questo tipo di lavoro, \u00e8 possibile riprogettarlo o riorientarlo in un modo che funzioni in modo diverso o che si adatti alle tue esigenze. Lo scopo non \u00e8 mostrare il modello definitivo su come fare qualcosa, ma un modo per avvicinarlo e adattarlo (proprio come qualsiasi modello di progettazione).<\/p>\n<p>Inoltre, ha lo scopo di assicurarsi che le nostre classi mantengano le responsabilit\u00e0 per le quali sono state create per tutto il tempo consentendo loro di registrarsi con WordPress secondo necessit\u00e0. Questa volta, per\u00f2, la classe non deve farlo da sola.<\/p>\n<p>Invece, passa la responsabilit\u00e0 a una classe che ha la responsabilit\u00e0 esclusiva di registrare detti hook. Quindi, sebbene introduca pi\u00f9 classi, aumenta la coesione e diminuisce l&#8217;accoppiamento.<\/p>\n<p>Ci\u00f2 offre vantaggi in termini di manutenzione, test e progettazione generale.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si tratta di registrare gli hook di WordPress utilizzando un approccio orientato agli oggetti per ridurre l&#8217;accoppiamento e aumentare la coesione nel plug-in.<\/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":[918,896,814,720,865],"tags":[1168],"class_list":["post-229685","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-plugin-2","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229685","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=229685"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229685\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229685"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229685"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}