{"id":231542,"date":"2022-12-18T19:39:00","date_gmt":"2022-12-18T16:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231542"},"modified":"2022-12-18T19:40:06","modified_gmt":"2022-12-18T16:40:06","slug":"widget-wordpress-refactoring-parte-7","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-refactoring-parte-7\/","title":{"rendered":"Widget WordPress: refactoring, parte 7"},"content":{"rendered":"\n<p>Negli ultimi post, abbiamo lavorato molto per portare il codice al punto di refactoring che sar\u00e0 trattato in questo articolo.<\/p>\n<p>Nello specifico abbiamo trattato:<\/p>\n<ul>\n<li>ganci,<\/li>\n<li>un <a href=\"https:\/\/tommcfarlin.com\/wordpress-widgets-part-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Registro<\/a> ,<\/li>\n<li>e <a href=\"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-refactoring-parte-3\/\" title=\"abbonati\">abbonati<\/a>.<\/li>\n<\/ul>\n<p>Tutti questi giocheranno un ruolo in quello che faremo oggi.<\/p>\n<h2>The WordPress Widget Boilerplate: Refactoring, parte 7<\/h2>\n<p>Per coloro che hanno familiarit\u00e0 con l&#8217; <a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API dei widget di WordPress<\/a>, probabilmente saprai che non \u00e8 cambiato molto negli ultimi anni.<\/p>\n<p>Inoltre, in realt\u00e0 consiste solo di quattro funzioni (una delle quali \u00e8 il costruttore):<\/p>\n<ol>\n<li>Il costruttore \u00e8 responsabile dell&#8217;impostazione di diverse propriet\u00e0 sul widget, pi\u00f9 comunemente il suo nome e la sua descrizione.<\/li>\n<li>La funzione widget \u00e8 responsabile del rendering del contenuto del widget.<\/li>\n<li>La funzione modulo \u00e8 responsabile della visualizzazione del modulo nell&#8217;area di amministrazione di WordPress quando si lavora con il widget.<\/li>\n<li>La funzione di aggiornamento \u00e8 responsabile dell&#8217;aggiornamento delle opzioni salvate nel database (o inizializzate e quindi del salvataggio delle opzioni che potrebbero non esistere ancora nel database).<\/li>\n<\/ol>\n<p>La cosa bella \u00e8 che questo particolare approccio si ottiene ereditando una funzionalit\u00e0 per la classe <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a>.<\/p>\n<p>Il problema, per\u00f2, \u00e8 che \u00e8 molto lavoro da fare per una singola classe.<\/p>\n<p>Invece, dovremmo separare ciascuna delle funzioni nella propria area di funzionalit\u00e0.<\/p>\n<p>Come per qualsiasi cosa nella programmazione, ci saranno modi in cui alcune cose sono chiare su come possono essere fatte e poi ci saranno alcune cose che possono essere fatte in pi\u00f9 modi.<\/p>\n<p>Quello che ho intenzione di presentare \u00e8 come mi sto avvicinando per ora. Questo potrebbe cambiare in futuro, o forse no, e altri potrebbero avere una visione diversa.<\/p>\n<p>Indipendentemente da ci\u00f2, l&#8217;implementazione sar\u00e0 molto pi\u00f9 orientata agli oggetti e attribuir\u00e0 a ciascuna classe il proprio insieme di responsabilit\u00e0.<\/p>\n<p>La prima domanda, tuttavia, \u00e8 come possiamo dividere una classe con quattro funzioni e che eredita da una classe genitore?<\/p>\n<h3>Aggiornamento di Bootstrap<\/h3>\n<p>Innanzitutto, ci sono alcune cose che dobbiamo regolare nel bootstrap del plugin. Vale a dire, dobbiamo fare quanto segue:<\/p>\n<ol>\n<li>istanziare il Registro e renderlo disponibile attraverso il progetto,<\/li>\n<li>aggiorna la classe Plugin in modo che accetti un registro e carichi gli abbonati,<\/li>\n<li>rivedere il bootstrap<\/li>\n<\/ol>\n<p>Ecco uno sguardo a tutti e tre i precedenti.<\/p>\n<h3>1 Istanziare il Registro<\/h3>\n<p>Dal momento che ne abbiamo gi\u00e0 parlato all&#8217;inizio della serie, dovrebbe essere chiaro come farlo.<\/p>\n<p>Per prima cosa, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-00-instantiate-the-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vedere il seguente codice<\/a> :<\/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('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});<\/code><\/pre>\n<p>Successivamente, nota che stiamo creando un&#8217;istanza del registro (parleremo momentaneamente del suo spazio dei nomi) e quindi lo colleghiamo a un filtro personalizzato che ci consente di accedervi in \u200b\u200btutto il plug-in ogni volta che lo desideriamo.<\/p>\n<h3>2 Aggiorna la classe del plugin<\/h3>\n<p>Successivamente, dobbiamo aggiornare la classe del plugin principale (che risiede nella\u00a0 directory <strong>src<\/strong>) in modo che faccia riferimento al registro e carichi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-01-update-the-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tutti gli abbonati registrati<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\n\n\/**\n * The base class for this plugin. Maintains a copy of the registry and starts\n * all of the objects that should hook into WordPress.\n *\/\nclass Plugin\n{\n    \/**\n     * @var Registry a reference to the simple container used to maintain plugin objects\n     *\/\n    private $registry;\n\n    \/**\n     * @param Registry $registry a reference to the simple container used to maintain plugin objects\n     *\/\n    public function __construct(Registry $registry)\n    {\n        $this-&gt;registry = $registry;\n    }\n\n    \/**\n     * Iterates through each of the subscribers maintained in the registry and registers them\n     * to the proper WordPress hook.\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}<\/code><\/pre>\n<p>Nota, tuttavia, che non abbiamo ancora impostato alcun abbonato. L&#8217;abbiamo iniziato all&#8217;inizio della serie e ora \u00e8 il momento di tornare su di esso, ma lo faremo pi\u00f9 tardi.<\/p>\n<p>Tuttavia, \u00e8 necessario <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-03-new-registry-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aggiungere una funzione<\/a>, anche se temporanea, in modo da poter aggiungere classi che non siano sottoscrittori di eventi espliciti:<\/p>\n<pre><code>&lt;?php\n\/**\n * @return array all of the the objects that aren't subscribers registered with WordPress\n *\/\npublic function getRegisteredObjects()\n{\n    $objects = [];\n    foreach ($this-&gt;registry as $object) {\n        if (!$object instanceof AbstractSubscriber) {\n            $objects[] = $object;\n        }\n    }\n\n    return array_filter($objects);\n}<\/code><\/pre>\n<p>Questo verr\u00e0 rielaborato in seguito poich\u00e9 trasformeremo le classi principali in abbonati in seguito.<\/p>\n<h3>3 Esamina Bootstrap<\/h3>\n<p>Prima di andare oltre, penso che sia importante rivedere il bootstrap. Sebbene l&#8217;intestazione e la documentazione possano variare, \u00e8 importante notare che stiamo effettuando le seguenti operazioni:<\/p>\n<ul>\n<li>namespace il bootstrap,<\/li>\n<li>impedire l&#8217;accesso al file,<\/li>\n<li>chiamando il caricatore automatico,<\/li>\n<li>impostare il registro,<\/li>\n<li>e avviare il plugin.<\/li>\n<\/ul>\n<p>Sembra molto ma <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-02-the-current-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il codice \u00e8 piuttosto breve<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * WordPress Widget Boilerplate\n *\n * The WordPress Widget Boilerplate is an organized, maintainable boilerplate for building\n * widgets using WordPress best practices.\n *\n * @package   WordPressWidgetBoilerplate\n * @author    Your Name &lt;email@example.com&gt;\n * @license   GPL-3.0+\n * @link      http:\/\/example.com\n * @copyright 2018 - 2019 Your Name or Company Name\n *\n * @wordpress-plugin\n * Plugin Name:       WordPress Widget Boilerplate\n * Plugin URI:        https:\/\/github.com\/tommcfarlin\/wordpress-widget-boilerplate\n * Description:       An object-oriented foundation for building WordPress Widgets.\n * Version:           1.0.0\n * Author:            Tom McFarlin\n * Author URI:        https:\/\/tommcfarlin.com\n * Text Domain:       widget-name\n * License:           GPL-3.0+\n * License URI:       http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n * Domain Path:       \/lang\n *\/\n\nnamespace WordPressWidgetBoilerplate;\n\nuse WordPressWidgetBoilerplateUtilitiesRegistry;\nuse WordPressWidgetBoilerplatePlugin;\n\n\/\/ Prevent this file from being called directly.\ndefined('WPINC') || die;\n\n\/\/ Include the autoloader.\nrequire_once __DIR__. '\/vendor\/autoload.php';\n\n\/\/ Setup a filter so we can retrieve the registry throughout the plugin.\n$registry = new Registry();\nadd_filter('wpwBoilerplateRegistry', function() use ($registry) {\n    return $registry;\n});\n\n\/\/ Start the machine.\n(new Plugin($registry))-&gt;start();\n<\/code><\/pre>\n<p>A questo punto, per\u00f2, \u00e8 il momento di guardare a com&#8217;\u00e8 dividere la classe figlia <a href=\"https:\/\/codex.wordpress.org\/Widgets_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dall&#8217;API Widgets<\/a> standard in qualcosa che si adatta al modello di codice con cui stiamo lavorando.<\/p>\n<h2>Dividere una classe bambino<\/h2>\n<p>\u00c8 probabile che questa parte si estenda su alcuni post poich\u00e9 c&#8217;\u00e8 un po&#8217; di lavoro da fare, ma inizieremo creando la nostra classe widget che erediter\u00e0 dalla classe Widget di base.<\/p>\n<p>Per prima cosa, vai avanti e crea una\u00a0 directory <strong>API<\/strong> nella directory <strong>src<\/strong> e aggiungi un file chiamato <strong>Widget.php<\/strong>. \u00c8 qui che risiederanno le basi del widget. Nel prossimo post parleremo dei fogli di stile pubblici e amministrativi e dei file JavaScript.<\/p>\n<p>A questo punto, le basi del file dovrebbero <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-04-widget-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apparire cos\u00ec<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/*\n * This file is part of WordPress Widget Boilerplate\n * (c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n *\n * This source file is subject to the GPL license that is bundled\n * with this source code in the file LICENSE.\n *\/\n\nnamespace WordPressWidgetBoilerplateAPI;\n\nuse WP_Widget;\n\nclass Widget extends WP_Widget\n{\n    \/**\n     * @var string unique identifier for your widget\n     *\/\n    protected $widgetSlug;\n\n    \/**\n     * Initializes the plugin by setting its properties and calling the parent class with the description.\n     *\n     * @param mixed $widgetSlug\n     *\/\n    public function __construct($widgetSlug)\n    {\n        $this-&gt;widgetSlug = $widgetSlug;\n\n        \/\/ TODO: update description\n        parent::__construct(\n            $this-&gt;getWidgetSlug(),\n            __('Widget Name', $this-&gt;getWidgetSlug()),\n            [\n                'classname' =&gt; $this-&gt;getWidgetSlug().'-class',\n                'description' =&gt; __('Short description of the widget goes here.', $this-&gt;getWidgetSlug()),\n            ]\n        );\n    }\n\n    \/**\n     * Return the widget slug.\n     *\n     * @return string slug variable\n     *\/\n    public function getWidgetSlug()\n    {\n        return $this-&gt;widgetSlug;\n    }\n\n    \/**\n     * TODO: This is a temporary message to show that the Boilerplate has loaded.\n     *\/\n    public function load()\n    {\n        $html = '&lt;p style=\"text-align:center; background: #fff; padding: 1em; border: 1px dotted gray; margin: 2em 2em 2em 14em;\"&gt;';\n        $html .= 'The Widget Boilerplate is loaded.';\n        $html .= '&lt;\/p&gt;';\n        echo $html;\n    }\n}\n<\/code><\/pre>\n<p>Si noti che richiede un singolo argomento. Ho usato widget-name ma puoi usare qualunque cosa desideri purch\u00e9 rappresenti il \u200b\u200b\u200b\u200btuo widget.<\/p>\n<p>Questo per mostrare che la classe viene istanziata e caricata correttamente quando il plugin viene attivato. Se non vedi questo, allora qualcosa non va (che esamineremo momentaneamente).<\/p>\n<p>Successivamente, \u00e8 importante assicurarsi che questa classe venga aggiunta al Registro di sistema. Quindi aggiungi le seguenti righe di codice <a href=\"https:\/\/gist.github.com\/tommcfarlin\/9c39ba3635c823f85447d0378c8976d2#file-05-add-registry-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">nel bootstrap:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/\/ Add the Widget base class to the Registry.\n$registry-&gt;add('widget', new Widget('widget-name'));<\/code><\/pre>\n<p>E ora, quando attivi il plugin, dovresti vedere quanto segue:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160983-61e7189c9c671.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-160983-61e7189c9c671.png\" alt=\"Widget WordPress: refactoring, parte 7\"><\/a><\/p>\n<p>In caso contrario, assicurati di rivedere il codice nel <a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ramo di sviluppo<\/a> per assicurarti di avere tutto ci\u00f2 che \u00e8 descritto in questo post.<\/p>\n<h2>Abbonati implementanti<\/h2>\n<p>Nei prossimi post, vedremo come implementare gli abbonati per il lato pubblico del sito (ovvero, dove viene visualizzato il contenuto del widget). E faremo lo stesso per l&#8217;area di amministrazione del sito.<\/p>\n<p>Infine, rivolgeremo la nostra attenzione al codice responsabile della protezione e della serializzazione dei dati (leggi: aggiornamento del nostro widget) e quindi vedremo come appare la versione finale di un boilerplate aggiornato.<\/p>\n<p>In questo post, tuttavia, la strategia principale che stiamo impiegando \u00e8 suddividere una classe figlia in modo che possa ancora essere utilizzata con altre classi utilizzando interfacce e classi base che sono gi\u00e0 definite nella base di codice.<\/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>Il problema con WP_Widget \u00e8 che \u00e8 molto lavoro da fare per una singola classe. Quindi inizieremo a refactoring ora.<\/p>\n","protected":false},"author":1,"featured_media":236064,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[720],"tags":[1168],"class_list":["post-231542","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231542","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=231542"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231542\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236064"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231542"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231542"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}