{"id":231030,"date":"2022-12-06T15:23:00","date_gmt":"2022-12-06T12:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231030"},"modified":"2022-12-06T15:24:30","modified_gmt":"2022-12-06T12:24:30","slug":"organizzare-tipi-visualizzazioni-e-abbonati-di-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/organizzare-tipi-visualizzazioni-e-abbonati-di-wordpress\/","title":{"rendered":"Organizzare tipi, visualizzazioni e abbonati di WordPress"},"content":{"rendered":"\n<p>Una delle cose che mi ritrovo a fare regolarmente \u00e8 semplificare il modo in cui sto costruendo funzionalit\u00e0 incentrate su WordPress. <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/una-guida-semplice-per-organizzare-classi-incentrate-su-wordpress\/\" title=\"Ne ho parlato di recente\">Ne ho parlato di recente<\/a><\/strong>, ma ho pensato di ampliarlo un po&#8217; di pi\u00f9.<\/p>\n<p>Cio\u00e8, ho pensato di definire l&#8217;approccio che adotto quando costruisco cose come tipi di post personalizzati, tassonomie, meta box e cos\u00ec via.<\/p>\n<p>In generale, pensa a questa come a una strategia che seguo per costruire aspetti di un progetto che si interfaccia direttamente con WordPress ma potrebbe richiedere alcuni componenti come:<\/p>\n<ul>\n<li>classi che si registrano con WordPress tramite vari hook,<\/li>\n<li>classi che richiedono chiamate a determinate API di WordPress<\/li>\n<li>e classi che richiedono una visualizzazione personalizzata.<\/li>\n<\/ul>\n<p>Certo, non tutte le cose che si interfacciano con WordPress avranno bisogno di tutto quanto sopra (ad esempio, un tipo di post personalizzato ha bisogno di una vista? No. Ma una meta box s\u00ec).<\/p>\n<h2>Organizzare i tipi di WordPress<\/h2>\n<p>Detto questo, prender\u00f2 un esempio pi\u00f9 complesso come un meta box e poi analizzer\u00f2 un modo in cui penso che possa essere implementato. Prender\u00f2 nota delle cose che ritengo necessarie e delle cose che sono facoltative.<\/p>\n<p>E, come ho detto, sto usando una meta box come esempio perch\u00e9 ho un riferimento precedente e comporta la maggior parte del lavoro mentre qualcos&#8217;altro come una tassonomia personalizzata potrebbe non richiedere tutti (solo un sottoinsieme) dei pezzi .<\/p>\n<p>Detto questo, lascia che ti spieghi il mio approccio.<\/p>\n<h3>Abbiamo bisogno di abbonati<\/h3>\n<p>Ho parlato abbastanza di questo modello particolare al punto in cui mi <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">collegher\u00f2 semplicemente a una sua definizione<\/a>. Se stai leggendo questa pagina, probabilmente sei ben consapevole dei vari hook e di come utilizzarli in WordPress.<\/p>\n<p>Foto di Alexander Andrews su Unsplash<\/p>\n<p>Ma il motivo per cui voglio menzionarlo \u00e8 perch\u00e9 invece di pensare di collegare una funzione da attivare ogni volta che accade qualcosa, voglio che tu pensi a un oggetto che si iscrive a un evento quando si verifica.<\/p>\n<p>Ci\u00f2 significa che avremo bisogno di un tipo di classe di abbonato.<\/p>\n<h3>Classi API di WordPress<\/h3>\n<p>In secondo luogo, abbiamo bisogno di classi che siano responsabili dell&#8217;interfacciamento diretto con WordPress. Queste sono le classi che chiamano l&#8217;API di WordPress e registrano qualunque cosa siano responsabili di fare.<\/p>\n<p>Cio\u00e8, forse definiranno un tipo di post personalizzato o forse, come affermato, definiranno una meta box.<\/p>\n<h3>Definire le viste<\/h3>\n<p>Infine, \u00e8 importante notare che per alcune funzionalit\u00e0 personalizzate per l&#8217;area di amministrazione di WordPress (o anche per aree pubbliche), potresti voler includere una vista o un modello o una vista parziale (generalmente li chiamo semplicemente viste) che lavorare per rappresentare i dati per una meta box.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162654-61e741fa06c63.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162654-61e741fa06c63.jpg\" alt=\"Organizzare tipi, visualizzazioni e abbonati di WordPress\"><\/a><\/p>\n<p>Foto di Saketh Garuda su Unsplash<\/p>\n<p>A volte questo sar\u00e0 semplicemente informativo. A volte, ci\u00f2 richieder\u00e0 il postback sul server e la serializzazione dei dati. Anche se penso che parlare di quest&#8217;ultimo sarebbe davvero vantaggioso, \u00e8 al di fuori dell&#8217;attuale scopo di questo post.<\/p>\n<p>Forse in un prossimo post.<\/p>\n<h2>Organizzazione delle classi<\/h2>\n<p>Detto questo, come sarebbe stendere tutto questo? Come minimo, stiamo guardando:<\/p>\n<ul>\n<li>un abbonato,<\/li>\n<li>un tipo WordPress,<\/li>\n<li>una vista<\/li>\n<\/ul>\n<p>E, al massimo, potresti essere interessato a definire interfacce o classi astratte per aiutare a far rispettare un contratto tra i vari tipi di WordPress. Questo \u00e8 anche un sano principio orientato agli oggetti di cui parler\u00f2 in un prossimo post.<\/p>\n<p>Per ora, per\u00f2, parliamo di come impostare ciascuno di questi.<\/p>\n<h3>L&#8217;abbonato<\/h3>\n<p>In poche parole, l&#8217;abbonato \u00e8 responsabile di ascoltare ogni volta che WordPress genera un evento (pubblica un evento). E quando si accorge che lo fa, attiva una funzione che \u00e8 collegata ad esso.<\/p>\n<p>Questo \u00e8 generalmente definito nel modello di registro. Se non hai letto quel post, te lo consiglio, ma impostare il codice <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-00-acme-meta-box-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e8 abbastanza semplice:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBoxSubscriber extends AbstractSubscriber\n{\n    public function __construct(string $hook)\n    {\n        parent::__construct($hook);\n    }\n\n    public function load()\n    {\n        (new AcmeMetaBox())-&gt;render();\n    }\n}\n<\/code><\/pre>\n<p>Da l\u00ec, ogni volta che l&#8217;evento viene generato, la funzione si attiver\u00e0. Ecco la cosa per\u00f2: la funzione deve far parte di una certa classe. Pertanto, la necessit\u00e0 del tipo WordPress<\/p>\n<h3>Il tipo WordPress<\/h3>\n<p>Mi piace considerare i tipi di cose che si interfacciano con WordPress come tipi di WordPress (proprio come i nostri linguaggi di programmazione hanno tipi nativi come stringhe e numeri interi). WordPress ha tassonomie, meta box, menu e cos\u00ec via.<\/p>\n<p>Affinch\u00e9 il nostro abbonato funzioni correttamente, deve essere informato del nostro tipo di WordPress. In linea con l&#8217;esempio della meta box, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-01-acme-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ecco come potrebbe apparire:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass AcmeMetaBox extends AbstractMetaBox\n{\n    public function render()\n    {\n        add_meta_box(\n            'acme-data',\n            'Acme Data',\n            [$this, 'display'],\n            $this-&gt;postType,\n            'normal',\n            'high'\n        );\n    }\n\n    public function display()\n    {\n        include_once plugin_dir_path(__FILE__).'Views\/acme-data.php';\n    }\n}\n<\/code><\/pre>\n<p>Quindi dobbiamo assicurarci che il registro sia a conoscenza di questa classe.<\/p>\n<h3>La vista<\/h3>\n<p>Infine, per un meta box, dobbiamo assicurarci che ci sia una vista che mostri almeno le informazioni. Serializzare le informazioni e quindi aggiornare la vista per l&#8217;utente \u00e8 un po&#8217; una bestia diversa.<\/p>\n<p>Ma come potrebbe essere una vista? <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-02-acme-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Facile<\/a><\/strong> :<\/p>\n<pre><code>&lt;div class=\"acme-data-metabox\"&gt;\n  &lt;?php echo __('Acme Data', 'acme-meta-box'); ?&gt;\n  &lt;p class=\"description\"&gt;\n    This is the content of the metabox.\n  &lt;\/p&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>\u00c8 solo un markup di base che rende le informazioni all&#8217;utente.<\/p>\n<h2>Legare tutto insieme<\/h2>\n<p>Ogni volta che metto tutto questo insieme, di solito ho una classe di plugin che fa iniziare tutto. Se un progetto \u00e8 grande, potrebbe essercene pi\u00f9 di uno, ma in questo caso penso che sia giusto mostrare come appare usando una singola classe.<\/p>\n<p>Quindi, per prima cosa, la classe di plugin principale <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-03-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e8 simile a questa:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    private $registry;\n\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\n\n    public function start()\n    {\n        array_map(function ($subscriber) {\n            add_action($subscriber-&gt;getHook(), [$subscriber, 'load']);\n        }, $this-&gt;registry-&gt;getRegisteredSubscribers());\n    }\n}\n<\/code><\/pre>\n<p>E il bootstrap per il plugin <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/274b69d0fc1e39aaf51384287240cea6#file-04-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">si presenta cos\u00ec:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('acmeApiRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Register all of our objects with a basic registry.\n$registry-&gt;add('acmeMetaBoxSubscriber', new AcmeMetaBoxSubscriber('add_meta_boxes'));\n\n$plugin = new Plugin($registry);\n$plugin-&gt;start();<\/code><\/pre>\n<p>E, da l\u00ec, tutto il resto si mette in moto.<\/p>\n<h2>Che dire di funzionalit\u00e0 pi\u00f9 avanzate?<\/h2>\n<p>Sollevo questa domanda perch\u00e9 ne ho gi\u00e0 parlato un po&#8217; all&#8217;inizio del post. Vale a dire, ho parlato di:<\/p>\n<ol>\n<li>l&#8217;idea di inviare i dati al server (e probabilmente leggerli di nuovo),<\/li>\n<li>e ho parlato dell&#8217;uso delle interfacce.<\/li>\n<\/ol>\n<p>Queste sono entrambe cose che penso valga la pena esplorare in modo pi\u00f9 dettagliato. Ma prima di farlo, gettare le basi per il modo in cui organizzo queste informazioni \u00e8 costruito soprattutto dato che si basa su post precedenti come <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-del-modello-di-registro-in-wordpress\/\" title=\"Registry Pattern\">Registry Pattern<\/a><\/strong> e anche l&#8217;organizzazione di classi incentrate su WordPress tramite <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/una-guida-semplice-per-organizzare-classi-incentrate-su-wordpress\/\" title=\"meta box\">meta box<\/a><\/strong>.<\/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>L&#8217;organizzazione di tipi, visualizzazioni, abbonati e altro materiale correlato di WordPress pu\u00f2 essere sistematica. Questa \u00e8 una buona cosa in quanto ci offre un modo ripetibile per costruire vari progetti per i nostri clienti.<\/p>\n","protected":false},"author":1,"featured_media":162655,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[865],"tags":[1168],"class_list":["post-231030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231030","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=231030"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/162655"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}