{"id":229675,"date":"2022-11-01T11:34:00","date_gmt":"2022-11-01T08:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229675"},"modified":"2022-11-09T15:53:59","modified_gmt":"2022-11-09T12:53:59","slug":"i-costruttori-di-plugin-di-wordpress-non-dovrebbero-definire-gli-hook","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/i-costruttori-di-plugin-di-wordpress-non-dovrebbero-definire-gli-hook\/","title":{"rendered":"I costruttori di plugin di WordPress non dovrebbero definire gli hook"},"content":{"rendered":"\n<p>I costruttori di plugin per WordPress sembrano essere sempre pi\u00f9 un argomento di dibattito quando si tratta di cosa dovrebbero definire. Ne ho parlato prima, ma va bene rivisitare un argomento come questo di tanto in tanto, giusto?<\/p>\n<p>Dopotutto, ci sono cose che impariamo e cose che cambiamo man mano che acquisiamo pi\u00f9 esperienza.<\/p>\n<p>Non \u00e8 affatto raro vedere plugin che definiscono hook e altri comportamenti, ma non sono un fan di questo approccio. Invece, penso che la gestione della registrazione degli hook dovrebbe essere eseguita nella sua stessa funzione o, ancora pi\u00f9 drasticamente, gestita da un insieme di classi.<\/p>\n<p>Ma prima di entrare in questo, voglio spiegare cosa dovrebbe andare in un costruttore di plugin per WordPress, perch\u00e9 dovrebbe andare in un costruttore e come questo pu\u00f2 essere gestito quando si lavora sui plugin.<\/p>\n<h2>Costruttori di plugin per WordPress<\/h2>\n<p>Fin dall&#8217;inizio, penso che i costruttori dovrebbero essere usati per una cosa:<\/p>\n<ul>\n<li>Inizializzazione dello stato di un oggetto.<\/li>\n<\/ul>\n<p>Ci\u00f2 che definisce lo stato iniziale di un oggetto potrebbe dipendere dal fatto che sia stato creato &quot;da zero&quot; o se viene caricato con informazioni da un set precedente (come una sessione serializzata). Per come la vedo io:<\/p>\n<ul>\n<li>gli attributi sono nomi che descrivono un oggetto,<\/li>\n<li>le funzioni sono verbi che descrivono ci\u00f2 che l&#8217;oggetto pu\u00f2 fare.<\/li>\n<\/ul>\n<p>Le funzioni, ovviamente, fanno il lavoro che l&#8217;oggetto \u00e8 in grado di fare. Possono modificare lo stato dell&#8217;oggetto quando vengono chiamati, oppure possono lavorare sugli argomenti passati nelle funzioni.<\/p>\n<h3>Cosa dovrebbe andare in un costruttore?<\/h3>\n<p>Quando un oggetto viene costruito, dovrebbe semplicemente essere impostato in modo tale che i suoi attributi siano impostati e le sue funzioni siano pronte per funzionare.<\/p>\n<p>Se c&#8217;\u00e8 qualcosa nel costruttore che non influisce sullo stato iniziale di un oggetto, non dovrebbe essere presente.<\/p>\n<h3>Perch\u00e9 gli attributi dovrebbero essere in un costruttore?<\/h3>\n<p>Forse un modo migliore per porre questa domanda \u00e8:<\/p>\n<p>Perch\u00e9 gli hook non dovrebbero essere definiti nel costruttore?<\/p>\n<p>Il sistema di hook di WordPress fa parte del <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_programming\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modello di progettazione basato sugli eventi<\/a> (di cui sono un fan), ma la registrazione degli hook non descrive lo stato dell&#8217;oggetto. Invece, al livello pi\u00f9 fondamentale, \u00e8 qualcosa che crea una relazione con l&#8217;oggetto e WordPress.<\/p>\n<p>Non \u00e8 necessario che lo stato iniziale dell&#8217;oggetto conosca WordPress, che nessuna delle sue funzioni sia impostata per essere accoppiata a WordPress o che sia necessario eseguire qualsiasi elaborazione con WordPress.<\/p>\n<p>Ricorda, gli attributi vengono inizializzati in un costruttore. WordPress non \u00e8 un attributo. \u00c8 una dipendenza. Creare una dipendenza \u00e8 compiere un&#8217;azione che \u00e8 la definizione di un verbo.<\/p>\n<p>Pertanto, tutta la registrazione degli hook dovrebbe essere eseguita in una funzione.<\/p>\n<h3>Come possiamo gestire la registrazione del gancio?<\/h3>\n<p>Questo \u00e8 uno di quegli argomenti che possono essere un post o una serie di post tutti suoi.<\/p>\n<ul>\n<li>\u00c8 possibile creare una classe che mantenga un registro degli oggetti e degli hook con WordPress.<\/li>\n<li>\u00c8 anche possibile definire la registrazione dell&#8217;hook all&#8217;interno di una funzione nella classe.<\/li>\n<li>Possiamo anche fare una serie di cose con <a href=\"https:\/\/carlalexander.ca\/dependency-inversion-principle-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&#8217;inversione delle dipendenze<\/a>.<\/li>\n<\/ul>\n<p>Tutto quanto sopra sono cose che esulano dallo scopo di questo post, ma per semplicit\u00e0, mostrer\u00f2 un esempio di come una classe pu\u00f2 registrare le sue funzioni con WordPress <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">in una funzione 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>In questo modo, siamo in grado di istanziare l&#8217;oggetto, testarlo, usarlo, ecc., ma non dobbiamo occuparci di nulla relativo a WordPress senza chiamare esplicitamente la\u00a0 funzione <strong>init<\/strong>.<\/p>\n<p>Una volta chiamato, viene creata la dipendenza, \u00e8 necessario WordPress e le cose si complicano.<\/p>\n<h2>Oh, e quella cosa di prova<\/h2>\n<p>Voglio menzionare un altro punto che va un po&#8217; oltre lo scopo e lo scopo di questo post, ma \u00e8 comunque rilevante: quando si tratta di testare una classe, dovremmo essere in grado di:<\/p>\n<ol>\n<li>creare un&#8217;istanza della classe,<\/li>\n<li>testare la sua logica chiamando funzioni,<\/li>\n<li>passandogli parametri e valutandone i valori di ritorno.<\/li>\n<\/ol>\n<p>E dovremmo essere in grado di fare quanto pi\u00f9 possibile in isolamento. Se gli hook sono definiti nel costruttore, crea una dipendenza immediata da WordPress che non dovrebbe essere necessaria.<\/p>\n<p>WordPress non descrive lo stato di un oggetto. \u00c8 una dipendenza dell&#8217;oggetto.<\/p>\n<p>Ad ogni modo, il punto che sto cercando di chiarire \u00e8 che i costruttori di plugin di WordPress non dovrebbero gestire la registrazione degli hook perch\u00e9 gli hook non ne descrivono lo stato. Sono correlati a qualcosa che fa la classe e ci impediscono di testare un oggetto in isolamento.<\/p>\n<p>Quindi hanno il loro posto, ma non \u00e8 nel costruttore.<\/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>I costruttori di plugin di WordPress non dovrebbero gestire la registrazione degli hook perch\u00e9 gli hook non ne descrivono lo stato.<\/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":[896,804,814,720,844,865],"tags":[1168],"class_list":["post-229675","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-plugin-2","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229675","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=229675"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229675\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}