{"id":231314,"date":"2022-12-13T13:53:00","date_gmt":"2022-12-13T10:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231314"},"modified":"2022-12-13T13:57:34","modified_gmt":"2022-12-13T10:57:34","slug":"widget-wordpress-un-approccio-orientato-agli-oggetti","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/widget-wordpress-un-approccio-orientato-agli-oggetti\/","title":{"rendered":"Widget WordPress: un approccio orientato agli oggetti"},"content":{"rendered":"\n<p>Anni fa, ho creato <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> con l&#8217;obiettivo di essere il seguente:<\/p>\n<blockquote>\n<p>Un boilerplate organizzato e manutenibile per la creazione di widget utilizzando le migliori pratiche di WordPress.<\/p>\n<\/blockquote>\n<p>Da allora, non \u00e8 cambiato molto per quanto riguarda l&#8217; <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API Widgets<\/a><\/strong> (che esamineremo pi\u00f9 avanti in questo post), ma quelle che considero &quot;best practices&quot; sono cambiate. Inoltre, il grado in cui penso che questa API sia una solida esempio di programmazione introduttiva orientata agli oggetti in WordPress \u00e8 alto.<\/p>\n<p>Non \u00e8 perch\u00e9 utilizza molti principi orientati agli oggetti, non \u00e8 perch\u00e9 utilizza standard moderni (almeno per quanto riguarda il moderno PHP), ma perch\u00e9 usa alcune cose che ci aiutano a riconoscerne alcune, diciamo, segnali riguardanti la programmazione orientata agli oggetti in WordPress.<\/p>\n<p>E questo \u00e8 qualcosa che non dovrebbe essere sottovalutato: se stai cercando esempi di programmazione orientata agli oggetti in WordPress, cerca le API che la utilizzino.<\/p>\n<p>Inoltre, se stai cercando modi per valutare il tuo livello di valutazione di un pezzo di codice (per non parlare di una base di codice) per l&#8217;uso di classi e alcune delle funzionalit\u00e0 pi\u00f9 avanzate di OOP, allora perch\u00e9 non avere una sorta di di una cartina di tornasole per vedere come stai?<\/p>\n<\/p>\n<p>E l&#8217;API Widgets fa proprio questo.<\/p>\n<h2>Widget WordPress: un&#8217;introduzione<\/h2>\n<p>Quindi, in una serie pi\u00f9 piccola della mia precedente, miro a guardare l&#8217;API Widgets e fare alcune cose:<\/p>\n<ol>\n<li>mostrarti lo scheletro di base di un widget e perch\u00e9 \u00e8 orientato agli oggetti,<\/li>\n<li>discutere quali cose dovresti essere in grado di notare e perch\u00e9,<\/li>\n<li>prima aggiorna il Widget Boilerplate direttamente su questo sito e poi invialo a GitHub,<\/li>\n<li>costruire un widget utilizzando l&#8217;API con il boilerplate come base per il nostro lavoro.<\/li>\n<\/ol>\n<p>E in questo post, inizieremo con il primo punto sopra.<\/p>\n<h3>Ma prima\u2026<\/h3>\n<p>Prima di entrare in questo post, ti consiglio di leggere i seguenti post:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Due pilastri della programmazione orientata agli oggetti: parte 1 di 2\">Due pilastri della programmazione orientata agli oggetti: parte 1 di 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Due pilastri della programmazione orientata agli oggetti: parte 2 di 2\">Due pilastri della programmazione orientata agli oggetti: parte 2 di 2<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-1-comportamento-astratto\/\" title=\"Classi astratte, parte 1 \u2013 Comportamento astratto\">Classi astratte, parte 1 \u2013 Comportamento astratto<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-2-classi-astratte-e-interfacce\/\" title=\"Classi astratte, parte 2 \u2013 Classi astratte e interfacce\">Classi astratte, parte 2 \u2013 Classi astratte e interfacce<\/a><\/strong><\/li>\n<\/ol>\n<p>Una volta terminato (o se ritieni di avere gi\u00e0 una comprensione degli argomenti), allora siamo pronti per partire.<\/p>\n<p>[restrict paid=&quot;true&#8221;]<\/p>\n<h2>Le basi dell&#8217;API dei widget<\/h2>\n<p>Se leggi la pagina del manuale su Widget, vedrai molti contenuti. Questa \u00e8 una buona cosa, ma non \u00e8 sempre la mossa migliore quando cerchi di distillare i contenuti per un pubblico come te quando cerchi consigli pratici e orientati agli oggetti.<\/p>\n<p>Quindi sceglier\u00f2 le parti rilevanti dalla documentazione dell&#8217;API e quindi la applicher\u00f2 al codice che ci viene fornito.<\/p>\n<h3>Cos&#8217;\u00e8 un widget?<\/h3>\n<p>Penso che la maggior parte di noi che lavora con WordPress sappia cos&#8217;\u00e8 un widget, ma \u00e8 importante definire il termine, quindi stiamo tutti lavorando sulla stessa idea. <strong><a href=\"https:\/\/developer.wordpress.org\/themes\/functionality\/widgets\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Il manuale recita:<\/a><\/strong><\/p>\n<blockquote>\n<p>Un widget \u00e8 un oggetto PHP che genera dell&#8217;HTML. Lo stesso tipo di widget pu\u00f2 essere utilizzato pi\u00f9 volte sulla stessa pagina (es. il widget di testo). I widget possono salvare i dati nel database (nella tabella delle opzioni).<\/p>\n<\/blockquote>\n<p>Con questo in atto, diamo un&#8217;occhiata al codice di un widget personalizzato, almeno uno stub di esso, e vediamo cosa possiamo ricavare per quanto riguarda la sua natura orientata agli oggetti.<\/p>\n<h3>La classe dei widget<\/h3>\n<p>Prima ancora di guardare il codice, sappiamo che ci sar\u00e0 un certo livello di programmazione orientata agli oggetti semplicemente perch\u00e9 la documentazione ci dice di fare tre cose:<\/p>\n<ol>\n<li>Crea la classe del tuo widget estendendo la classe <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Widget<\/a> standard e alcune delle sue funzioni.<\/li>\n<li>Registra il tuo widget in modo che sia reso disponibile nella schermata <strong>Widget<\/strong>.<\/li>\n<li>Assicurati che il tuo tema abbia almeno <strong><a href=\"https:\/\/make.wordpress.org\/docs\/theme-developer-handbook\/theme-functionality\/sidebars\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">un&#8217;area widget<\/a><\/strong> in cui aggiungere i widget.<\/li>\n<\/ol>\n<p>In questo post, mi concentrer\u00f2 sul primo punto (anche se alla fine arriveremo a come introdurre i nostri widget in un tema prima che la serie sia finita).<\/p>\n<p>Quindi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ea73655b0a022d65317529930cbb0cad#file-00-widget-base-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definiamo il codice<\/a><\/strong> come \u00e8 presentato nella documentazione e parliamo di ci\u00f2 che possiamo imparare da esso:<\/p>\n<pre><code>&lt;?php\nclass AcmeWidget extends WP_Widget \n{ \n    public function __construct() \n    {\n    }\n\n    public function widget($args, $instance) \n    {\n    }\n\n    public function form($instance)\n    {\n    }\n\n    public function update($newInstance, $oldInstance)\n    {\n    }\n}<\/code><\/pre>\n<p>Innanzitutto, notiamo che sebbene abbiamo definito una classe (che possiamo nominare come vogliamo, a modo mio), deve estendere <strong>WP_Widget<\/strong>. Ci\u00f2 significa che nel core di WordPress esiste una classe <strong>WP_Widget<\/strong>. \u00c8 possibile visualizzare un&#8217;analisi ben organizzata del codice sorgente in <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/files\/wp-includes\/class-wp-widget.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questa pagina.<\/a><\/strong><\/p>\n<p>In secondo luogo, la parola chiave <strong>extends<\/strong> indica che stiamo usando l&#8217; <strong><a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ereditariet\u00e0 PHP<\/a><\/strong>, che \u00e8 un pilastro fondamentale della programmazione orientata agli oggetti.<\/p>\n<p>Terzo, ci sono quattro funzioni che dobbiamo implementare, due delle quali richiedono argomenti. Le funzioni che dobbiamo implementare sono le seguenti:<\/p>\n<ul>\n<li><strong>__construct()<\/strong> che \u00e8 il costruttore di classi di base. Qui \u00e8 dove dovremo assicurarci che il costruttore della classe genitore sia chiamato, se ce n&#8217;\u00e8 uno, e quindi inizializzare qualsiasi propriet\u00e0 riteniamo necessaria per il nostro widget. Daremo un&#8217;occhiata a questo pi\u00f9 avanti nella serie.<\/li>\n<li><strong>widget()<\/strong> \u00e8 responsabile dell&#8217;output dei contenuti del widget che l&#8217;utente fornisce utilizzando l&#8217;interfaccia nell&#8217;area amministrativa. Accetta due parametri: <strong>$args<\/strong> e <strong>$instance.<\/strong> Il parametro <strong>$args<\/strong> \u00e8 l&#8217;informazione da visualizzare nella pagina, e <strong>$instance<\/strong> \u00e8 un riferimento all&#8217;istanza del widget (poich\u00e9 \u00e8 possibile eseguire il rendering di pi\u00f9 widget su una pagina).<\/li>\n<li><strong>form()<\/strong> mostra l&#8217;interfaccia amministrativa con cui l&#8217;utente interagisce per guidare l&#8217;output sul front-end del sito. Richiede anche l&#8217; argomento <strong>$istanza<\/strong> in modo che le informazioni fornite siano per il widget effettivo con cui l&#8217;utente sta lavorando (rispetto a tutte le istanze del widget).<\/li>\n<li><strong>update()<\/strong> viene utilizzato per salvare i valori nell&#8217;istanza corrente del widget. Accetta due argomenti. Il primo \u00e8 la nuova istanza del widget con gli aggiornamenti dei valori forniti dall&#8217;utente (pensate di aggiornare il valore di un widget di testo attivo) e il secondo argomento \u00e8 quello della vecchia istanza del widget o forse dell&#8217;istanza precedente o forse &quot; l&#8217;istanza che conteneva i valori precedenti.<\/li>\n<\/ul>\n<p>Queste quattro funzioni sono necessarie per essere implementate come parte dell&#8217;API Widget, come parte delle funzioni ereditarie dall&#8217;interfaccia estesa e per produrre le funzionalit\u00e0 di base di un widget.<\/p>\n<p>Ci\u00f2 non significa che non sia possibile aggiungere altro, ma in un buon modo orientato agli oggetti, sarebbe probabilmente meglio relegare quel comportamento in altre classi. Ma daremo un&#8217;occhiata a farlo pi\u00f9 avanti nella serie quando creeremo il nostro widget.<\/p>\n<h3>Quali sono i punti chiave da asporto?<\/h3>\n<p>Per essere sicuro di essere chiaro su cosa si capirebbe da questo post, \u00e8 il seguente:<\/p>\n<ul>\n<li>L&#8217;API dei widget \u00e8 orientata agli oggetti. Non \u00e8 solo orientato agli oggetti perch\u00e9 usa una classe (anche se questo \u00e8 certamente un buon punto di partenza), ma anche perch\u00e9 eredita le funzionalit\u00e0 integrate in una classe base preesistente.<\/li>\n<li>Ogni volta che ereditiamo il comportamento da una classe base o da una classe genitore, otteniamo gratuitamente funzionalit\u00e0 pre-sviluppate. \u00c8 davvero una cosa grandiosa della programmazione orientata agli oggetti perch\u00e9 ci consente di concentrarci in modo specifico sulla logica di programmazione che desideriamo implementare.<\/li>\n<\/ul>\n<p>Immagina per un momento di voler sviluppare un widget, ma ogni volta che lo fai, devi scrivere tutte le funzionalit\u00e0 per gli hook in WordPress per fare tutte le stesse, ripetitive funzionalit\u00e0 standard.<\/p>\n<p>\u00c8 qui che entrano in gioco l&#8217;ereditariet\u00e0 e la programmazione orientata agli oggetti. Il codice ripetitivo viene astratto in una classe base, quindi viene scritto solo una volta e quindi il codice su cui vogliamo concentrarci viene lasciato a noi per l&#8217;implementazione.<\/p>\n<p>Tutto quanto sopra \u00e8 ci\u00f2 che dovrebbe essere compreso quando si legge questo passaggio iniziale al codice sorgente per un&#8217;API di base orientata agli oggetti in WordPress.<\/p>\n<h2>Qual \u00e8 il prossimo?<\/h2>\n<p>Nel prossimo post di questa serie, esamineremo la natura orientata agli oggetti dell&#8217;API Widgets e quali cose dovresti essere in grado di rilevare immediatamente leggendo il codice.<\/p>\n<p>Questo perch\u00e9 \u00e8 importante riconoscere in pratica determinati principi orientati agli oggetti e questo \u00e8 un buon modo per valutare se sei in grado di farlo o meno. Se lo sei, fantastico! Quindi continuer\u00e0 ad aiutare a sviluppare quel muscolo. In caso contrario, non preoccuparti: ti aiuta comunque a sviluppare quel muscolo.<\/p>\n<p>E ti servir\u00e0 bene mentre continuiamo a muoverci sempre di pi\u00f9 nello sviluppo di WordPress orientato agli oggetti attraverso mezzi pratici.<\/p>\n<p>La teoria necessaria \u00e8 stata coperta. Quindi iniziamo a metterlo in pratica.<\/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;API dei widget di WordPress aiuta a fornire una solida cartina di tornasole e un esempio di come iniziare con la programmazione orientata agli oggetti in WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236133,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,804,720,865],"tags":[1168],"class_list":["post-231314","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231314","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=231314"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231314\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236133"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}