{"id":233860,"date":"2023-02-23T19:30:00","date_gmt":"2023-02-23T16:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233860"},"modified":"2022-11-11T12:50:41","modified_gmt":"2022-11-11T09:50:41","slug":"tutorial-crea-un-widget-di-microdati-per-la-tua-azienda-in-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/tutorial-crea-un-widget-di-microdati-per-la-tua-azienda-in-wordpress\/","title":{"rendered":"Tutorial: crea un widget di microdati per la tua azienda in WordPress"},"content":{"rendered":"\n<p>In questo tutorial impareremo come creare un widget personalizzato che restituisca le informazioni sulla tua attivit\u00e0, come il nome ufficiale, l&#8217;indirizzo, il numero di telefono e l&#8217;e-mail. Ma faremo un ulteriore passo avanti emettendolo con <a href=\"https:\/\/schema.org\/docs\/gs.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">microdati<\/a> o markup dello schema, che consentir\u00e0 ai motori di ricerca di comprendere i tuoi contenuti.<\/p>\n<p>I widget sono blocchi dinamici che possono essere inseriti nelle aree disponibili del tuo tema. Di solito il tuo tema dovrebbe avere almeno una barra laterale e una o pi\u00f9 aree nel pi\u00e8 di pagina. Avere le informazioni sulla tua attivit\u00e0 come widget nel pi\u00e8 di pagina \u00e8 comune e piuttosto intelligente, poich\u00e9 il pi\u00e8 di pagina appare su tutte le pagine del tuo sito.<\/p>\n<p>I microdati sono attributi HTML aggiuntivi che spiegano cosa contiene un tag HTML specifico in modo che una macchina possa capire cosa sono (ad esempio nome dell&#8217;azienda, numero di telefono, indirizzo dell&#8217;azienda, indirizzo e-mail dell&#8217;azienda, ecc.). Ci\u00f2 consente ai motori di ricerca come Google di estrarre informazioni sulla tua attivit\u00e0 dal tuo HTML.<\/p>\n<h2>Cosa creeremo<\/h2>\n<p>Il nostro widget produrr\u00e0 informazioni utilizzando lo schema di microdati <a href=\"https:\/\/schema.org\/LocalBusiness\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">LocalBusiness<\/a>, perfetto per un&#8217;organizzazione o un&#8217;azienda. Sta a te decidere quali propriet\u00e0 desideri produrre, fai semplicemente clic sul collegamento sopra per leggere tutte le possibili propriet\u00e0 all&#8217;interno di LocalBusiness (comprese quelle ereditate). La tua azienda o il tuo paese potrebbero preferire diversi tipi di informazioni.<\/p>\n<p>Il widget di questo tutorial produrr\u00e0 le seguenti informazioni facoltative:<\/p>\n<ul>\n<li>Ragione Sociale (Propriet\u00e0 Microdati: <code>legalName<\/code>)<\/li>\n<li>Partita IVA o numero organizzazione (Propriet\u00e0 Microdati: <code>vatID<\/code>)<\/li>\n<li>Indirizzo postale (tag microdati: <code>PostalAddress<\/code>con propriet\u00e0 per <code>streetAddress<\/code>, <code>postalCode<\/code>, e <code>addressLocality<\/code>)<\/li>\n<li>Indirizzo e-mail dell&#8217;azienda (Propriet\u00e0 Microdati: <code>email<\/code>)<\/li>\n<li>Numero di telefono (Propriet\u00e0 Microdati: <code>telephone<\/code>)<\/li>\n<\/ul>\n<p>Questo tutorial non ti guider\u00e0 attraverso lo stile del widget, poich\u00e9 dovrebbe essere abbastanza semplice. In frontend il nostro widget apparir\u00e0 come un normale widget di testo. Ma ovviamente, sotto il cofano, ha un markup dello schema che aiuta Google.<\/p>\n<h2>Le basi della creazione di un widget personalizzato<\/h2>\n<p>Puoi inserire il tuo codice nel tuo tema <code>functions.php<\/code>o creare un plug-in personalizzato. Ricorda solo che se lo mantieni in un plug-in, perderai il widget quando disattivi il plug-in; e allo stesso modo tenerlo nel tema ti far\u00e0 perdere il widget se passi a un altro tema. In questo esempio aggiunger\u00f2 il codice nel file <code>functions.php<\/code>.<\/p>\n<p>La creazione di un widget viene eseguita con codice PHP orientato agli oggetti. Scrivi una classe PHP che estende la classe widget di WordPress e la inizializzi chiamando <code>register_widget()<\/code>e fornendo il nome della tua classe. In questo tutorial ho chiamato la mia classe di widget <code>LocalBusiness<\/code>.<\/p>\n<p>Iniziamo chiamando <code>register_widget()<\/code>all&#8217;interno di una funzione agganciata all&#8217;azione <code>widgets_init<\/code>.<\/p>\n<pre><code>add_action('widgets_init', function() {\n    register_widget('LocalBusiness');\n});<\/code><\/pre>\n<p>Esaminiamo rapidamente lo scheletro di una classe widget personalizzata:<\/p>\n<pre><code>class LocalBusiness extends WP_Widget {\n\u00a0\n    \/\/ Initialize your widget in the class constructor\n    public function __construct() { }\n\u00a0\n    \/\/ Responsible for outputting the widget in frontend\n    public function widget($args, $instance) { }\n\u00a0\n    \/\/ Responsible for outputting the widget settings in admin\n    public function form($instance) { }\n\u00a0\n    \/\/ Responsible for saving settings in admin\n    public function update($new_instance, $old_instance) { }\n}<\/code><\/pre>\n<p>Come puoi vedere dall&#8217;alto, avrai bisogno di quattro funzioni all&#8217;interno della tua classe. Esaminiamo ogni funzione una per una e riempiamole.<\/p>\n<h2>Creazione di un widget per i microdati di LocalBusiness<\/h2>\n<p>Il punto pi\u00f9 logico da cui iniziare \u00e8 nel costruttore, che \u00e8 responsabile della configurazione del widget.<\/p>\n<h3>La funzione __construct()<\/h3>\n<p>All&#8217;interno del costruttore \u00e8 necessario impostare alcune variabili, come il nome del widget, e chiamare la funzione di costruzione del genitore (la classe genitore \u00e8 quella che estendi; <code>WP_Widget<\/code>). Maggiori informazioni sulle <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_widget\/__construct\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">possibili opzioni nel costruttore qui<\/a>. Fornir\u00f2 un ID di base, un titolo e una descrizione, in questo modo:<\/p>\n<pre><code>\/\/ Initialize your widget in the class constructor\npublic function __construct() {\n    $widget_ops = [\n        'description' =&gt; __('Outputs business information with Microdata', 'txtdomain')\n    ];\n    parent::__construct('local_business', __('Local Business Information', 'txtdomain'), $widget_ops);\n}<\/code><\/pre>\n<p>Puoi fare di pi\u00f9 nel <code>__construct<\/code>metodo, come accodare gli script o definire pi\u00f9 impostazioni del widget. Ma quanto sopra \u00e8 di solito sufficiente nella maggior parte dei casi.<\/p>\n<h3>La funzione form()<\/h3>\n<p>Il passaggio successivo \u00e8 la creazione di tutte le impostazioni e gli input accettati dal widget in admin. Per inviare le impostazioni all&#8217;amministratore del widget utilizziamo la funzione <code>form()<\/code>che ti fornisce un parametro; un array che contiene tutte le opzioni del widget eventualmente salvate. \u00c8 importante produrre l&#8217;impostazione salvata corrispondente in tutti i tuoi input in modo che i dati vengano conservati. (Vedremo come salvare le impostazioni nel passaggio successivo).<\/p>\n<p>C&#8217;\u00e8 molto da tenere traccia nella funzione del modulo, quindi aggiungiamo prima un input, per il nome legale, e assicurati di capire cosa dobbiamo fare:<\/p>\n<pre><code>\/\/ Responsible for outputting the widget settings in admin\npublic function form($instance) { \n    ?&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('legal_name'); ?&gt;\"&gt;&lt;?php _e('Legal name:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input \n            type=\"text\" \n            class=\"widefat\" \n            id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('legal_name')); ?&gt;\"\n            name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('legal_name')); ?&gt;\"\n            value=\"&lt;?php echo esc_attr($instance['legal_name']); ?&gt;\"\n        \/&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}<\/code><\/pre>\n<p>Prima di tutto il codice sopra emette alcuni wrapper e classi HTML nella forma in cui WordPress emette i moduli dei loro widget: lo facciamo in modo che il modulo abbia un bell&#8217;aspetto.<\/p>\n<p>Ci sono due funzioni con cui devi familiarizzare; <code>get_field_id()<\/code>ed <code>get_field_name()<\/code>entrambe sono funzioni all&#8217;interno <code>WP_Widget<\/code>(motivo per cui chiami &quot; <code>$this-&gt;<\/code>&quot; davanti &#8211; mentre <code>$this<\/code>si riferisce all&#8217;istanza della classe). Le funzioni restituiscono l&#8217;ID e il nome di un campo fornito, rispettivamente, da utilizzare nei tuoi input <code>id<\/code>e <code>name<\/code>attributi. \u00c8 molto importante per non dimenticare di aggiungere un <code>name<\/code>attributo al tuo input, altrimenti non ne otterrai mai il valore durante il salvataggio.<\/p>\n<p>E infine emettiamo il valore salvato corrente in relazione <code>value<\/code>al nostro input facendo riferimento all&#8217;argomento passato <code>$instance<\/code>. Senza farlo per il tuo valore, l&#8217;input non verr\u00e0 mai popolato con ci\u00f2 che \u00e8 salvato nel database e apparir\u00e0 ogni volta vuoto, il che pu\u00f2 confondere gli utenti.<\/p>\n<p>Se desideri input di moduli diversi, come caselle di controllo o menu a discesa, dovresti essere in grado di aggiungerli facilmente seguendo le regole sopra menzionate. Aggiungiamo il resto delle nostre impostazioni del widget. Sono tutti input di testo, quindi \u00e8 lo stesso codice ripetuto sopra, tranne i loro ID campo. Il nostro <code>form()<\/code>metodo finisce per assomigliare a questo:<\/p>\n<pre><code>\/\/ Responsible for outputting the widget settings in admin\npublic function form($instance) { \n    ?&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('legal_name'); ?&gt;\"&gt;&lt;?php _e('Legal name:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('legal_name')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('legal_name')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['legal_name']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('vat_id'); ?&gt;\"&gt;&lt;?php _e('Vat ID\/Organization number:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('vat_id')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('vat_id')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['vat_id']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('street_address'); ?&gt;\"&gt;&lt;?php _e('Street address:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('street_address')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('street_address')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['street_address']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('postal_code'); ?&gt;\"&gt;&lt;?php _e('Postal code:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('postal_code')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('postal_code')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['postal_code']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('postal_city'); ?&gt;\"&gt;&lt;?php _e('City:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('postal_city')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('postal_city')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['postal_city']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('email_address'); ?&gt;\"&gt;&lt;?php _e('E-mail address:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('email_address')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('email_address')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['email_address']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;p&gt;\n        &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('phone_number'); ?&gt;\"&gt;&lt;?php _e('Phone number:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n        &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('phone_number')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('phone_number')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['phone_number']); ?&gt;\" \/&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}<\/code><\/pre>\n<p>Se aggiungi il tuo widget in un&#8217;area widget disponibile, dovrebbe apparire cos\u00ec:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152019-61e4d2d64b664.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-152019-61e4d2d64b664.png\" alt=\"Tutorial: crea un widget di microdati per la tua azienda in WordPress\" ><\/a><\/p>\n<h3>La funzione update()<\/h3>\n<p>La <code>update()<\/code>funzione \u00e8 responsabile del salvataggio effettivo dei valori immessi in admin. Sfortunatamente WordPress non lo fa automaticamente per te. In questa funzione sono forniti due parametri; di solito chiamato <code>$new_instance<\/code>e <code>$old_instance<\/code>. All&#8217;interno del primo parametro, <code>$new_instance<\/code>troverai tutti i valori che sono stati inviati, e nel secondo, <code>$old_instance<\/code>troverai i valori che sono attualmente salvati nel database. Ci\u00f2 ti consente di fare alcuni confronti intelligenti, se necessario.<\/p>\n<p>Di solito dovresti semplicemente creare un nuovo array di tutte le impostazioni del tuo widget e salvare tutto ci\u00f2 che \u00e8 impostato all&#8217;interno <code>$new_instance<\/code>. Ci occupiamo anche di un po&#8217; di sanificazione. Alla fine restituiamo semplicemente questo array, che dir\u00e0 a WordPress cosa salvare.<\/p>\n<pre><code>\/\/ Responsible for saving settings in admin\npublic function update($new_instance, $old_instance) {\n    $instance = [];\n    $instance['legal_name'] = (!empty($new_instance['legal_name']))? strip_tags($new_instance['legal_name']): '';\n    $instance['vat_id'] = (!empty($new_instance['vat_id']))? strip_tags($new_instance['vat_id']): '';\n    $instance['street_address'] = (!empty($new_instance['street_address']))? strip_tags($new_instance['street_address']): '';\n    $instance['postal_code'] = (!empty($new_instance['postal_code']))? strip_tags($new_instance['postal_code']): '';\n    $instance['postal_city'] = (!empty($new_instance['postal_city']))? strip_tags($new_instance['postal_city']): '';\n    $instance['email_address'] = (!empty($new_instance['email_address']))? strip_tags($new_instance['email_address']): '';\n    $instance['phone_number'] = (!empty($new_instance['phone_number']))? strip_tags($new_instance['phone_number']): '';\n    return $instance;\n}<\/code><\/pre>\n<p>Ora puoi testare il tuo widget se lo desideri e verificare che i valori immessi vengano salvati. E se ti ricordi di impostare <code>value<\/code>correttamente l&#8217;attributo in <code>form()<\/code>, quando salvi e premi Aggiorna, i valori dovrebbero essere mantenuti. Grande! Ora passiamo all&#8217;ultimo, e certamente il pi\u00f9 divertente, passaggio: produrre il bit del frontend.<\/p>\n<h3>La funzione widget()<\/h3>\n<p>La <code>widget()<\/code>funzione \u00e8 responsabile dell&#8217;output del tuo widget nel frontend. Otterremo due argomenti per la funzione; in primo luogo un array con alcune informazioni utili come i wrapper dell&#8217;area del widget definiti del tema e, in secondo luogo, i valori di impostazione del widget salvati.<\/p>\n<p>L&#8217;output del tuo widget dovrebbe sempre iniziare con l&#8217;eco <code>$args['before_widget']<\/code>e finire sempre con l&#8217;eco <code>$args['after_widget']<\/code>. Questo assicura che il tuo widget venga racchiuso negli stessi wrapper HTML del widget come definito dal tema. Lungo le stesse tracce, puoi fare eco <code>$args['before_title']<\/code>e <code>$args['after_title']<\/code>generare involucri HTML corretti attorno al titolo del widget. Non abbiamo un vero titolo del widget di per s\u00e9, ma includeremo il nome legale dell&#8217;azienda come titolo del widget.<\/p>\n<p>Altrimenti puoi ottenere i tuoi valori salvati facendo riferimento al secondo argomento, <code>$instance<\/code>, con i nomi delle tue chiavi impostati in <code>form()<\/code>e <code>update()<\/code>. \u00c8 buona norma emettere solo le impostazioni che sono state impostate e ignorare quelle vuote.<\/p>\n<p>Poich\u00e9 stiamo anche emettendo microdati, dobbiamo aggiungere le propriet\u00e0 corrispondenti seguendo le regole di schema.org.<\/p>\n<p>Sta a te decidere come vuoi produrre il tuo widget; potresti probabilmente considerare l&#8217;aggiunta di pi\u00f9 wrapper HTML per uno stile pi\u00f9 semplice.<\/p>\n<pre><code>\/\/ Responsible for outputting the widget in frontend\npublic function widget($args, $instance) {\n    echo $args['before_widget'];\n\u00a0\n    ?&gt;&lt;div itemscope itemtype=\"https:\/\/schema.org\/LocalBusiness\"&gt;&lt;?php\n\u00a0\n    if (!empty($instance['legal_name'])) {\n        echo $args['before_title'];\n        ?&gt;&lt;span itemprop=\"legalName\"&gt;&lt;?php echo $instance['legal_name']; ?&gt;&lt;\/span&gt;&lt;?php\n\u00a0\n        echo $args['after_title'];\n    }\n\u00a0\n    if (!empty($instance['vat_id'])) {\n        ?&gt;&lt;span itemprop=\"vatID\" class=\"business-vatid\"&gt;&lt;?php printf(__('Vat: %s', 'txtdomain'), $instance['vat_id']); ?&gt;&lt;\/span&gt;&lt;?php\n    }\n\u00a0\n    if (!empty($instance['street_address'])) {\n        ?&gt;&lt;div itemprop=\"address\" itemscope itemtype=\"https:\/\/schema.org\/PostalAddress\" class=\"business-address\"&gt;&lt;?php\n\u00a0\n            ?&gt;&lt;span itemprop=\"streetAddress\"&gt;&lt;?php echo $instance['street_address']; ?&gt;&lt;\/span&gt;&lt;?php\n\u00a0\n            if (!empty($instance['postal_code'])) {\n                ?&gt;&lt;span itemprop=\"postalCode\"&gt;&lt;?php echo $instance['postal_code']; ?&gt;&lt;\/span&gt;&lt;?php\n            }\n            if (!empty($instance['postal_city'])) {\n                ?&gt;&lt;span itemprop=\"addressLocality\"&gt;&lt;?php echo $instance['postal_city']; ?&gt;&lt;\/span&gt;&lt;?php\n            }               \n\u00a0\n        ?&gt;&lt;\/div&gt;&lt;?php\n    }\n\u00a0\n    if (!empty($instance['email_address'])) {\n        ?&gt;&lt;a href=\"mailto:&lt;?php echo $instance['email_address']; ?&gt;\" title=\"&lt;?php _e('Send email', 'txtdomain'); ?&gt;\" class=\"business-email\"&gt;\n            &lt;span itemprop=\"email\"&gt;&lt;?php echo $instance['email_address']; ?&gt;&lt;\/span&gt;\n        &lt;\/a&gt;&lt;?php\n    }\n\u00a0\n    if (!empty($instance['phone_number'])) {\n        ?&gt;&lt;a href=\"tel:&lt;?php echo $instance['phone_number']; ?&gt;\" title=\"&lt;?php _e('Call us', 'txtdomain'); ?&gt;\" class=\"business-phone\"&gt;\n            &lt;span itemprop=\"telephone\"&gt;&lt;?php echo $instance['phone_number']; ?&gt;&lt;\/span&gt;\n        &lt;\/a&gt;&lt;?php\n    }\n\u00a0\n    ?&gt;&lt;\/div&gt;&lt;?php\n\u00a0\n    echo $args['after_widget'];\n}<\/code><\/pre>\n<p>Personalizza l&#8217;output, aggiungi un po&#8217; di stile e il gioco \u00e8 fatto!<\/p>\n<p>Cordiali saluti: il tuo widget ricever\u00e0 il nome della classe di wrapping &quot; <code>widget_&lt;base ID&gt;<\/code>&quot; (l&#8217;ID di base \u00e8 quello che hai fornito nel costruttore). Nel nostro caso il nostro widget otterr\u00e0 la classe &quot; <code>widget_local_business<\/code>&quot;. Questo potrebbe aiutarti ad aggiungere uno stile mirato.<\/p>\n<h2>Conclusione e codice finale<\/h2>\n<p>In questo tutorial abbiamo imparato come creare un widget personalizzato e come eseguire il rendering di un output formattato in microdati dalle sue impostazioni. Dovresti essere in grado di creare i tuoi widget, seguendo le basi di una classe di widget!<\/p>\n<p>Per riferimento, ecco il codice completo, tutto insieme.<\/p>\n<pre><code>add_action('widgets_init', function() {\n    register_widget('LocalBusiness');\n});\n\u00a0\nclass LocalBusiness extends WP_Widget {\n\u00a0\n    \/\/ Initialize your widget in the class constructor\n    public function __construct() {\n        $widget_ops = [\n            'description' =&gt; __('Outputs business information with Microdata', 'txtdomain')\n        ];\n        parent::__construct('local_business', __('Local Business Information', 'txtdomain'), $widget_ops);\n    }\n\u00a0\n    \/\/ Responsible for outputting the widget in frontend\n    public function widget($args, $instance) {\n        echo $args['before_widget'];\n\u00a0\n        ?&gt;&lt;div itemscope itemtype=\"https:\/\/schema.org\/LocalBusiness\"&gt;&lt;?php\n\u00a0\n        if (!empty($instance['legal_name'])) {\n            echo $args['before_title'];\n            ?&gt;&lt;span itemprop=\"legalName\"&gt;&lt;?php echo $instance['legal_name']; ?&gt;&lt;\/span&gt;&lt;?php\n\u00a0\n            echo $args['after_title'];\n        }\n\u00a0\n        if (!empty($instance['vat_id'])) {\n            ?&gt;&lt;span itemprop=\"vatID\" class=\"business-vatid\"&gt;&lt;?php printf(__('Vat: %s', 'txtdomain'), $instance['vat_id']); ?&gt;&lt;\/span&gt;&lt;?php\n        }\n\u00a0\n        if (!empty($instance['street_address'])) {\n            ?&gt;&lt;div itemprop=\"address\" itemscope itemtype=\"https:\/\/schema.org\/PostalAddress\" class=\"business-address\"&gt;&lt;?php\n\u00a0\n                ?&gt;&lt;span itemprop=\"streetAddress\"&gt;&lt;?php echo $instance['street_address']; ?&gt;&lt;\/span&gt;&lt;?php\n\u00a0\n                if (!empty($instance['postal_code'])) {\n                    ?&gt;&lt;span itemprop=\"postalCode\"&gt;&lt;?php echo $instance['postal_code']; ?&gt;&lt;\/span&gt;&lt;?php\n                }\n                if (!empty($instance['postal_city'])) {\n                    ?&gt;&lt;span itemprop=\"addressLocality\"&gt;&lt;?php echo $instance['postal_city']; ?&gt;&lt;\/span&gt;&lt;?php\n                }               \n\u00a0\n            ?&gt;&lt;\/div&gt;&lt;?php\n        }\n\u00a0\n        if (!empty($instance['email_address'])) {\n            ?&gt;&lt;a href=\"mailto:&lt;?php echo $instance['email_address']; ?&gt;\" title=\"&lt;?php _e('Send email', 'txtdomain'); ?&gt;\" class=\"business-email\"&gt;\n                &lt;span itemprop=\"email\"&gt;&lt;?php echo $instance['email_address']; ?&gt;&lt;\/span&gt;\n            &lt;\/a&gt;&lt;?php\n        }\n\u00a0\n        if (!empty($instance['phone_number'])) {\n            ?&gt;&lt;a href=\"tel:&lt;?php echo $instance['phone_number']; ?&gt;\" title=\"&lt;?php _e('Call us', 'txtdomain'); ?&gt;\" class=\"business-phone\"&gt;\n                &lt;span itemprop=\"telephone\"&gt;&lt;?php echo $instance['phone_number']; ?&gt;&lt;\/span&gt;\n            &lt;\/a&gt;&lt;?php\n        }\n        ?&gt;&lt;\/div&gt;&lt;?php\n\u00a0\n        echo $args['after_widget'];\n    }\n\u00a0\n    \/\/ Responsible for outputting the widget settings in admin\n    public function form($instance) { \n        ?&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('legal_name'); ?&gt;\"&gt;&lt;?php _e('Legal name:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('legal_name')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('legal_name')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['legal_name']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('vat_id'); ?&gt;\"&gt;&lt;?php _e('Vat ID\/Organization number:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('vat_id')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('vat_id')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['vat_id']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('street_address'); ?&gt;\"&gt;&lt;?php _e('Street address:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('street_address')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('street_address')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['street_address']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('postal_code'); ?&gt;\"&gt;&lt;?php _e('Postal code:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('postal_code')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('postal_code')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['postal_code']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('postal_city'); ?&gt;\"&gt;&lt;?php _e('City:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('postal_city')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('postal_city')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['postal_city']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('email_address'); ?&gt;\"&gt;&lt;?php _e('E-mail address:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('email_address')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('email_address')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['email_address']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;p&gt;\n            &lt;label for=\"&lt;?php echo $this-&gt;get_field_id('phone_number'); ?&gt;\"&gt;&lt;?php _e('Phone number:', 'txtdomain'); ?&gt;&lt;\/label&gt;\n            &lt;input type=\"text\" class=\"widefat\" id=\"&lt;?php echo esc_attr($this-&gt;get_field_id('phone_number')); ?&gt;\" name=\"&lt;?php echo esc_attr($this-&gt;get_field_name('phone_number')); ?&gt;\" value=\"&lt;?php echo esc_attr($instance['phone_number']); ?&gt;\" \/&gt;\n        &lt;\/p&gt;\n        &lt;?php\n    }\n\u00a0\n    \/\/ Responsible for saving settings in admin\n    public function update($new_instance, $old_instance) {\n        $instance = [];\n        $instance['legal_name'] = (!empty($new_instance['legal_name']))? strip_tags($new_instance['legal_name']): '';\n        $instance['vat_id'] = (!empty($new_instance['vat_id']))? strip_tags($new_instance['vat_id']): '';\n        $instance['street_address'] = (!empty($new_instance['street_address']))? strip_tags($new_instance['street_address']): '';\n        $instance['postal_code'] = (!empty($new_instance['postal_code']))? strip_tags($new_instance['postal_code']): '';\n        $instance['postal_city'] = (!empty($new_instance['postal_city']))? strip_tags($new_instance['postal_city']): '';\n        $instance['email_address'] = (!empty($new_instance['email_address']))? strip_tags($new_instance['email_address']): '';\n        $instance['phone_number'] = (!empty($new_instance['phone_number']))? strip_tags($new_instance['phone_number']): '';\n        return $instance;\n    }\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questo tutorial spiega come creare un widget personalizzato che genera informazioni aziendali con il markup dello schema di microdati per LocalBusiness.<\/p>\n","protected":false},"author":1,"featured_media":223853,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[979,896,896,720,979,835,996,996,1110,835,1007,1007,928,720,928,844,844,865,865],"tags":[1168],"class_list":["post-233860","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-affare","category-codice","category-sviluppatore","category-guida-per-principianti","category-marketing-dei-contenuti","category-n-a","category-seo-7","category-soggetti","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233860","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=233860"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/233860\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223853"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=233860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=233860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=233860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}