{"id":228912,"date":"2022-10-13T19:46:00","date_gmt":"2022-10-13T16:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228912"},"modified":"2022-11-09T04:46:04","modified_gmt":"2022-11-09T01:46:04","slug":"creazione-di-un-controllo-di-selezione-link-cmb2-personalizzato-per-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/creazione-di-un-controllo-di-selezione-link-cmb2-personalizzato-per-wordpress\/","title":{"rendered":"Creazione di un controllo di selezione link CMB2 personalizzato per WordPress"},"content":{"rendered":"\n<p>In questo tutorial vedremo come creare un controllo personalizzato per estendere la funzionalit\u00e0 di <a href=\"https:\/\/wordpress.org\/plugins\/cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CMB2<\/a> (Custom Meta Boxes 2) di <a href=\"https:\/\/webdevstudios.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WebDevStudios<\/a>.<\/p>\n<p>Sviluppo siti web (e applicazioni web) con <a href=\"https:\/\/wordpress.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress<\/a> CMS (Content Management System), e quando arriva un nuovo progetto puoi garantire che ci sar\u00e0 l&#8217;obbligo per me di sviluppare &#8216;Custom Meta Box&#8217; per consentire all&#8217;utente di avere un controllo accurato sul contenuto e sul layout dei siti.<\/p>\n<p>Descriver\u00f2 in dettaglio come ho creato il <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Link Picker di controllo CMB2 per CMB2<\/a> (disponibile in tutti i buoni repository di plugin di WordPress). Uno screenshot di cui pu\u00f2 essere visto di seguito.<\/p>\n<p>Il controllo CMB2 &quot;Link Picker&quot; in azione<\/p>\n<p>Il selettore di link attiva la finestra di dialogo &quot;Inserisci\/modifica link&quot; incorporata in WordPress quando fai clic sul pulsante &quot;Scegli&quot;. Questo pu\u00f2 essere visto nello screenshot qui sotto:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Creazione di un controllo di selezione link CMB2 personalizzato per WordPress\" \/>Premendo il pulsante puoi scegliere da un link (o aggiungerne uno tuo)<\/p>\n<p>Sono sicuro che sarai d&#8217;accordo sul fatto che avere un controllo come questo \u00e8 incredibilmente utile se vuoi dare agli editori del tuo sito la possibilit\u00e0 di aggiungere un collegamento e anche cercare in WordPress i suoi collegamenti interni, piuttosto che dover tagliare e incollare i collegamenti in un collegamento campo.<\/p>\n<h2>Introduzione \/ Storia<\/h2>\n<p>Per chi non lo sapesse, una meta box risiede nella schermata dell&#8217;editor di un post di WordPress e probabilmente conterr\u00e0 vari controlli dei moduli (caselle di testo, elenchi a discesa, caselle di controllo ecc&#8230;). Questi controlli consentono agli utenti del tuo sito Web di modificare facilmente una parte di testo o una funzionalit\u00e0 personalizzata sul sito.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Creazione di un controllo di selezione link CMB2 personalizzato per WordPress\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3a6c2f7.png\" alt=\"Creazione di un controllo di selezione link CMB2 personalizzato per WordPress\" \/>Un esempio di meta box con vari controlli del modulo<\/p>\n<p>WordPress ti consente di creare meta box utilizzando funzioni (come <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)<\/code>), ma la creazione di meta box in questo modo pu\u00f2 essere un processo lungo, con molte ripetizioni di codice (soprattutto se desideri utilizzare gli stessi controlli del modulo in pi\u00f9 progetti).<\/p>\n<h2>Perch\u00e9 CMB2?<\/h2>\n<p>Alcuni di voi potrebbero aver sentito parlare di <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) che fornisce una GUI (Graphical User Interface) che consente di creare meta box direttamente con WordPress.<\/p>\n<p>ACF secondo me <strong>non \u00e8 un ottimo strumento<\/strong> per nessuna soluzione web scalabile. Il plug-in fa troppo affidamento sui dati archiviati all&#8217;interno del database. Ci\u00f2 causa problemi durante la distribuzione delle modifiche a un sito, poich\u00e9 non puoi semplicemente inviare il codice e visualizzare le modifiche all&#8217;istante. Invece devi rifare il lavoro sui vari ambienti di distribuzione (staging, live, et al). Quindi avevamo bisogno di una soluzione che ci permettesse di creare meta box in modo programmatico. Immettere CMB2.<\/p>\n<p>Prima di adottare CMB2, in precedenza abbiamo utilizzato <a href=\"https:\/\/github.com\/humanmade\/Custom-Meta-Boxes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HM Custom Meta Box<\/a> di quegli adorabili umani di <a href=\"https:\/\/hmn.md\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Human Made<\/a> (che \u00e8 iniziato come un fork del precursore di WebDevStudio di CMB2,).<\/p>\n<p>Abbiamo adorato le Meta Box personalizzate HM e, con i pi\u00f9 semplici frammenti di codice, abbiamo potuto creare rapidamente Meta Box personalizzate per fare praticamente qualsiasi cosa!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3c08039.png\" alt=\"Creazione di un controllo di selezione link CMB2 personalizzato per WordPress\" \/>Esempio di markup delle Meta Box personalizzate HM (questo \u00e8 il markup per la Meta Box di Instagram nel primo screenshot)<\/p>\n<p>Allora perch\u00e9 passare a CMB2? Bene, HM Custom Meta Boxes sfortunatamente non stava ottenendo molto amore (ho parlato con il suo sviluppatore principale ed \u00e8 un uomo molto molto impegnato), mentre CMB2 stava andando avanti con nuove funzionalit\u00e0, nuovi controlli e aveva guadagnato trazione nella community di WordPress con molte persone che lo adottano e rilasciano plug-in per estenderlo (incluse molte delle nostre agenzie partner).<\/p>\n<p>Infine, come avrai capito, lavorare con CMB2 \u00e8 incredibilmente semplice come ci eravamo abituati, poich\u00e9 entrambe le piattaforme condividono un antenato comune.<\/p>\n<h2>Esercitazione<\/h2>\n<p>Prima di iniziare, ognuno ha la propria serie di ideali su come creare un plugin per WordPress, e io ne ho provati alcuni, tuttavia il tutorial su &quot; <a href=\"https:\/\/tomjn.com\/2015\/06\/24\/root-composition-in-wordpress-plugins\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Root Composition in WordPress<\/a> &quot; di Tom J Nowell, ha completamente cambiato il mio modo di lavorare. Trovo il suo approccio pulito, semplice e rende la manutenzione futura di qualsiasi plug-in un gioco da ragazzi. Se prendi il <a href=\"https:\/\/wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sorgente del plug-in Link Picker per CMB2<\/a>, puoi vedere i metodi che insegna nella pratica.<\/p>\n<h3>Costruire la forma<\/h3>\n<p>Per costruire il form che rende il Link Picker, la prima cosa che dobbiamo fare \u00e8 agganciarci <code>cmb2_render_[control_name]<\/code>all&#8217;azione. Poich\u00e9 ho chiamato questo controllo &#8216;link_picker&#8217;, possiamo completare l&#8217;hook in questo modo:<\/p>\n<pre><code>&lt;?php\nadd_action( 'cmb2_render_link_picker', array( $this, 'cmb2_render_link_picker' ), 10, 5 );\n`\n<\/code><\/pre>\n<p>Per quelli di voi che non capiscono davvero l&#8217; <code>add_action<\/code>hook, funziona come segue:<\/p>\n<ol>\n<li>Il primo argomento <code>cmb2_render_link_picker<\/code>\u00e8 il nome dell&#8217;hook a cui vogliamo agganciarci.<\/li>\n<li>Il secondo argomento <code>array( $this, 'cmb2_render_link_picker' )<\/code>\u00e8 la funzione che vogliamo chiamare quando viene eseguito questo hook. Nota che lo sto avvolgendo in un array, con <code>$this<\/code>come primo parametro, perch\u00e9 sto chiamando la funzione all&#8217;interno di una classe. Se non stai lavorando con le classi puoi semplicemente usare il nome della funzione <code>cmb2_render_link_picker<\/code>.<\/li>\n<li>Il <code>10<\/code>, \u00e8 l&#8217;ordine in cui vogliamo che la funzione si attivi (pi\u00f9 basso \u00e8 il numero, prima si attiva quando viene chiamata l&#8217;azione).<\/li>\n<li>\u00c8 <code>5<\/code>la quantit\u00e0 di parametri che verranno passati alla funzione che sto chiamando (questo diventer\u00e0 chiaro a breve).<\/li>\n<\/ol>\n<p>Successivamente creiamo la funzione che render\u00e0 il modulo:<\/p>\n<pre><code>&lt;?php\n\npublic function cmb2_render_link_picker( $field, $value, $object_id, $object_type, $field_type_object) {\n\u2026\n}\n`\n<\/code><\/pre>\n<p>Ho lasciato il &quot;DocBlock&quot; nel codice sopra che descrive cosa <code>cmb2_render_link_picker()<\/code>fa ciascuno dei parametri passati nella funzione.<\/p>\n<p>Nota che la mia funzione inizia con la <code>public<\/code>dichiarazione. Anche questo \u00e8 perch\u00e9 sto lavorando all&#8217;interno di una classe. Se non lavori con le classi puoi ometterlo.<\/p>\n<p>Il valore di questo campo viene passato alla funzione tramite il <code>$value<\/code>parametro. Nel caso di questo campo, passeremo attraverso un array, poich\u00e9 il nostro controllo ha tre elementi separati:<\/p>\n<ul>\n<li>Il testo<\/li>\n<li>L&#8217;URL<\/li>\n<li>Se il link si apre in una nuova finestra (o meno)<\/li>\n<\/ul>\n<p>Poich\u00e9 <code>$value<\/code>non \u00e8 sempre impostato (ad esempio la prima volta che viene eseguito il rendering del controllo), \u00e8 necessario inizializzarlo con alcuni valori predefiniti. Lo facciamo con il seguente bit di codice:<\/p>\n<pre><code>&lt;?php\n$value = wp_parse_args( \n    $value, \n    array(\n        'text'  =&gt; '',\n        'url'   =&gt; '',\n        'blank' =&gt; 'false',) );\n<\/code><\/pre>\n<p>Possiamo quindi metterci al lavoro per eseguire il rendering del modulo. Ecco un esempio del primo controllo di input di testo:<\/p>\n<pre><code>&lt;p&gt;\n    &lt;label for=\"&lt;?php echo $field_type_object-&gt;_id( '_text' ); ?&gt;'\"&gt;\n        &lt;?php echo esc_html( $field_type_object-&gt;_text( 'link_picker_text', 'Text') ); ?&gt;\n    &lt;\/label&gt;\n&lt;\/p&gt;\n&lt;?php \n    echo $field_type_object-&gt;input( \n            array(\n            'class' =&gt; 'cmb_text',\n            'name'  =&gt; $field_type_object-&gt;_name( '[text]' ),\n            'id'    =&gt; $field_type_object-&gt;_id( '_text' ),\n            'value' =&gt; $value['text'],) ); \n?&gt;\n<\/code><\/pre>\n<p>Uff! Sembra un po&#8217; disordinato, vero? Analizziamolo, riga per riga:<\/p>\n<ol>\n<li>Il tag del paragrafo di apertura.<\/li>\n<li>Il tag dell&#8217;etichetta di apertura per il controllo, ma con l&#8217; <code>for<\/code>attributo impostato automaticamente dal <code>$field_type_object<\/code> <code>_id<\/code>parametro. Questo generer\u00e0 automaticamente un ID per il controllo quando viene eseguito il rendering.<\/li>\n<li>Il testo della nostra etichetta, costruito utilizzando il testo dell&#8217;array delle opzioni dei controlli (o ritorna alla parola &#8216;Testo&#8217;).<\/li>\n<li>Il tag dell&#8217;etichetta di chiusura<\/li>\n<li>Il tag del paragrafo di chiusura.<\/li>\n<li>Avvia la dichiarazione PHP<\/li>\n<li>Utilizzare un controllo di input (parte di <code>$field_type_object<\/code>per creare un input del modulo (il tipo predefinito sar\u00e0 testo).<\/li>\n<li>Avvia l&#8217;array di parametri<\/li>\n<li>Imposta la classe dell&#8217;input.<\/li>\n<li>Impostare il nome dell&#8217;input, sempre utilizzando l&#8217; <code>$field_type_object<\/code>helper.<\/li>\n<li>Impostare l&#8217;ID dell&#8217;input, sullo stesso ID impostato sul tag dell&#8217;etichetta.<\/li>\n<li>Ottieni il valore da <code>$value<\/code>, poich\u00e9 si tratta di un array, vogliamo la chiave &#8216;text&#8217; per questo controllo.<\/li>\n<li>Chiudere l&#8217;array.<\/li>\n<li>Chiudere la funzione di immissione.<\/li>\n<li>Chiudi la dichiarazione PHP.<\/li>\n<\/ol>\n<p>Il markup del campo del modulo URL \u00e8 pi\u00f9 o meno lo stesso, solo per utilizzare i tipi di input HTML5 possiamo impostare un parametro aggiuntivo di &#8216;type&#8217; su &#8216;url&#8217;:<\/p>\n<pre><code>&lt;?php \n\u2026\n'type'  =&gt; 'url',\n\u2026\n<\/code><\/pre>\n<p>Infine, vogliamo implementare un menu a discesa. Il markup \u00e8 molto familiare:<\/p>\n<pre><code>&lt;?php\necho $field_type_object-&gt;select( \n    array(\n        'class'   =&gt; 'cmb_dropdown',\n        'name'    =&gt; $field_type_object-&gt;_name( '[blank]' ),\n        'id'      =&gt; $field_type_object-&gt;_id( '_blank' ),\n        'options' =&gt; $blank_options,) );\n<\/code><\/pre>\n<p>Nota che la <code>$field_type_object<\/code>funzione che stiamo usando \u00e8 <code>select<\/code>quella di generare un menu a discesa. Si noti inoltre che alla riga 6 abbiamo un nuovo attributo di <code>options<\/code>. In questo stiamo passando una serie di &quot;opzioni&quot;. Questo viene generato prima di questo controllo in questo modo:<\/p>\n<pre><code>&lt;?php \n$blank_options = '';\n$blank_options .= '&lt;option value=\"false\" '. selected( $value['blank'], 'false', false) .'&gt;Opens in same&lt;\/option&gt;';\n$blank_options .= '&lt;option value=\"true\" '. selected( $value['blank'], 'true', false) .'&gt;Opens in new&lt;\/option&gt;';\n<\/code><\/pre>\n<p>Quindi tutto ci\u00f2 che dobbiamo fare \u00e8 avvolgerlo in alcuni <code>&lt;div&gt;<\/code>e abbiamo il nostro controllo completamente renderizzato:<\/p>\n<pre><code>&lt;?php\npublic function cmb2_render_link_picker( $field, $value, $object_id, $object_type, $field_type_object) {\n    $value = wp_parse_args( $value, array(\n        'text'  =&gt; '',\n        'url'   =&gt; '',\n        'blank' =&gt; 'false',) );\n    $blank_options = '';\n    $blank_options .= '&lt;option value=\"false\" '. selected( $value['blank'], 'false', false) .'&gt;Opens in same&lt;\/option&gt;';\n    $blank_options .= '&lt;option value=\"true\" '. selected( $value['blank'], 'true', false) .'&gt;Opens in new&lt;\/option&gt;';\n    ?&gt;\n    &lt;div class=\"link-picker\"&gt;\n        &lt;div class=\"text\"&gt;\n            &lt;p&gt;\n                &lt;label for=\"&lt;?php echo $field_type_object-&gt;_id( '_text' ); ?&gt;'\"&gt;\n                    &lt;?php echo esc_html( $field_type_object-&gt;_text( 'link_picker_text', 'Text') ); ?&gt;\n                &lt;\/label&gt;\n            &lt;\/p&gt;\n            &lt;?php \n                echo $field_type_object-&gt;input( \n                    array(\n                        'class' =&gt; 'cmb_text',\n                        'name'  =&gt; $field_type_object-&gt;_name( '[text]' ),\n                        'id'    =&gt; $field_type_object-&gt;_id( '_text' ),\n                        'value' =&gt; $value['text'],\n                        'desc'  =&gt; '',) ); \n            ?&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"url\"&gt;\n            &lt;p&gt;\n                &lt;label for=\"&lt;?php echo $field_type_object-&gt;_id( '_url' ); ?&gt;'\"&gt;\n                    &lt;?php echo esc_html( $field_type_object-&gt;_text( 'link_picker_url', 'URL') ); ?&gt;\n                &lt;\/label&gt;\n            &lt;\/p&gt;\n            &lt;?php \n                echo $field_type_object-&gt;input( \n                    array(\n                        'class' =&gt; 'cmb_text_url',\n                        'name'  =&gt; $field_type_object-&gt;_name( '[url]' ),\n                        'id'    =&gt; $field_type_object-&gt;_id( '_url' ),\n                        'value' =&gt; $value['url'],\n                        'type'  =&gt; 'url',\n                        'desc'  =&gt; '',) ); \n            ?&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"blank\"&gt;\n            &lt;p&gt;\n                &lt;label for=\"&lt;?php echo $field_type_object-&gt;_id( '_blank' ); ?&gt;'\"&gt;\n                    &lt;?php echo esc_html( $field_type_object-&gt;_text( 'link_picker_blank', 'Window') ); ?&gt;\n                &lt;\/label&gt;\n            &lt;\/p&gt;\n            &lt;?php \n                echo $field_type_object-&gt;select( \n                    array(\n                        'class'   =&gt; 'cmb_checkbox',\n                        'name'    =&gt; $field_type_object-&gt;_name( '[blank]' ),\n                        'id'      =&gt; $field_type_object-&gt;_id( '_blank' ),\n                        'options' =&gt; $blank_options,\n                        'desc'    =&gt; '',) ); \n            ?&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"choose\"&gt;\n            &lt;p&gt;\n                &lt;label&gt;Choose&lt;\/label&gt;\n            &lt;\/p&gt;\n            &lt;button class=\"dashicons dashicons-admin-links js-insert-link button button-primary\" title=\"&lt;?php esc_html_e( 'Insert Link', 'cmb' ); ?&gt;\"&gt;\n                 &lt;span class=\"screen-reader-text\"&gt;&lt;?php esc_html_e( 'Choose Link', 'cmb' ); ?&gt;&lt;\/span&gt;\n             &lt;\/button&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n    &lt;p class=\"clear\"&gt;\n        &lt;?php echo $field_type_object-&gt;_desc();?&gt;\n    &lt;\/p&gt;\n&lt;?php\n}\n<\/code><\/pre>\n<p>E questo \u00e8 tutto! Abbiamo fatto il nostro controllo! CMB2 gestisce automaticamente tutti i dati che vogliamo salvare, quindi niente da fare l\u00ec.<\/p>\n<h3>Stili<\/h3>\n<p>Lo screenshot del controllo che stiamo creando (nella parte superiore di questo post) ha alcuni stili personalizzati applicati in modo che venga visualizzato in linea. Oggi non parler\u00f2 di come modellare il modulo, ma se sei curioso puoi <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scaricare il plugin e visualizzare il sorgente<\/a>.<\/p>\n<h3>Rendere il controllo ripetibile<\/h3>\n<p>Per quelli di voi che vogliono diventare un po&#8217; pi\u00f9 avanzati, \u00e8 possibile far funzionare il controllo con le regioni ripetibili di CMB2. Per fare ci\u00f2 \u00e8 necessario eseguire un po&#8217; di mappatura dell&#8217;array. Per farlo usa il codice qui sotto:<\/p>\n<pre><code>&lt;?php\n\npublic function cmb2_sanitize_link_picker( $check, $meta_value, $object_id, $field_args, $sanitize_object) {\n\n    if (! is_array( $meta_value) ||! $field_args['repeatable']) {\n        return $check;\n    }\n    foreach ($meta_value as $key =&gt; $val) {\n        $meta_value[ $key ] =  null;\n        if(! empty( $val['url'])) {\n            $meta_value[ $key ] = array_map( 'sanitize_text_field', $val );\n        }\n    }\n    return $meta_value;\n}\npublic function cmb2_types_esc_link_picker( $check, $meta_value, $field_args, $field_object) {\n\n    if (! is_array( $meta_value) ||! $field_args['repeatable']) {\n        return $check;\n    }\n    foreach ($meta_value as $key =&gt; $val) {\n        $meta_value[ $key ] =  null;\n        if(! empty( $val['url'])) {\n            $meta_value[ $key ] = array_map( 'esc_attr', $val );\n        }\n    }\n    return $meta_value;\n}\n<\/code><\/pre>\n<h2>Scelta di un collegamento<\/h2>\n<p>Ovviamente lo scopo principale del selettore di link \u00e8 integrarsi nella funzionalit\u00e0 di scelta dei link di WordPress, facendo apparire la schermata di dialogo &quot;Inserisci\/modifica link&quot; quando si fa clic sul pulsante &quot;Scegli&quot;.<\/p>\n<p>Per fare in modo che ci\u00f2 accada, ci affidiamo fortemente a JavaScript. In particolare sto usando <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> per far accadere le cose.<\/p>\n<p>Prima di mostrarti il \u200b\u200bJavaScript che avvia la finestra di dialogo, dobbiamo prima accodare il JavaScript interno di WordPress, che precaricher\u00e0 le modali e le librerie da cui dipende il nostro codice. Sembra qualcosa del genere:<\/p>\n<pre><code>&lt;?php\nglobal $post_id;\n\nif (isset( $post_id)) {\n    wp_enqueue_media( array( 'post' =&gt; $post_id) );\n}\n\n$plugin_js_url  = plugins_url( 'js\/plugin.js', ROOT );\nwp_enqueue_script( 'wholesomecode', $plugin_js_url, array( 'jquery', 'jquery-ui-core', 'jquery-ui-draggable', 'jquery-ui-droppable', 'thickbox', 'wpdialogs' ), '1.0.0', true );\n<\/code><\/pre>\n<p>Come puoi vedere, molte delle librerie interne di WordPress si basano su jQuery per caricare il popup, quindi ha senso che il nostro trigger popup faccia lo stesso. Questo viene fatto tramite il <code>\/js\/plugin.js<\/code>che viene caricato sulla riga 10 dell&#8217;esempio sopra.<\/p>\n<pre><code>jQuery(document).ready(function($) {\n\n    var url   = $('body');\n    var text = $('body');\n    var blank = $('body');\n\n    $('body').on('click', '.js-insert-link', function(event) {\n\n        event.preventDefault? event.preventDefault(): event.returnValue = false;\n        event.stopPropagation();\n\n        url            = $(this).closest('.link-picker').find('input.cmb_text_url ');\n        text           = $(this).closest('.link-picker').find('input.cmb_text ');\n        blank          = $(this).closest('.link-picker').find('input.cmb_checkbox ');\n\n        wpActiveEditor = true;\n        wpLink.open();\n        wpLink.textarea = url;\n\n        return false;\n    });\n\n    $('body').on('click', '#wp-link-cancel, #wp-link-backdrop, #wp-link-close', function(event) {\n\n        wpLink.textarea = url;\n        wpLink.close();\n        event.preventDefault? event.preventDefault(): event.returnValue = false;\n        event.stopPropagation();\n        return false;\n    });\n\n    $('body').on('click', '#wp-link-submit', function(event) {\n        console.log(text)\n        var linkAtts = wpLink.getAttrs();\n\n        linkAtts.text = $('#wp-link-text').val();\n\n        url.val(linkAtts.href);\n\n        if( linkAtts.text != '') {\n            text.val(linkAtts.text);\n        }\n\n        if (linkAtts.target == '_blank') {\n            blank.prop('checked', true);\n        } else {\n            blank.prop('checked', false);\n        }\n\n        wpLink.textarea = url;\n        wpLink.close();\n        event.preventDefault? event.preventDefault(): event.returnValue = false;\n        event.stopPropagation();\n        return false;\n    });\n});\n<\/code><\/pre>\n<p>Usando le classi che abbiamo racchiuso attorno ai nostri controlli del modulo, JavaScript punta ai controlli e inserisce il risultato selezionato dal pop-up del selettore di link nei campi di controllo pertinenti.<\/p>\n<h2>Usando il controllo<\/h2>\n<p>Quindi, dopo aver esaminato il tutorial sopra, e possibilmente dopo aver <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esaminato il codice sorgente<\/a> del plug- <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">in Link Picker per CMB2<\/a>, o semplicemente aver scaricato la mia versione, ora potresti chiederti come utilizzare la cosa con CMB2. Beh, non potrebbe essere pi\u00f9 facile:<\/p>\n<pre><code>&lt;?php\nfunction wholesomecode_create_meta_boxes() {\n  $prefix = '_profile_';\n\n    $cmb = new_cmb2_box(\n        array(\n            'id'            =&gt; 'cta',\n            'title'         =&gt; __( 'Call to Action', 'cmb2' ),\n            'object_types'  =&gt; array( 'profile' ),\n            'context'       =&gt; 'normal',\n            'priority'      =&gt; 'low',\n            'show_names'    =&gt; true,) );\n\n    $field1 = $cmb-&gt;add_field( \n        array(\n            'name' =&gt; __( 'Link Picker', 'cmb2' ),\n            'id'   =&gt; $prefix. 'cta_link',\n            'type' =&gt; 'link_picker',) );\n}\nadd_action( 'cmb2_admin_init', 'wholesomecode_create_meta_boxes' );\n<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo tutorial vedr\u00f2 come creare un controllo personalizzato per estendere le funzionalit\u00e0 di CMB2 (Custom Meta Boxes 2) di WebDevStudios. Sviluppo siti Web (e app&#8230;<\/p>\n","protected":false},"author":1,"featured_media":224127,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,844,865],"tags":[1168],"class_list":["post-228912","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228912","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=228912"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/228912\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/224127"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=228912"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=228912"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=228912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}