{"id":228556,"date":"2022-10-13T20:23:00","date_gmt":"2022-10-13T17:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228556"},"modified":"2022-11-09T02:59:48","modified_gmt":"2022-11-08T23:59:48","slug":"creation-dun-controle-de-selecteur-de-liens-cmb2-personnalise-pour-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creation-dun-controle-de-selecteur-de-liens-cmb2-personnalise-pour-wordpress\/","title":{"rendered":"Cr\u00e9ation d&rsquo;un contr\u00f4le de s\u00e9lecteur de liens CMB2 personnalis\u00e9 pour WordPress"},"content":{"rendered":"\n<p>Dans ce tutoriel je vais voir comment cr\u00e9er un champ personnalis\u00e9 pour \u00e9tendre les fonctionnalit\u00e9s de <a href=\"https:\/\/wordpress.org\/plugins\/cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CMB2<\/a> (Custom Meta Boxes 2) par <a href=\"https:\/\/webdevstudios.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WebDevStudios<\/a>.<\/p>\n<p>Je d\u00e9veloppe des sites Web (et des applications Web) avec le CMS <a href=\"https:\/\/wordpress.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress<\/a> (Syst\u00e8me de gestion de contenu), et lorsqu&rsquo;un nouveau projet d\u00e9barque, vous pouvez garantir qu&rsquo;il y aura une obligation pour moi de d\u00e9velopper des &lsquo;Meta Boxes personnalis\u00e9es&rsquo; pour permettre \u00e0 l&rsquo;utilisateur d&rsquo;avoir un contr\u00f4le pr\u00e9cis sur le contenu et la mise en page des sites.<\/p>\n<p>Je d\u00e9taillerai comment j&rsquo;ai construit le s\u00e9lecteur de liens de contr\u00f4le <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">CMB2 pour CMB2<\/a> (disponible dans tous les bons r\u00e9f\u00e9rentiels de plugins WordPress). Une capture d&rsquo;\u00e9cran peut \u00eatre vue ci-dessous.<\/p>\n<p>La commande &lsquo;Link Picker&rsquo; CMB2 en action<\/p>\n<p>Le s\u00e9lecteur de liens d\u00e9clenche la bo\u00eete de dialogue \u00ab\u00a0Ins\u00e9rer\/modifier le lien\u00a0\u00bb int\u00e9gr\u00e9e \u00e0 WordPress lorsque vous cliquez sur le bouton \u00ab\u00a0Choisir\u00a0\u00bb. Cela peut \u00eatre vu dans la capture d&rsquo;\u00e9cran ci-dessous:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Cr\u00e9ation d&#039;un contr\u00f4le de s\u00e9lecteur de liens CMB2 personnalis\u00e9 pour WordPress\" \/>Appuyer sur le bouton vous permet de choisir parmi un lien (ou d&rsquo;ajouter le v\u00f4tre)<\/p>\n<p>Je suis s\u00fbr que vous conviendrez qu&rsquo;avoir un contr\u00f4le comme celui-ci est incroyablement pratique si vous voulez donner aux \u00e9diteurs de votre site la possibilit\u00e9 d&rsquo;ajouter un lien et \u00e9galement de rechercher WordPress pour ses liens internes, plut\u00f4t que de devoir couper et coller les liens dans un lien champ.<\/p>\n<h2>Pr\u00e9sentation \/ Historique<\/h2>\n<p>Pour ceux qui ne sont pas au courant, une m\u00e9ta-bo\u00eete vit sur l&rsquo;\u00e9cran de l&rsquo;\u00e9diteur d&rsquo;un article WordPress et contiendra probablement divers contr\u00f4les de formulaire (zones de texte, listes d\u00e9roulantes, cases \u00e0 cocher, etc.). Ces commandes permettent aux utilisateurs de votre site Web de modifier facilement un texte personnalis\u00e9 ou une fonctionnalit\u00e9 sur le site.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b39277e2.png\" alt=\"Cr\u00e9ation d&#039;un contr\u00f4le de s\u00e9lecteur de liens CMB2 personnalis\u00e9 pour WordPress\" \/><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3a6c2f7.png\" alt=\"Cr\u00e9ation d&#039;un contr\u00f4le de s\u00e9lecteur de liens CMB2 personnalis\u00e9 pour WordPress\" \/>Un exemple de bo\u00eete m\u00e9ta avec divers contr\u00f4les de formulaire<\/p>\n<p>WordPress vous permet de cr\u00e9er des m\u00e9ta-bo\u00eetes \u00e0 l&rsquo;aide de fonctions (telles que <code>[add_meta_box](https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/)<\/code>), mais la cr\u00e9ation de m\u00e9ta-bo\u00eetes de cette mani\u00e8re peut \u00eatre un processus long, avec beaucoup de r\u00e9p\u00e9titions de code (surtout si vous souhaitez utiliser les m\u00eames contr\u00f4les de formulaire dans plusieurs projets).<\/p>\n<h2>Pourquoi CMB2 ?<\/h2>\n<p>Certains d&rsquo;entre vous ont peut-\u00eatre entendu parler de <a href=\"https:\/\/www.advancedcustomfields.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Advanced Custom Fields<\/a> (ACF) qui fournit une GUI (Graphical User Interface) qui vous permet de cr\u00e9er des m\u00e9ta-bo\u00eetes directement avec WordPress.<\/p>\n<p>ACF, \u00e0 mon avis, n&rsquo;est <strong>pas un excellent outil<\/strong> pour une solution Web \u00e9volutive. Le plugin d\u00e9pend trop des donn\u00e9es stock\u00e9es dans la base de donn\u00e9es. Cela provoque des difficult\u00e9s lors du d\u00e9ploiement de modifications sur un site, car vous ne pouvez pas simplement pousser votre code et voir les modifications instantan\u00e9ment. Au lieu de cela, vous devez refaire le travail sur les diff\u00e9rents environnements de d\u00e9ploiement (staging, live, et al). Nous avions donc besoin d&rsquo;une solution qui nous permette de cr\u00e9er des m\u00e9ta-bo\u00eetes par programmation. Entrez CMB2.<\/p>\n<p>Avant d&rsquo;adopter CMB2, nous utilisions auparavant les <a href=\"https:\/\/github.com\/humanmade\/Custom-Meta-Boxes\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">HM Custom Meta Boxes<\/a> de ces charmants humains de <a href=\"https:\/\/hmn.md\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Human Made<\/a> (qui a commenc\u00e9 comme un fork du pr\u00e9curseur de WebDevStudio pour CMB2, &lsquo;Custom Meta Boxes&rsquo;).<\/p>\n<p>Nous avons ador\u00e9 les bo\u00eetes m\u00e9ta personnalis\u00e9es HM, et avec les extraits de code les plus simples, nous pouvions rapidement cr\u00e9er des bo\u00eetes m\u00e9ta personnalis\u00e9es pour faire \u00e0 peu pr\u00e8s n&rsquo;importe quoi\u00a0!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-169316-61e80b3c08039.png\" alt=\"Cr\u00e9ation d&#039;un contr\u00f4le de s\u00e9lecteur de liens CMB2 personnalis\u00e9 pour WordPress\" \/>HM Custom Meta Boxes Markup Example (il s&rsquo;agit du balisage de la Meta Box Instagram dans la premi\u00e8re capture d&rsquo;\u00e9cran)<\/p>\n<p>Alors pourquoi le passage au CMB2? Eh bien, HM Custom Meta Boxes ne recevait malheureusement pas beaucoup d&rsquo;amour (j&rsquo;ai parl\u00e9 \u00e0 son d\u00e9veloppeur principal et c&rsquo;est un homme tr\u00e8s tr\u00e8s occup\u00e9), alors que CMB2 avan\u00e7ait avec de nouvelles fonctionnalit\u00e9s, de nouveaux contr\u00f4les, et il avait gagn\u00e9 du terrain dans la communaut\u00e9 WordPress avec de nombreuses personnes l&rsquo;adoptant et publiant des plugins pour l&rsquo;\u00e9tendre (dont plusieurs de nos agences partenaires).<\/p>\n<p>Enfin, comme vous l&rsquo;avez peut-\u00eatre compris, travailler avec CMB2 est aussi incroyablement simple que nous nous y \u00e9tions habitu\u00e9s, car les deux plates-formes partagent un anc\u00eatre commun.<\/p>\n<h2>Didacticiel<\/h2>\n<p>Avant de commencer, chacun a son propre ensemble d&rsquo;id\u00e9aux sur la fa\u00e7on de cr\u00e9er un plugin WordPress, et j&rsquo;en ai essay\u00e9 pas mal, cependant le tutoriel sur &lsquo; <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> &lsquo; par Tom J Nowell, a compl\u00e8tement chang\u00e9 ma fa\u00e7on de travailler. Je trouve son approche propre, simple et facilite la maintenance future de tout plugin. Si vous saisissez la <a href=\"https:\/\/wordpress.org\/plugins\/link-picker-for-cmb2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">source du plugin Link Picker for CMB2<\/a>, vous pouvez voir les m\u00e9thodes qu&rsquo;il enseigne dans la pratique.<\/p>\n<h3>Construire le formulaire<\/h3>\n<p>Pour cr\u00e9er le formulaire qui affiche le s\u00e9lecteur de liens, la premi\u00e8re chose \u00e0 faire est de s&rsquo;accrocher \u00e0 l&rsquo; <code>cmb2_render_[control_name]<\/code>action. Comme j&rsquo;ai appel\u00e9 ce contr\u00f4le &lsquo;link_picker&rsquo; nous pouvons compl\u00e9ter le hook comme ceci :<\/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>Pour ceux d&rsquo;entre vous qui ne comprennent pas vraiment le <code>add_action<\/code>crochet, cela fonctionne comme suit :<\/p>\n<ol>\n<li>Le premier argument <code>cmb2_render_link_picker<\/code>est le nom du crochet auquel nous voulons nous accrocher.<\/li>\n<li>Le deuxi\u00e8me argument <code>array( $this, 'cmb2_render_link_picker' )<\/code>est la fonction que nous voulons appeler lorsque ce crochet s&rsquo;ex\u00e9cute. Notez que j&rsquo;enveloppe ceci dans un tableau, avec <code>$this<\/code>comme premier param\u00e8tre, car j&rsquo;appelle la fonction \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une classe. Si vous ne travaillez pas avec des classes, vous pouvez simplement utiliser le nom de la fonction <code>cmb2_render_link_picker<\/code>.<\/li>\n<li>Le <code>10<\/code>, est l&rsquo;ordre dans lequel nous voulons que la fonction se d\u00e9clenche (plus le nombre est bas, plus t\u00f4t elle se d\u00e9clenche lorsque l&rsquo;action est appel\u00e9e).<\/li>\n<li>C&rsquo;est <code>5<\/code>le nombre de param\u00e8tres qui seront pass\u00e9s \u00e0 la fonction que j&rsquo;appelle (cela deviendra clair sous peu).<\/li>\n<\/ol>\n<p>Ensuite, nous cr\u00e9ons la fonction qui affichera le formulaire\u00a0:<\/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>J&rsquo;ai laiss\u00e9 le &lsquo;DocBlock&rsquo; dans le code ci-dessus qui d\u00e9crit ce que fait chacun des param\u00e8tres pass\u00e9s dans la <code>cmb2_render_link_picker()<\/code>fonction.<\/p>\n<p>Notez que ma fonction commence par la <code>public<\/code>d\u00e9claration. C&rsquo;est encore parce que je travaille au sein d&rsquo;une classe. Si vous ne travaillez pas avec des classes, vous pouvez omettre cela.<\/p>\n<p>La valeur de ce champ est pass\u00e9e \u00e0 la fonction via le <code>$value<\/code>param\u00e8tre. Dans le cas de ce champ, nous passerons par un tableau, car notre contr\u00f4le comporte trois \u00e9l\u00e9ments distincts\u00a0:<\/p>\n<ul>\n<li>Le texte<\/li>\n<li>L&rsquo;URL<\/li>\n<li>Si le lien s&rsquo;ouvre dans une nouvelle fen\u00eatre (ou pas)<\/li>\n<\/ul>\n<p>Parce que <code>$value<\/code>n&rsquo;est pas toujours d\u00e9fini (par exemple la premi\u00e8re fois que le contr\u00f4le est rendu), nous devons l&rsquo;initialiser avec des valeurs par d\u00e9faut. Nous le faisons avec le morceau de code suivant\u00a0:<\/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>Nous pouvons ensuite nous mettre au travail pour rendre le formulaire. Voici un exemple du premier contr\u00f4le de saisie de texte\u00a0:<\/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>Phew! \u00c7a a l&rsquo;air un peu brouillon n&rsquo;est-ce pas? D\u00e9composons-le, ligne par ligne\u00a0:<\/p>\n<ol>\n<li>La balise de paragraphe d&rsquo;ouverture.<\/li>\n<li>La balise d&rsquo;\u00e9tiquette d&rsquo;ouverture du contr\u00f4le, mais avec l&rsquo; <code>for<\/code>attribut automatiquement d\u00e9fini par le <code>$field_type_object<\/code> <code>_id<\/code>param\u00e8tre. Cela g\u00e9n\u00e9rera automatiquement un ID pour le contr\u00f4le lors de son rendu.<\/li>\n<li>Le texte de notre \u00e9tiquette, construit en utilisant le texte du tableau d&rsquo;options des contr\u00f4les (ou revient au mot &lsquo;Texte&rsquo;).<\/li>\n<li>La balise d&rsquo;\u00e9tiquette de fermeture<\/li>\n<li>La balise de paragraphe fermant.<\/li>\n<li>D\u00e9marrer la d\u00e9claration PHP<\/li>\n<li>Utilisez un contr\u00f4le d&rsquo;entr\u00e9e (partie de <code>$field_type_object<\/code>pour cr\u00e9er une entr\u00e9e de formulaire (le type par d\u00e9faut sera du texte).<\/li>\n<li>D\u00e9marrer le tableau de param\u00e8tres<\/li>\n<li>D\u00e9finissez la classe de l&rsquo;entr\u00e9e.<\/li>\n<li>D\u00e9finissez le nom de l&rsquo;entr\u00e9e, \u00e0 nouveau \u00e0 l&rsquo;aide de l&rsquo; <code>$field_type_object<\/code>assistant.<\/li>\n<li>D\u00e9finissez l&rsquo;ID de l&rsquo;entr\u00e9e sur le m\u00eame ID que celui d\u00e9fini sur l&rsquo;\u00e9tiquette de l&rsquo;\u00e9tiquette.<\/li>\n<li>Obtenez la valeur de <code>$value<\/code>, car il s&rsquo;agit d&rsquo;un tableau, nous voulons la cl\u00e9 &lsquo;texte&rsquo; pour ce contr\u00f4le.<\/li>\n<li>Fermez le tableau.<\/li>\n<li>Fermez la fonction d&rsquo;entr\u00e9e.<\/li>\n<li>Fermez la d\u00e9claration PHP.<\/li>\n<\/ol>\n<p>Le balisage du champ de formulaire URL est sensiblement le m\u00eame, seulement pour utiliser les types d&rsquo;entr\u00e9e HTML5, nous pouvons d\u00e9finir un param\u00e8tre suppl\u00e9mentaire de &lsquo;type&rsquo; sur &lsquo;url&rsquo;\u00a0:<\/p>\n<pre><code>&lt;?php \n\u2026\n'type'  =&gt; 'url',\n\u2026\n<\/code><\/pre>\n<p>Enfin, nous voulons impl\u00e9menter une liste d\u00e9roulante. Le balisage est tr\u00e8s familier\u00a0:<\/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>Notez que la <code>$field_type_object<\/code>fonction que nous utilisons est <code>select<\/code>de g\u00e9n\u00e9rer une liste d\u00e9roulante. Notez \u00e9galement qu&rsquo;\u00e0 la ligne 6, nous avons un nouvel attribut de <code>options<\/code>. Dans cela, nous passons une cha\u00eene d\u00a0\u00bboptions&rsquo;. Ceci est g\u00e9n\u00e9r\u00e9 avant ce contr\u00f4le comme suit\u00a0:<\/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>Ensuite, tout ce que nous avons \u00e0 faire est de l&rsquo;envelopper dans quelques <code>&lt;div&gt;<\/code>et nous avons notre contr\u00f4le enti\u00e8rement rendu\u00a0:<\/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>Et c&rsquo;est tout! Nous avons fait notre contr\u00f4le! CMB2 g\u00e8re automatiquement toutes les donn\u00e9es que nous voulons sauvegarder, donc rien \u00e0 faire l\u00e0-bas.<\/p>\n<h3>modes<\/h3>\n<p>La capture d&rsquo;\u00e9cran du contr\u00f4le que nous cr\u00e9ons (en haut de cet article) comporte quelques styles personnalis\u00e9s qui lui sont appliqu\u00e9s afin qu&rsquo;il s&rsquo;affiche en ligne. Je n&rsquo;entrerai pas dans la fa\u00e7on de styliser le formulaire aujourd&rsquo;hui, mais si vous \u00eates curieux, vous pouvez <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e9l\u00e9charger le plugin et afficher la source<\/a>.<\/p>\n<h3>Rendre le contr\u00f4le r\u00e9p\u00e9table<\/h3>\n<p>Pour ceux d&rsquo;entre vous qui veulent aller un peu plus loin, vous pouvez faire fonctionner le contr\u00f4le avec les r\u00e9gions r\u00e9p\u00e9tables de CMB2. Pour ce faire, vous devez faire un peu de mappage de tableau. Pour ce faire, utilisez le code ci-dessous\u00a0:<\/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>Choisir un lien<\/h2>\n<p>Bien s\u00fbr, l&rsquo;int\u00e9r\u00eat du s\u00e9lecteur de liens est de s&rsquo;int\u00e9grer \u00e0 la fonctionnalit\u00e9 de choix de liens de WordPress, en faisant appara\u00eetre l&rsquo;\u00e9cran de dialogue &quot;Ins\u00e9rer\/modifier le lien&quot; lorsque le bouton &quot;Choisir&quot; est cliqu\u00e9.<\/p>\n<p>Pour ce faire, nous nous appuyons fortement sur JavaScript. En particulier, j&rsquo;utilise <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuery<\/a> pour faire bouger les choses.<\/p>\n<p>Avant de vous montrer le JavaScript qui lance la bo\u00eete de dialogue, nous devons d&rsquo;abord mettre en file d&rsquo;attente le propre JavaScript interne de WordPress, qui pr\u00e9chargera les modaux et les biblioth\u00e8ques dont notre code d\u00e9pend. \u00c7a ressemble un peu \u00e0 \u00e7a :<\/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>Comme vous pouvez le voir, de nombreuses biblioth\u00e8ques WordPress internes s&rsquo;appuient sur jQuery pour charger la fen\u00eatre contextuelle, il est donc logique que notre d\u00e9clencheur de fen\u00eatre contextuelle fasse de m\u00eame. Cela se fait via le <code>\/js\/plugin.js<\/code>qui est charg\u00e9 \u00e0 la ligne 10 de l&rsquo;exemple ci-dessus.<\/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>En utilisant les classes que nous avons enroul\u00e9es autour de nos contr\u00f4les de formulaire, le JavaScript cible les contr\u00f4les et pousse le r\u00e9sultat s\u00e9lectionn\u00e9 \u00e0 partir de la fen\u00eatre contextuelle du s\u00e9lecteur de liens dans les champs de contr\u00f4le pertinents.<\/p>\n<h2>Utilisation du contr\u00f4le<\/h2>\n<p>Ainsi, apr\u00e8s avoir parcouru le didacticiel ci-dessus, et \u00e9ventuellement apr\u00e8s avoir <a href=\"https:\/\/en-gb.wordpress.org\/plugins\/link-picker-for-cmb2\/developers\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">examin\u00e9 le code source<\/a> du plugin <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>, ou simplement t\u00e9l\u00e9charg\u00e9 ma version, vous vous demandez peut-\u00eatre maintenant comment utiliser la chose avec CMB2. Eh bien, rien de plus simple :<\/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\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/wholesomecode.ltd\" class=\"external external_icon\">wholesomecode.ltd<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans ce tutoriel, je vais voir comment vous pouvez cr\u00e9er un contr\u00f4le personnalis\u00e9 pour \u00e9tendre les fonctionnalit\u00e9s de CMB2 (Custom Meta Boxes 2) par WebDevStudios. Je d\u00e9veloppe des sites Web (et des applications Web &#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":[893,717,841,862],"tags":[1167],"class_list":["post-228556","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=228556"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/228556\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/224127"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=228556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=228556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=228556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}