{"id":232311,"date":"2023-01-08T09:50:00","date_gmt":"2023-01-08T06:50:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232311"},"modified":"2023-01-08T09:51:06","modified_gmt":"2023-01-08T06:51:06","slug":"utilizzo-di-un-registro-abbonati-e-servizi-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-di-un-registro-abbonati-e-servizi-in-wordpress\/","title":{"rendered":"Utilizzo di un registro, abbonati e servizi in WordPress"},"content":{"rendered":"\n<p><strong>TL; DR:<\/strong> Trovo molto utile l&#8217;utilizzo di un registro, abbonati e servizi quando si creano plugin e utilit\u00e0 incentrati sul back-end per WordPress. Questo post spiega come farlo.<\/p>\n<hr \/>\n<p>Dopo aver lavorato per anni con modelli di progettazione, programmazione orientata agli oggetti e WordPress, \u00e8 inevitabile che sorgano modi comuni per risolvere i problemi.<\/p>\n<p>Questo \u00e8 il modo in cui abbiamo ottenuto modelli di progettazione orientati agli oggetti per cominciare, quindi forse questa \u00e8 una variazione incentrata su WordPress.<\/p>\n<p>Anche se ho scritto di cose come i registri in articoli precedenti (e anche quelli che <a href=\"https:\/\/wordpress.mediadoma.com\/it\/utilizzo-del-modello-di-registro-in-wordpress\/\" title=\"non sono cos\u00ec vecchi\">non sono cos\u00ec vecchi<\/a> ), non \u00e8 mai una cattiva idea rivisitare lo stesso argomento, specialmente quando c&#8217;\u00e8 qualcosa da continuare ad aggiungere alla versione precedente.<\/p>\n<h2>Un registro, abbonati e servizi<\/h2>\n<p>Tutto quanto descritto di seguito \u00e8 da intendersi nel contesto del plugin di WordPress. Cio\u00e8, questo non deve essere letto come un modo per lavorare con altri framework, linguaggi, applicazioni o quando lo si utilizza con altri modelli.<\/p>\n<p>Ricordalo quando leggi questo.<\/p>\n<hr \/>\n<p>Ad ogni modo, l&#8217;idea generale alla base della combinazione di questi tipi di oggetti \u00e8 la seguente:<\/p>\n<ol>\n<li>Il registro gestisce tutti gli abbonati,<\/li>\n<li>Gli abbonati ascoltano gli hook all&#8217;interno di WordPress (quelli che esistono o anche gli hook personalizzati),<\/li>\n<li>I servizi fanno il lavoro vero e proprio ogni volta che l&#8217;abbonamento li invia.<\/li>\n<\/ol>\n<p>Lo scopo \u00e8 che c&#8217;\u00e8 un unico posto per registrare le classi responsabili dell&#8217;invio del lavoro. Questo \u00e8 tutto.<\/p>\n<p>Inoltre, questo rende anche facile tenere le cose separate in modo che se vuoi testare i tuoi servizi in isolamento, \u00e8 molto pi\u00f9 facile perch\u00e9 non sono necessariamente accoppiati strettamente a WordPress. E se lo sono, puoi deridere i dati che devono essere passati in una determinata funzione e quindi valutare il risultato.<\/p>\n<p>Tuttavia, questo non \u00e8 un articolo sui test, quindi torniamo alle classi effettive.<\/p>\n<h3>Registro<\/h3>\n<p>Per definizione, lo scopo di un registro \u00e8 quello di tenere traccia delle cose. Quando si tratta di implementare questo modello in WordPress, l&#8217;idea \u00e8 che il registro possa tenere traccia degli abbonati (che definir\u00f2 pi\u00f9 avanti in questo articolo).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.png\" 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-158242-61e6dacccb19c.png\" alt=\"Utilizzo di un registro, abbonati e servizi in WordPress\"><\/a><\/p>\n<p>Foto di <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> su <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Inoltre, l&#8217;idea \u00e8 che quando arriver\u00e0 il momento, che probabilmente sar\u00e0 diverso per come \u00e8 strutturato il tuo plugin, tutti gli abbonati saranno istanziati. A quel punto, per\u00f2, probabilmente vorrai farlo all&#8217;inizio del ciclo di vita di WordPress.<\/p>\n<p>Detto questo, ecco un esempio di come inserire il codice per la registrazione degli abbonati:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>Quindi, ecco una funzione per creare un&#8217;istanza degli abbonati.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Questi blocchi possono far parte della stessa funzione o possono essere separati a seconda delle tue esigenze.<\/p>\n<h3>Iscritti<\/h3>\n<p>Come accennato, gli abbonati sono il modo per:<\/p>\n<ol>\n<li>Ascolta un certo hook in WordPress<\/li>\n<li>Invia un servizio per eseguire qualsiasi lavoro sia previsto per l&#8217;hook specificato.<\/li>\n<\/ol>\n<p>Quindi supponi per un momento di voler fare qualcosa ogni volta che un utente viene eliminato. Si desidera creare un&#8217;istanza di un servizio tramite l&#8217;abbonato ogni volta che si verifica questo hook.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.png\" 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-158242-61e6dad44a26f.png\" alt=\"Utilizzo di un registro, abbonati e servizi in WordPress\"><\/a><\/p>\n<p>Foto di <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbell<\/a> su <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Come esempio:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Nota che l&#8217;abbonato \u00e8 a conoscenza del servizio (sebbene non mantenga alcuna dipendenza da esso in quanto \u00e8 semplicemente un intermediario tra WordPress e il servizio) e specifica l&#8217;hook sul servizio che sta creando un&#8217;istanza.<\/p>\n<h3>Servizi<\/h3>\n<p>Infine, i servizi sono gli oggetti che fanno tutto il lavoro pesante in un plugin. Ci\u00f2 significa che se hanno bisogno di leggere o scrivere nel database, nel file system, nella rete, nei dati di processo, ecc., tutto avviene nel loro contesto.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.png\" 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-158242-61e6dadba8851.png\" alt=\"Utilizzo di un registro, abbonati e servizi in WordPress\"><\/a><\/p>\n<p>Foto di <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik Mclean<\/a> su <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Potrebbero essere a conoscenza di altre classi, potrebbero non esserlo. Possono implementare un&#8217;interfaccia o una classe astratta oppure no. Questo \u00e8 davvero oltre lo scopo di questo post. Ma il punto \u00e8 che, usando l&#8217;hook di cui sopra come esempio, se vuoi fare qualcosa quando un utente viene eliminato, lo fai all&#8217;interno del servizio.<\/p>\n<p>Per esempio:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>E questa \u00e8 la fine. Una volta eseguito il servizio, il controllo verr\u00e0 restituito a WordPress e l&#8217;applicazione continuer\u00e0 l&#8217;esecuzione normalmente.<\/p>\n<h3>Tutti insieme ora<\/h3>\n<p>Supponendo che tu abbia un file di bootstrap per il tuo plug-in, che la maggior parte fa poich\u00e9 \u00e8 qui che viene definito il plug-in richiesto, \u00e8 richiesto un caricatore automatico e si verifica l&#8217;istanza del plug-in stesso.<\/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>Utilizzando un registro, abbonati e servizi sono utili quando si creano plugin e utilit\u00e0 incentrati sul back-end per WordPress. Questo post spiega come farlo.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,835,804,720,844,865],"tags":[1168],"class_list":["post-232311","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-guida-per-principianti","category-php-6","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232311","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=232311"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232311\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=232311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=232311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=232311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}