{"id":228665,"date":"2022-10-13T20:18:00","date_gmt":"2022-10-13T17:18:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228665"},"modified":"2022-11-09T03:40:12","modified_gmt":"2022-11-09T00:40:12","slug":"mukautetun-cmb2-linkkivalitsinohjaimen-luominen-wordpressille","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/mukautetun-cmb2-linkkivalitsinohjaimen-luominen-wordpressille\/","title":{"rendered":"Mukautetun CMB2-linkkivalitsinohjaimen luominen WordPressille"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 opetusohjelmassa tarkastelen, kuinka voit luoda mukautetun ohjausobjektin laajentaaksesi <a href=\"https:\/\/wordpress.org\/plugins\/cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WebDevStudiosin CMB2<\/a> :n (Custom Meta Boxes 2) <a href=\"https:\/\/webdevstudios.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toimintoja<\/a>.<\/p>\n<p>Kehit\u00e4n verkkosivustoja (ja verkkosovelluksia) <a href=\"https:\/\/wordpress.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress<\/a> CMS:ll\u00e4 (Content Management System), ja kun uusi projekti saapuu, voit taata, ett\u00e4 minun on kehitett\u00e4v\u00e4 &quot;mukautettuja metalaatikoita&quot;, jotta k\u00e4ytt\u00e4j\u00e4 voi hallita tarkasti. sivuston sis\u00e4ll\u00f6st\u00e4 ja asettelusta.<\/p>\n<p>Kerron yksityiskohtaisesti, kuinka rakensin CMB2-ohjauslinkkivalitsimen <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CMB2:lle<\/a> (saatavilla kaikista hyvist\u00e4 WordPress-laajennusten arkistoista). Kuvakaappaus josta on n\u00e4ht\u00e4viss\u00e4 alla.<\/p>\n<p>&quot;Link Picker&quot; CMB2-ohjain toiminnassa<\/p>\n<p>Linkinvalitsin k\u00e4ynnist\u00e4\u00e4 sis\u00e4\u00e4nrakennetun WordPressin &quot;Lis\u00e4\u00e4\/muokkaa linkki\u00e4&quot; -valintaikkunan, kun napsautat Valitse-painiketta. T\u00e4m\u00e4 n\u00e4kyy alla olevassa kuvakaappauksessa:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Mukautetun CMB2-linkkivalitsinohjaimen luominen WordPressille\" \/>Painamalla painiketta voit valita linkist\u00e4 (tai lis\u00e4t\u00e4 omasi)<\/p>\n<p>Olen varma, ett\u00e4 olet samaa mielt\u00e4 siit\u00e4, ett\u00e4 t\u00e4llainen hallinta on uskomattoman k\u00e4tev\u00e4\u00e4, jos haluat antaa sivustosi toimittajille mahdollisuuden lis\u00e4t\u00e4 linkin ja my\u00f6s etsi\u00e4 WordPressist\u00e4 sen sis\u00e4isi\u00e4 linkkej\u00e4 sen sijaan, ett\u00e4 heid\u00e4n pit\u00e4isi leikata ja liitt\u00e4\u00e4 linkit linkkiin. ala.<\/p>\n<h2>Johdanto \/ Historia<\/h2>\n<p>Niille, jotka eiv\u00e4t tied\u00e4, metaruutu on WordPress-viestin muokkausn\u00e4yt\u00f6ss\u00e4, ja se sis\u00e4lt\u00e4\u00e4 todenn\u00e4k\u00f6isesti erilaisia \u200b\u200blomakeohjausobjekteja (tekstilaatikoita, avattavia luetteloita, valintaruutuja jne.). N\u00e4iden s\u00e4\u00e4timien avulla verkkosivustosi k\u00e4ytt\u00e4j\u00e4t voivat helposti muuttaa mukautettua teksti\u00e4 tai toimintoja sivustolla.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Mukautetun CMB2-linkkivalitsinohjaimen luominen WordPressille\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3a6c2f7.png\" alt=\"Mukautetun CMB2-linkkivalitsinohjaimen luominen WordPressille\" \/>Esimerkki metalaatikosta, jossa on erilaisia \u200b\u200blomakeohjausobjekteja<\/p>\n<p>WordPressin avulla voit luoda metalaatikoita funktioiden (kuten <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)<\/code>) avulla, mutta metalaatikoiden luominen t\u00e4ll\u00e4 tavalla voi olla pitk\u00e4 prosessi ja sis\u00e4lt\u00e4\u00e4 paljon koodin toistoa (varsinkin jos haluat k\u00e4ytt\u00e4\u00e4 samoja lomakeohjausobjekteja useissa projekteissa).<\/p>\n<h2>Miksi CMB2?<\/h2>\n<p>Jotkut teist\u00e4 ovat ehk\u00e4 kuulleet <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fieldsist\u00e4<\/a> (ACF), joka tarjoaa graafisen k\u00e4ytt\u00f6liittym\u00e4n (Graphical User Interface), jonka avulla voit luoda metalaatikoita suoraan WordPressill\u00e4.<\/p>\n<p>ACF ei mielest\u00e4ni <strong>ole loistava ty\u00f6kalu<\/strong> millek\u00e4\u00e4n skaalautuvalle verkkoratkaisulle. Laajennus on liian riippuvainen tietokantaan tallennetuista tiedoista. T\u00e4m\u00e4 aiheuttaa kipua, kun muutoksia otetaan k\u00e4ytt\u00f6\u00f6n sivustossa, koska et voi vain nostaa koodiasi ja n\u00e4hd\u00e4 muutokset v\u00e4litt\u00f6m\u00e4sti. Sen sijaan sinun on suoritettava ty\u00f6 uudelleen eri k\u00e4ytt\u00f6\u00f6nottoymp\u00e4rist\u00f6iss\u00e4 (vaiheistus, live jne.). Joten tarvitsimme ratkaisun, jonka avulla voimme luoda metalaatikoita ohjelmallisesti. Sy\u00f6t\u00e4 CMB2.<\/p>\n<p>Ennen kuin otimme k\u00e4ytt\u00f6\u00f6n CMB2:n, k\u00e4ytimme aiemmin <a href=\"https:\/\/github.com\/humanmade\/Custom-Meta-Boxes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HM Custom Meta Boxeja<\/a> niilt\u00e4 ihanilta ihmisilt\u00e4 <a href=\"https:\/\/hmn.md\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Human<\/a> Madessa (joka alkoi WebDevStudion edelt\u00e4j\u00e4n\u00e4 CMB2:lle,).<\/p>\n<p>Rakastimme HM Custom Meta Boxeja, ja yksinkertaisimpien koodinp\u00e4tkien avulla pystyimme nopeasti luomaan mukautettuja metalaatikoita melkein mihin tahansa!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3c08039.png\" alt=\"Mukautetun CMB2-linkkivalitsinohjaimen luominen WordPressille\" \/>HM Custom Meta Box -merkint\u00e4esimerkki (t\u00e4m\u00e4 on Instagram-metalaatikon merkint\u00e4 ensimm\u00e4isess\u00e4 kuvakaappauksessa)<\/p>\n<p>Miksi sitten siirryt\u00e4\u00e4n CMB2:een? No, HM Custom Meta Boxes ei valitettavasti saanut paljon rakkautta (puhuin sen p\u00e4\u00e4kehitt\u00e4j\u00e4lle ja h\u00e4n on eritt\u00e4in kiireinen mies), kun taas CMB2 eteni uusilla ominaisuuksilla, uusilla ohjaimilla ja se oli saanut vetoa. WordPress-yhteis\u00f6ss\u00e4, jossa monet ihmiset ottavat sen k\u00e4ytt\u00f6\u00f6n ja julkaisevat laajennuksia sen laajentamiseksi (mukaan lukien useat kumppanitoimistomme).<\/p>\n<p>Lopuksi, kuten olet ehk\u00e4 havainnut, ty\u00f6skentely CMB2:n kanssa on yht\u00e4 uskomattoman yksinkertaista kuin olimme tottuneet, sill\u00e4 molemmilla alustoilla on yhteinen esi-is\u00e4.<\/p>\n<h2>Opastus<\/h2>\n<p>Ennen kuin aloitamme, jokaisella on omat ihanteensa WordPress-laajennuksen luomiseen, ja olen kokeillut muutamia, mutta Tom J Nowellin <a href=\"https:\/\/tomjn.com\/2015\/06\/24\/root-composition-in-wordpress-plugins\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPressin<\/a> juurikokoonpanon opetusohjelma muutti t\u00e4ysin tapani ty\u00f6skennell\u00e4. Mielest\u00e4ni sen l\u00e4hestymistapa on puhdas, yksinkertainen, ja se tekee mink\u00e4 tahansa laajennuksen tulevasta yll\u00e4pidosta helppoa. Jos nappaat <a href=\"https:\/\/wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Link Picker for CMB2 -laajennuksen l\u00e4hteen<\/a>, n\u00e4et h\u00e4nen opettamansa menetelm\u00e4t k\u00e4yt\u00e4nn\u00f6ss\u00e4.<\/p>\n<h3>Lomakkeen rakentaminen<\/h3>\n<p>Luodaksemme linkkivalitsimen hahmontavan lomakkeen, meid\u00e4n on ensin kytkeydytt\u00e4v\u00e4 <code>cmb2_render_[control_name]<\/code>toimintaan. Kuten olen kutsunut t\u00e4t\u00e4 ohjausobjektia &quot;link_picker&quot;, voimme t\u00e4ydent\u00e4\u00e4 koukun seuraavasti:<\/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>Niille teist\u00e4, jotka eiv\u00e4t oikein ymm\u00e4rr\u00e4 <code>add_action<\/code>koukkua, se toimii seuraavasti:<\/p>\n<ol>\n<li>Ensimm\u00e4inen argumentti <code>cmb2_render_link_picker<\/code>on sen koukun nimi, johon haluamme liitty\u00e4.<\/li>\n<li>Toinen argumentti <code>array( $this, 'cmb2_render_link_picker' )<\/code>on funktio, jota haluamme kutsua, kun t\u00e4m\u00e4 koukku suoritetaan. Huomaa, ett\u00e4 k\u00e4\u00e4nn\u00e4n t\u00e4m\u00e4n taulukkoon <code>$this<\/code>ensimm\u00e4isen\u00e4 parametrina, koska kutsun funktiota luokan sis\u00e4ll\u00e4. Jos et ty\u00f6skentele luokkien kanssa, voit k\u00e4ytt\u00e4\u00e4 vain funktion nime\u00e4 <code>cmb2_render_link_picker<\/code>.<br \/>\n3., <code>10<\/code>on j\u00e4rjestys, jossa haluamme funktion k\u00e4ynnistyv\u00e4n (mit\u00e4 pienempi numero, sit\u00e4 nopeammin se k\u00e4ynnistyy, kun toimintoa kutsutaan).<\/li>\n<li>T\u00e4m\u00e4 <code>5<\/code>on parametrien m\u00e4\u00e4r\u00e4, joka v\u00e4litet\u00e4\u00e4n kutsumaani funktioon (t\u00e4m\u00e4 selvi\u00e4\u00e4 pian).<\/li>\n<\/ol>\n<p>Seuraavaksi luomme funktion, joka hahmontaa lomakkeen:<\/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>Olen j\u00e4tt\u00e4nyt &quot;DocBlockin&quot; yll\u00e4 olevaan koodiin, joka kuvaa, mit\u00e4 kukin funktioon siirretty parametri <code>cmb2_render_link_picker()<\/code>tekee.<\/p>\n<p>Huomaa, ett\u00e4 funktioni alkaa <code>public<\/code>ilmoituksella. T\u00e4m\u00e4 taas johtuu siit\u00e4, ett\u00e4 ty\u00f6skentelen luokassa. Jos et ty\u00f6skentele luokkien kanssa, voit j\u00e4tt\u00e4\u00e4 t\u00e4m\u00e4n pois.<\/p>\n<p>T\u00e4m\u00e4n kent\u00e4n arvo v\u00e4litet\u00e4\u00e4n funktioon <code>$value<\/code>parametrin kautta. T\u00e4m\u00e4n kent\u00e4n tapauksessa kuljemme taulukon l\u00e4pi, koska ohjausobjektissamme on kolme erillist\u00e4 elementti\u00e4:<\/p>\n<ul>\n<li>Teksti<\/li>\n<li>URL-osoite<\/li>\n<li>Jos linkki avautuu uuteen ikkunaan (tai ei)<\/li>\n<\/ul>\n<p>Koska <code>$value<\/code>arvoa ei aina ole asetettu (esimerkiksi ohjausobjektin ensimm\u00e4ist\u00e4 kertaa render\u00f6idess\u00e4\u00e4n), meid\u00e4n on alustettava se joillakin oletusarvoilla. Teemme t\u00e4m\u00e4n seuraavalla koodibitill\u00e4:<\/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>Sitten voimme ryhty\u00e4 ty\u00f6h\u00f6n lomakkeen laatimiseen. T\u00e4ss\u00e4 on esimerkki ensimm\u00e4isest\u00e4 tekstinsy\u00f6tt\u00f6s\u00e4\u00e4timest\u00e4:<\/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>Huh huh! N\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n sekavalta eik\u00f6? Jaotetaan se rivi rivilt\u00e4:<\/p>\n<ol>\n<li>Aloituskappaleen tunniste.<\/li>\n<li>Ohjaimen avaustunniste, mutta parametrin <code>for<\/code>automaattisesti asettama attribuutti. <code>$field_type_object<\/code> <code>_id<\/code>T\u00e4m\u00e4 luo automaattisesti tunnuksen ohjausobjektille, kun se hahmonnetaan.<\/li>\n<li>Tarramme teksti, joka on rakennettu k\u00e4ytt\u00e4m\u00e4ll\u00e4 ohjausvaihtoehtojen taulukon teksti\u00e4 (tai palaa sanaan &quot;Teksti&quot;).<\/li>\n<li>P\u00e4\u00e4tt\u00e4v\u00e4 etiketti<\/li>\n<li>P\u00e4\u00e4tt\u00e4v\u00e4 kappaletunniste.<\/li>\n<li>Aloita PHP-ilmoitus<\/li>\n<li>K\u00e4yt\u00e4 sy\u00f6tt\u00f6s\u00e4\u00e4dint\u00e4 (osa lomakesy\u00f6tteen <code>$field_type_object<\/code>luomiseen (oletustyyppi on teksti).<\/li>\n<li>Aloita parametrien joukko<\/li>\n<li>Aseta sy\u00f6tteen luokka.<\/li>\n<li>Aseta sy\u00f6tteen nimi uudelleen <code>$field_type_object<\/code>apuohjelmalla.<\/li>\n<li>Aseta sy\u00f6tteen tunnus samaksi tunnukseksi, joka m\u00e4\u00e4ritettiin tarratunnisteeseen.<\/li>\n<li>Hanki arvo kohdasta <code>$value<\/code>, koska t\u00e4m\u00e4 on taulukko, haluamme tekstiavaimen t\u00e4lle ohjausobjektille.<\/li>\n<li>Sulje joukko.<\/li>\n<li>Sulje sy\u00f6tt\u00f6toiminto.<\/li>\n<li>Sulje PHP-ilmoitus.<\/li>\n<\/ol>\n<p>URL-lomakkeen kent\u00e4n merkint\u00e4 on pitk\u00e4lti sama, vain HTML5-sy\u00f6tt\u00f6tyyppej\u00e4 varten voimme asettaa lis\u00e4parametrin &#8217;type&#8217; arvoon &#8217;url&#8217;:<\/p>\n<pre><code>&lt;?php \n\u2026\n'type'  =&gt; 'url',\n\u2026\n<\/code><\/pre>\n<p>Lopuksi haluamme ottaa k\u00e4ytt\u00f6\u00f6n pudotusvalikon. Merkint\u00e4 on hyvin tuttu:<\/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>Huomaa, ett\u00e4 k\u00e4ytt\u00e4m\u00e4mme <code>$field_type_object<\/code>toiminto <code>select<\/code>on avattavan valikon luominen. Huomaa my\u00f6s, ett\u00e4 rivill\u00e4 6 meill\u00e4 on uusi attribuutti <code>options<\/code>. T\u00e4h\u00e4n v\u00e4lit\u00e4mme joukon &quot;vaihtoehtoja&quot;. T\u00e4m\u00e4 luodaan ennen t\u00e4t\u00e4 ohjausta seuraavasti:<\/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>Sitten meid\u00e4n tarvitsee vain k\u00e4\u00e4ri\u00e4 se joihinkin <code>&lt;div&gt;<\/code>ja meill\u00e4 on t\u00e4ysin render\u00f6ity hallinta:<\/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>Ja siin\u00e4 se! Olemme saaneet kontrollimme! CMB2 k\u00e4sittelee automaattisesti kaikki tiedot, jotka haluamme tallentaa, joten siell\u00e4 ei ole mit\u00e4\u00e4n tekemist\u00e4.<\/p>\n<h3>Tyylit<\/h3>\n<p>Luomassamme ohjausobjektin kuvakaappauksessa (l\u00e4hell\u00e4 t\u00e4m\u00e4n viestin yl\u00e4osaa) on k\u00e4ytetty muutamia mukautettuja tyylej\u00e4, jotta se hahmonnetaan tekstiss\u00e4. En mene t\u00e4n\u00e4\u00e4n lomakkeen tyyliin, mutta jos olet utelias, voit <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ladata laajennuksen ja tarkastella l\u00e4hdett\u00e4<\/a>.<\/p>\n<h3>Ohjauksen tekeminen toistettavaksi<\/h3>\n<p>Niille teist\u00e4, jotka haluavat edisty\u00e4 hieman, voit saada ohjauksen toimimaan CMB2:n toistettavien alueiden kanssa. T\u00e4t\u00e4 varten sinun on teht\u00e4v\u00e4 hieman taulukkokartoitusta. Voit tehd\u00e4 sen k\u00e4ytt\u00e4m\u00e4ll\u00e4 alla olevaa koodia:<\/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>Linkin valitseminen<\/h2>\n<p>Tietysti linkkivalitsimen koko tarkoitus on integroida WordPressin omaan linkinvalintatoimintoon, jolloin &#8217;Lis\u00e4\u00e4\/muokkaa linkki\u00e4&#8217; -valintaikkuna tulee esiin, kun &#8217;Valitse&#8217;-painiketta napsautetaan.<\/p>\n<p>Jotta t\u00e4m\u00e4 tapahtuisi, luotamme suuresti JavaScriptiin. K\u00e4yt\u00e4n erityisesti <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery\u00e4<\/a> asioiden toteuttamiseen.<\/p>\n<p>Ennen kuin n\u00e4yt\u00e4n sinulle valintaikkunan k\u00e4ynnist\u00e4v\u00e4n JavaScriptin, meid\u00e4n on ensin asetettava jonoon WordPressin oma sis\u00e4inen JavaScript, joka esilataa modaalit ja kirjastot, joista koodimme riippuu. Se n\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n t\u00e4lt\u00e4:<\/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>Kuten n\u00e4et, monet sis\u00e4iset WordPress-kirjastot luottavat jQueryyn ponnahdusikkunan lataamiseen, joten ponnahdusikkunan laukaisumme on j\u00e4rkev\u00e4\u00e4 tehd\u00e4 samoin. T\u00e4m\u00e4 tehd\u00e4\u00e4n <code>\/js\/plugin.js<\/code>yll\u00e4 olevan esimerkin riville 10 ladatun komennolla.<\/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>K\u00e4ytt\u00e4m\u00e4ll\u00e4 luokkia, jotka kietoimme lomakeohjausobjektien ymp\u00e4rille, JavaScript kohdistaa ohjaimiin ja ty\u00f6nt\u00e4\u00e4 valitun tuloksen linkkivalitsimen ponnahdusikkunasta asianmukaisiin ohjauskenttiin.<\/p>\n<h2>Ohjaimen k\u00e4ytt\u00e4minen<\/h2>\n<p>Joten, kun olet katsonut yll\u00e4 olevan opetusohjelman ja mahdollisesti <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tarkistanut<\/a> <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Link Picker for CMB2<\/a> -laajennuksen l\u00e4hdekoodin tai vain ladannut versioni, saatat nyt mietti\u00e4, kuinka k\u00e4ytt\u00e4\u00e4 asiaa CMB2:n kanssa. No, se ei voisi olla helpompaa:<\/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\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 opetusohjelmassa tarkastelen, kuinka voit luoda mukautetun ohjausobjektin laajentaaksesi WebDevStudiosin CMB2:n (Custom Meta Boxes 2) toimintoja. Kehit\u00e4n verkkosivustoja (ja verkkosovelluksia&#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":[719,895,843,864],"tags":[1166],"class_list":["post-228665","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/228665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=228665"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/228665\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224127"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=228665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=228665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=228665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}