{"id":234246,"date":"2023-02-20T10:44:00","date_gmt":"2023-02-20T07:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234246"},"modified":"2023-02-26T12:20:47","modified_gmt":"2023-02-26T09:20:47","slug":"ajouter-des-parametres-personnalises-aux-blocs-wordpress-gutenberg-existants","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ajouter-des-parametres-personnalises-aux-blocs-wordpress-gutenberg-existants\/","title":{"rendered":"Ajouter des param\u00e8tres personnalis\u00e9s aux blocs WordPress Gutenberg existants"},"content":{"rendered":"\n<p>Vous \u00eates-vous d\u00e9j\u00e0 retrouv\u00e9 dans la situation o\u00f9 vous souhaitez ajouter vos param\u00e8tres personnalis\u00e9s aux blocs Gutenberg de WordPress? Dans cet article, nous allons d\u00e9tailler comment proc\u00e9der. Vous trouverez deux exemples de code de cas d&rsquo;utilisation r\u00e9els d&rsquo;ajout de param\u00e8tres personnalis\u00e9s aux blocs de WordPress.<\/p>\n<p>Gardez \u00e0 l&rsquo;esprit que parce que les blocs Gutenberg sont en Javascript, leur modification n\u00e9cessite que vous \u00e9criviez le code en Javascript. Tout comme le code PHP de WordPress a des crochets et des filtres qui permettent aux d\u00e9veloppeurs de th\u00e8mes ou de plugins de modifier son code, il existe \u00e9galement des filtres dans le code Javascript de WordPress. Comme pour la <code>[add_filter](https:\/\/developer.wordpress.org\/reference\/functions\/add_filter\/)()<\/code>fonction PHP, nous avons la fonction Javascript <code>[addFilter](https:\/\/developer.wordpress.org\/block-editor\/packages\/packages-hooks\/#api-usage)()<\/code>.<\/p>\n<p>J&rsquo;\u00e9crirai le code dans la syntaxe Javascript ES6, qui n\u00e9cessite un compilateur pour le transformer. Vous pouvez \u00e9crire dans la syntaxe ES5 mais je vous recommande d&rsquo;opter pour ES6\/ESNext. J&rsquo;ai un <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/guide-complet-sur-la-configuration-dun-environnement-de-developpement-pour-gutenberg\/\" title=\"article qui explique comment configurer un transformateur pour ES6\/ESNext\">article qui explique comment configurer un transformateur pour ES6\/ESNext<\/a>. Je suppose \u00e9galement que vous avez une certaine familiarit\u00e9 avec React\/JSX, peut-\u00eatre une certaine exp\u00e9rience dans <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/comment-creer-un-bloc-wordpress-gutenberg-personnalise-serie-de-didacticiels\/\" title=\"la cr\u00e9ation de vos propres blocs Gutenberg personnalis\u00e9s\">la cr\u00e9ation de vos propres blocs Gutenberg personnalis\u00e9s<\/a>.<\/p>\n<h2>Ce que vous pouvez filtrer sur les blocs Gutenberg<\/h2>\n<p>Il n&rsquo;y a pas beaucoup de documentation sur les crochets et les filtres Gutenberg disponibles. Mais dans le but d&rsquo;ajouter des param\u00e8tres personnalis\u00e9s et de les appliquer d&rsquo;une mani\u00e8re ou d&rsquo;une autre sur des blocs existants\u00a0; c&rsquo;est ce que j&rsquo;ai trouv\u00e9 jusqu&rsquo;\u00e0 pr\u00e9sent. Je me suis concentr\u00e9 sur l&rsquo;ajout de param\u00e8tres simples, et non sur des op\u00e9rations qui n\u00e9cessitent des changements drastiques de composants ou un comportement complexe.<\/p>\n<p>Il y a trois \u00e9tapes pour ajouter des param\u00e8tres personnalis\u00e9s aux blocs existants\u00a0:<\/p>\n<ul>\n<li>Nous ajoutons un filtre sur le <code>[registerBlockType](https:\/\/developer.wordpress.org\/block-editor\/developers\/block-api\/block-registration\/#registerblocktype)<\/code>tableau de param\u00e8tres du bloc existant. Cela nous permet d&rsquo;ajouter de nouveaux attributs au <code>attributes<\/code>tableau, nous permettant ainsi d&rsquo;enregistrer des informations suppl\u00e9mentaires sur le bloc. Nous devons enregistrer notre param\u00e8tre personnalis\u00e9 quelque part.<\/li>\n<li>Accrochez-vous au composant du bloc <code>edit<\/code>(le composant responsable du rendu du bloc dans l&rsquo;\u00e9diteur). Dans ce crochet, nous pouvons nous accrocher \u00e0 l&rsquo;inspecteur (la barre lat\u00e9rale) et ajouter nos propres composants. Nous pouvons soit ajouter une nouvelle section\/un nouveau panneau, soit nous accrocher \u00e0 la section &quot;Avanc\u00e9&quot; qui est toujours pr\u00e9sente dans tous les blocs. Ensuite, c&rsquo;est \u00e0 nous de rendre les entr\u00e9es de param\u00e8tres, telles que les entr\u00e9es de texte, les cases \u00e0 cocher ou autres.<\/li>\n<li><code>save<\/code>Filtrez les accessoires du bloc. Nous pouvons ajuster les accessoires pour la sauvegarde, qui est responsable \u00e0 la fois de la sauvegarde du bloc et de son rendu en frontend (en dehors de l&rsquo;\u00e9diteur). Dans notre cas, nous voulons ajouter une classe ou un style en ligne.<\/li>\n<\/ul>\n<p>Nous pouvons cibler un ou plusieurs blocs sp\u00e9cifiques ou tout cibler. Nous avons toujours acc\u00e8s au type de bloc auquel nous nous trouvons.<\/p>\n<p>Pour le dire en d&rsquo;autres termes\u00a0: nous ajoutons des param\u00e8tres personnalis\u00e9s dans l&rsquo;inspecteur et les enregistrons dans les attributs personnalis\u00e9s que nous avons ajout\u00e9s au bloc. Nous pouvons ensuite influencer le nom de la classe du bloc ou le style en ligne (dans certains cas), en fonction des attributs enregistr\u00e9s. Avec les noms de classe personnalis\u00e9s, nous pouvons facilement ajouter un CSS personnalis\u00e9 qui donne visuellement un effet \u00e0 nos param\u00e8tres.<\/p>\n<h2>Ce qu&rsquo;on ne peut pas faire (pour l&rsquo;instant ?)<\/h2>\n<p>Malheureusement, il y a certaines choses auxquelles nous ne pouvons pas acc\u00e9der avec des filtres sur des blocs existants. En ce qui concerne l&rsquo;ajout de param\u00e8tres personnalis\u00e9s simples aux blocs, ce sont des choses courantes que nous ne pouvons pas affecter.<\/p>\n<h3>Pas d&rsquo;acc\u00e8s au style en ligne du bloc dans l&rsquo;\u00e9diteur<\/h3>\n<p>Dans certains cas de param\u00e8tres affectant la conception d&rsquo;un bloc, nous devons ajouter un style en ligne sur le n\u0153ud d&rsquo;habillage du bloc. Juste le nom de la classe ne suffira pas. Par exemple, si vous ajoutez un param\u00e8tre de couleur personnalis\u00e9 et que l&rsquo;utilisateur s\u00e9lectionne une couleur personnalis\u00e9e (\u00e0 partir du s\u00e9lecteur de couleurs), vous ne pouvez pas r\u00e9soudre ce probl\u00e8me en ajoutant une classe &#8211; vous avez besoin d&rsquo;un style en ligne.<\/p>\n<p>Malheureusement, il semble que les blocs par d\u00e9faut de WordPress g\u00e8rent le style en ligne dans l&rsquo;\u00e9diteur de mani\u00e8re totalement ind\u00e9pendante, sans possibilit\u00e9 de filtrage ou de \u00abconnexion \u00bb. Je vais montrer un moyen de contourner cela dans le dernier exemple ci-dessous, mais ce n&rsquo;est pas id\u00e9al dans tous les cas.<\/p>\n<p>Pourquoi se soucier que le bloc ait un aspect diff\u00e9rent dans l&rsquo;\u00e9diteur par rapport \u00e0 l&rsquo;interface, vous pouvez demander\u00a0? L&rsquo;int\u00e9r\u00eat de Gutenberg est de mettre en \u0153uvre une mani\u00e8re visuelle d&rsquo;\u00e9diter le contenu o\u00f9 ce que nous voyons est r\u00e9ellement ce que nous obtenons. Nous voulons obtenir le m\u00eame aspect visuel \u00e0 la fois dans l&rsquo;\u00e9diteur et dans l&rsquo;interface.<\/p>\n<h3>Certains blocs n&rsquo;incluent pas le nom de la classe dans l&rsquo;\u00e9diteur<\/h3>\n<p>Comme mentionn\u00e9 ci-dessus, nous pouvons filtrer le nom de la classe d&#8217;emballage du bloc car il s&rsquo;agit d&rsquo;un prop qui est transmis \u00e0 tous les blocs Gutenberg. Mais malheureusement, certains blocs n&rsquo;appliquent pas du tout la classe du bloc dans <code>edit<\/code>. Un exemple est le bloc Cover. J&rsquo;ai beaucoup jou\u00e9 en utilisant les blocs Cover comme &quot;sections&quot; pour les pages d&rsquo;accueil, et je continue \u00e0 rencontrer des probl\u00e8mes car le bloc Cover construit sa propre classe \u00e0 l&rsquo;int\u00e9rieur de <code>edit<\/code>. Il ignore compl\u00e8tement la classe &quot;globale&quot; du bloc (qui est celle \u00e0 laquelle nous avons acc\u00e8s via des filtres).<\/p>\n<p>Mais au moins, nous pouvons \u00eatre s\u00fbrs que les noms de classe filtr\u00e9s sont toujours appliqu\u00e9s dans <code>save<\/code>(frontend). Cela se produit automatiquement en dehors du code sp\u00e9cifique de chaque bloc.<\/p>\n<p>Si je me trompe sur l&rsquo;un des points ci-dessus, S&rsquo;IL VOUS PLA\u00ceT, faites-le moi savoir dans les commentaires ci-dessous! J&rsquo;apprends continuellement Gutenberg, et en m\u00eame temps Gutenberg \u00e9volue \u00e9galement. J&rsquo;esp\u00e8re qu&rsquo;\u00e0 un moment donn\u00e9 ce qui pr\u00e9c\u00e8de sera possible \u00e0 un moment donn\u00e9 ou que c&rsquo;est possible, mais il me manque juste des informations cruciales\u00a0!<\/p>\n<p>Avec cela \u00e0 l&rsquo;\u00e9cart, commen\u00e7ons \u00e0 examiner du code.<\/p>\n<h2>Exemple\u00a01\u00a0: Ajouter un champ bascule pour masquer un bloc Couverture sur mobile<\/h2>\n<p>Supposons que nous d\u00e9veloppions un th\u00e8me o\u00f9 les blocs de couverture seront utilis\u00e9s pour les &quot;sections&quot; sur la page d&rsquo;accueil. Et nous voulons offrir \u00e0 l&rsquo;utilisateur la possibilit\u00e9 de masquer une certaine section du mobile. Pour r\u00e9soudre ce probl\u00e8me, nous pouvons ajouter un champ de basculement dans la section &quot;Avanc\u00e9&quot; de l&rsquo;inspecteur du bloc Cover. Si le champ est activ\u00e9, le bloc Couverture obtiendra une classe personnalis\u00e9e suppl\u00e9mentaire que nous pouvons cibler avec des requ\u00eates CSS et multim\u00e9dia.<\/p>\n<p>Au fait\u00a0: il s&rsquo;agit d&rsquo;un cas o\u00f9 le probl\u00e8me du bloc Cover qui n&rsquo;applique pas nos noms de classe personnalis\u00e9s dans l&rsquo;\u00e9diteur est en fait un avantage\u00a0! Imaginez si c&rsquo;\u00e9tait le cas; alors il serait impossible pour l&rsquo;utilisateur d&rsquo;\u00e9diter le bloc dans l&rsquo;\u00e9diteur s&rsquo;il a un petit \u00e9cran !<\/p>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, il y a trois \u00e9tapes pour lesquelles nous devons coder. Nous devons \u00e9galement ajouter du PHP pour mettre en file d&rsquo;attente notre fichier Javascript dans l&rsquo;\u00e9diteur. Faisons cela d&rsquo;abord.<\/p>\n<h3>Ajout de notre script \u00e0 l&rsquo;\u00e9diteur<\/h3>\n<p>Nous accrochons une fonction \u00e0 l&rsquo;action <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. Dans notre fonction, nous mettons un script en file d&rsquo;attente, comme nous le ferions habituellement dans <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>N&rsquo;oubliez pas d&rsquo;ajuster le chemin d&rsquo;acc\u00e8s \u00e0 l&rsquo;endroit o\u00f9 se trouve votre script\u00a0! Remarque: Si vous \u00e9crivez dans ES6 avec webpack compilant votre Javascript, n&rsquo;oubliez pas de d\u00e9finir le chemin vers la construction de votre script, pas la source.<\/p>\n<p>J&rsquo;aime ajouter &lsquo; <code>wp-edit-post<\/code>&lsquo; comme d\u00e9pendance au script pour m&rsquo;assurer qu&rsquo;il se charge suffisamment tard.<\/p>\n<p>C&rsquo;est tout le PHP que nous devons faire. Le reste est \u00e9crit dans notre fichier Javascript.<\/p>\n<h3>Ajouter un attribut personnalis\u00e9<\/h3>\n<p>Le premier filtre que nous utiliserons est l&rsquo;objet de param\u00e8tres des <code>blocks.registerBlockType<\/code>filtres .<code>registerBlockType<\/code><\/p>\n<p>Mais d&rsquo;abord, un peu sur l&rsquo;ajout de filtres en Javascript. Comme je n&rsquo;ai pas trouv\u00e9 de bonne documentation pour cela, je vais l&rsquo;expliquer un peu ici. La fonction <code>addFilter<\/code>est dans l&rsquo; espace de <code>wp.hooks<\/code>noms et accepte quatre arguments.<\/p>\n<p><code>addFilter('hookName', 'namespace', 'functionName', 'priority');<\/code><\/p>\n<p>Le premier param\u00e8tre, &lsquo;hookName&rsquo;, est le nom du filtre auquel nous voulons nous accrocher. C&rsquo;est l&rsquo;\u00e9quivalent du premier param\u00e8tre lors de l&rsquo;utilisation de PHP <code>add_filter()<\/code>. Le deuxi\u00e8me param\u00e8tre, &lsquo;namespace&rsquo;, est un nom d&rsquo;espace de noms personnalis\u00e9 pour votre code. C&rsquo;est juste pour \u00e9viter la collision de noms. Vous pouvez \u00e0 peu pr\u00e8s d\u00e9finir tout ce que vous voulez ici, mais n&rsquo;utilisez pas l&rsquo;espace de noms de WordPress (&lsquo;wp&rsquo;). Utilisez une forme abr\u00e9g\u00e9e de votre nom ou du nom du projet. Le troisi\u00e8me param\u00e8tre, &lsquo;functionName&rsquo;, est la fonction hook\u00e9e &#8211; qui est la m\u00eame que le <code>add_filter()<\/code>deuxi\u00e8me argument de PHP. Et enfin le quatri\u00e8me param\u00e8tre, &lsquo;priorit\u00e9&rsquo;, est facultatif. Encore une fois, c&rsquo;est la m\u00eame chose que le <code>add_filter()<\/code>troisi\u00e8me argument de PHP.<\/p>\n<p>Le processus pour les filtres en Javascript est le m\u00eame qu&rsquo;en PHP. Nous d\u00e9finissons une fonction qui doit renvoyer la variable filtr\u00e9e. Parfois, la variable est une cha\u00eene, un objet ou un composant. \u00c0 l&rsquo;int\u00e9rieur de la fonction, nous modifions la variable comme bon nous semble.<\/p>\n<p>Dans notre cas, nous voulons ajouter un nouvel attribut \u00e0 l&rsquo; <code>attribute<\/code>objet du bloc. Nous appellerons le nouvel attribut <code>hideOnMobile<\/code>et d\u00e9finirons son type sur <code>boolean<\/code>. Cela se fait comme ceci :<\/p>\n<pre><code>function addCoverAttribute(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/cover') {\n            settings.attributes = Object.assign(settings.attributes, {\n                hideOnMobile: {\n                    type: 'boolean',\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/cover-custom-attribute',\n    addCoverAttribute\n);<\/code><\/pre>\n<p>\u00c0 la ligne, <code>#3<\/code>nous nous assurons de cibler uniquement les blocs de type &lsquo; <code>core\/cover<\/code>&lsquo;. Le deuxi\u00e8me argument \u00e0 <code>blocks.registerBlockType<\/code>filtrer est assez commod\u00e9ment le nom du bloc. Nous ajoutons ensuite un nouvel objet \u00e0 l&rsquo; <code>settings.attributes<\/code>objet. Enfin, nous nous assurons de renvoyer la variable filtr\u00e9e, <code>settings<\/code>.<\/p>\n<p>\u00c0 ce stade, visuellement, rien n&rsquo;a chang\u00e9 \u00e0 Gutenberg. Mais tous les blocs de couverture ont maintenant un attribut suppl\u00e9mentaire que nous pouvons utiliser pour stocker notre r\u00e9glage.<\/p>\n<h3>Ajouter un param\u00e8tre \u00e0 l&rsquo;inspecteur (panneau Avanc\u00e9)<\/h3>\n<p>Le deuxi\u00e8me filtre est appel\u00e9 <code>editor.BlockEdit<\/code>et filtre le composant du bloc <code>edit<\/code>. Ce filtre re\u00e7oit le composant du bloc d&rsquo;origine <code>BlockEdit<\/code>et renvoie un nouveau composant envelopp\u00e9. Nous devons utiliser <code>wp.compose.createHigherOrderComponent<\/code>pour retourner le composant envelopp\u00e9.<\/p>\n<p>\u00c0 l&rsquo;int\u00e9rieur de notre composant, nous nous assurons de rendre le composant envelopp\u00e9 <code>BlockEdit<\/code>, peu importe. Mais si le bloc est de type Cover, nous nous accrochons \u00e9galement au composant <code>InspectorAdvancedControls<\/code>(qui est le panneau &quot;Avanc\u00e9&quot; dans Inspector) et ajoutons un fichier <code>ToggleControl<\/code>. Nous \u00e9crivons le <code>ToggleControl<\/code>pour afficher la valeur de et mettons \u00e0 jour l&rsquo;attribut personnalis\u00e9 que nous avons ajout\u00e9 pr\u00e9c\u00e9demment, <code>hideOnMobile<\/code>.<\/p>\n<pre><code>const coverAdvancedControls = wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n    return (props) =&gt; {\n        const { Fragment } = wp.element;\n        const { ToggleControl } = wp.components;\n        const { InspectorAdvancedControls } = wp.blockEditor;\n        const { attributes, setAttributes, isSelected } = props;\n        return (&lt;Fragment&gt;\n                &lt;BlockEdit {...props} \/&gt;\n                {isSelected &amp;&amp; (props.name == 'core\/cover') &amp;&amp; \n                    &lt;InspectorAdvancedControls&gt;\n                        &lt;ToggleControl\n                            label={wp.i18n.__('Hide on mobile', 'awp')}\n                            checked={!!attributes.hideOnMobile}\n                            onChange={(newval) =&gt; setAttributes({ hideOnMobile: !attributes.hideOnMobile })}\n                        \/&gt;\n                    &lt;\/InspectorAdvancedControls&gt;\n                }\n            &lt;\/Fragment&gt;\n        );\n    };\n}, 'coverAdvancedControls');\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/cover-advanced-control',\n    coverAdvancedControls\n);<\/code><\/pre>\n<p>N&rsquo;oubliez pas de toujours retourner l&rsquo;original <code>BlockEdit<\/code>, ce que nous faisons \u00e0 line <code>#9<\/code>. \u00c0 la ligne 10, nous v\u00e9rifions si le type de bloc est Cover et rendons le <code>InspectorAdvancedControls<\/code>composant. \u00c0 l&rsquo; int\u00e9rieur, nous ajoutons un <code>ToggleControl<\/code>, qui est un contr\u00f4le d&rsquo;entr\u00e9e qui s&rsquo;affiche sous la forme d&rsquo;une bascule entre vrai ou faux. Nous d\u00e9finissons une \u00e9tiquette et connectons sa valeur \u00e0 l&rsquo; <code>hideOnMobile<\/code>attribut. Si vous avez d\u00e9j\u00e0 ajout\u00e9 des param\u00e8tres \u00e0 Inspector, cela devrait \u00eatre assez simple pour vous.<\/p>\n<p>Avec le code ci-dessus, nous devrions maintenant obtenir ceci dans le panneau &quot;Avanc\u00e9&quot; de l&rsquo;inspecteur sur les blocs de couverture\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70271f5a.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-152421-61e4d70271f5a.png\" alt=\"Ajouter des param\u00e8tres personnalis\u00e9s aux blocs WordPress Gutenberg existants\"><\/a><\/p>\n<p>L&rsquo;entr\u00e9e va maintenant mettre \u00e0 jour notre attribut personnalis\u00e9 <code>hideOnMobile<\/code>. La derni\u00e8re \u00e9tape consiste \u00e0 faire quelque chose en fonction de la valeur de cet attribut. \u00c0 l&rsquo;heure actuelle, l&rsquo;attribut est enregistr\u00e9, mais n&rsquo;affecte en fait rien.<\/p>\n<h3>Ajouter une classe personnalis\u00e9e<\/h3>\n<p>La derni\u00e8re \u00e9tape consiste \u00e0 ajouter une classe personnalis\u00e9e \u00e0 la classe du bloc. Nous faisons cela avec le filtre <code>blocks.getSaveContent.extraProps<\/code>. Ce filtre affecte les accessoires du composant du bloc <code>save<\/code>. L&rsquo;un d&rsquo;eux est le prop <code>className<\/code>, qui sera toujours appliqu\u00e9 au frontend. Nous ajoutons simplement notre classe personnalis\u00e9e apr\u00e8s si l&rsquo;attribut \u00e9tait <code>true<\/code>, puis nous le renvoyons. J&rsquo;ai d\u00e9cid\u00e9 d&rsquo;ajouter une classe &lsquo; <code>hide-on-mobile<\/code>&lsquo;, mais vous pouvez l&rsquo;appeler comme vous le souhaitez.<\/p>\n<pre><code>function coverApplyExtraClass(extraProps, blockType, attributes) {\n    const { hideOnMobile } = attributes;\n\u00a0\n    if (typeof hideOnMobile !== 'undefined' &amp;&amp; hideOnMobile) {\n        extraProps.className = extraProps.className + ' hide-on-mobile';\n    }\n    return extraProps;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/cover-apply-class',\n    coverApplyExtraClass\n);<\/code><\/pre>\n<p>Ce code est assez explicite. \u00c0 la ligne, <code>#4<\/code>nous v\u00e9rifions si l&rsquo;attribut <code>hideOnMobile<\/code>existe et est <code>true<\/code>. Si tel est le cas, nous ajoutons une classe personnalis\u00e9e \u00e0 la <code>className<\/code>cha\u00eene.<\/p>\n<p>Avec les trois filtres ci-dessus, nous devrions maintenant obtenir une classe personnalis\u00e9e &quot;hide-on-mobile&quot; appliqu\u00e9e \u00e0 notre bloc Cover chaque fois que le param\u00e8tre est activ\u00e9.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d70343817.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-152421-61e4d70343817.png\" alt=\"Ajouter des param\u00e8tres personnalis\u00e9s aux blocs WordPress Gutenberg existants\"><\/a><\/p>\n<p>Il ne reste plus qu&rsquo;\u00e0 ajouter du CSS \u00e0 la feuille de style frontale de votre th\u00e8me. Quelque chose comme \u00e7a;<\/p>\n<pre><code>.wp-block-cover.hide-on-mobile { display: none; }\n@media (min-width: 480px) {\n    .wp-block-cover.hide-on-mobile { display: block; }\n}<\/code><\/pre>\n<h2>Exemple 2\u00a0: Ajouter un panneau Inspecteur avec un param\u00e8tre de couleur d&rsquo;arri\u00e8re-plan personnalis\u00e9 pour le bloc Spacer<\/h2>\n<p>Pour le deuxi\u00e8me cas d&rsquo;utilisation, nous voulons ajouter des param\u00e8tres de couleur personnalis\u00e9s au bloc Spacer. Par d\u00e9faut, le bloc Spacer n&rsquo;a pas d&rsquo;autres param\u00e8tres que sa hauteur. Supposons que nous voulions ajouter une couleur d&rsquo;arri\u00e8re-plan qui colorie toute la hauteur du bloc Spacer. Cela permet \u00e0 l&rsquo;utilisateur d&rsquo;ajouter des &quot;bandes&quot; vides et color\u00e9es \u00e0 l&rsquo;int\u00e9rieur de son contenu. Dans ce cas, nous souhaitons ajouter les param\u00e8tres de couleur dans son propre panneau s\u00e9par\u00e9 dans l&rsquo;inspecteur, conform\u00e9ment au comportement habituel attendu pour les param\u00e8tres de couleur.<\/p>\n<p>Remarque\u00a0: La gestion des couleurs est un peu plus compliqu\u00e9e car nous devons utiliser un (autre) composant d&rsquo;ordre sup\u00e9rieur <code>withColors<\/code>. Parce que nous devons d\u00e9j\u00e0 impl\u00e9menter un composant d&rsquo;ordre sup\u00e9rieur dans le <code>editor.BlockEdit<\/code>nous avons besoin de <code>compose<\/code>plusieurs composants. De plus, nous devons ajouter deux attributs pour chaque param\u00e8tre de couleur. L&rsquo;un contiendra le slug de la palette de couleurs et l&rsquo;autre contiendra le code de couleur hexad\u00e9cimal &#8211; uniquement si l&rsquo;utilisateur a opt\u00e9 pour une couleur personnalis\u00e9e (utilis\u00e9 le s\u00e9lecteur de couleurs). C&rsquo;est un comportement courant lorsque vous travaillez avec <code>withColors<\/code>. J&rsquo;ai un &lt;a href=&quot;https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-parametres-de-couleur-a-votre-bloc-gutenberg-personnalise\/&quot; title=&quot;article qui explique l&#039;ajout de param\u00e8tres de couleur et <code>withColors<\/code>en d\u00e9tail\u00a0\u00bb &gt;article qui explique l&rsquo;ajout de param\u00e8tres de couleur et <code>withColors<\/code>en d\u00e9tail<\/a> si vous \u00eates confus.<\/p>\n<p>Deuxi\u00e8mement, nous allons dans ce cas rencontrer le probl\u00e8me expliqu\u00e9 ci-dessus; o\u00f9 nous ne pouvons pas ajouter le style en ligne appropri\u00e9 \u00e0 l&rsquo;\u00e9diteur. La solution pour laquelle j&rsquo;ai opt\u00e9 dans ce cas est d&rsquo;envelopper le bloc Spacer \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un <code>div<\/code>dans l&rsquo;\u00e9diteur et d&rsquo;appliquer les classes et le style en ligne appropri\u00e9s au wraping <code>div<\/code>. Cela rend la couleur s\u00e9lectionn\u00e9e visible dans l&rsquo;\u00e9diteur lorsque le bloc est d\u00e9s\u00e9lectionn\u00e9. Cependant, lors de la s\u00e9lection du bloc, WordPress ajoute son propre arri\u00e8re-plan gris clair personnalis\u00e9 au bloc, couvrant notre couleur d&rsquo;arri\u00e8re-plan personnalis\u00e9e. Un CSS \u00e0 l&rsquo;\u00e9diteur r\u00e9soudra ce probl\u00e8me. J&rsquo;expliquerai plus \u00e0 la fin.<\/p>\n<p>Les \u00e9tapes sont les m\u00eames que dans l&rsquo;exemple ci-dessus. Nous mettons d&rsquo;abord notre script en file d&rsquo;attente dans l&rsquo;\u00e9diteur en PHP. Ensuite en Javascript on filtre l&rsquo; <code>attributes<\/code>objet, le <code>edit<\/code>composant du Spacer et enfin le <code>save<\/code>composant du Spacer.<\/p>\n<h3>Ajout de notre script \u00e0 l&rsquo;\u00e9diteur<\/h3>\n<p>Nous accrochons une fonction \u00e0 l&rsquo;action <code>[enqueue_block_editor_assets](https:\/\/developer.wordpress.org\/reference\/hooks\/enqueue_block_editor_assets\/)<\/code>. Dans notre fonction, nous mettons un script en file d&rsquo;attente, comme nous le ferions habituellement dans <code>wp_enqueue_scripts<\/code>hook.<\/p>\n<pre><code>add_action('enqueue_block_editor_assets', function() {\n    wp_enqueue_script('awp-gutenberg-filters', get_template_directory_uri(). '\/assets\/js\/gutenberg-filters.js', ['wp-edit-post']);\n});<\/code><\/pre>\n<p>N&rsquo;oubliez pas d&rsquo;ajuster le chemin d&rsquo;acc\u00e8s \u00e0 votre script. J&rsquo;aime ajouter &lsquo; <code>wp-edit-post<\/code>&lsquo; comme d\u00e9pendance au script pour m&rsquo;assurer qu&rsquo;il se charge suffisamment tard.<\/p>\n<p>C&rsquo;est tout le PHP que nous devons faire. Le reste est \u00e9crit dans notre fichier Javascript.<\/p>\n<h3>Ajouter des attributs personnalis\u00e9s<\/h3>\n<p>Comme dans l&rsquo;exemple ci-dessus, nous ajoutons un filtre sur <code>blocks.registerBlockType<\/code>afin d&rsquo;ajouter des \u00e9l\u00e9ments d&rsquo;objet suppl\u00e9mentaires \u00e0 l&rsquo;objet du bloc <code>attributes<\/code>.<\/p>\n<p>Lorsque vous travaillez avec, <code>withColors<\/code>nous devons ajouter deux attributs pour chaque couleur. Le nom de notre attribut de couleur d&rsquo;arri\u00e8re-plan est <code>backgroundColor<\/code>, ce qui signifie que le deuxi\u00e8me attribut doit \u00eatre nomm\u00e9 <code>customBackgroundColor<\/code>. Tout cela est expliqu\u00e9 dans <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-parametres-de-couleur-a-votre-bloc-gutenberg-personnalise\/\" title=\"mon article sur la gestion des param\u00e8tres de couleur dans Gutenberg\">mon article sur la gestion des param\u00e8tres de couleur dans Gutenberg<\/a>. Les deux doivent \u00eatre de type string et appliqu\u00e9s uniquement aux blocs de type Spacer.<\/p>\n<pre><code>function addSpacerAttributes(settings, name) {\n    if (typeof settings.attributes !== 'undefined') {\n        if (name == 'core\/spacer') {\n            settings.attributes = Object.assign(settings.attributes, {\n                backgroundColor: {\n                    type: 'string',\n                },\n                customBackgroundColor: {\n                    type: 'string'\n                }\n            });\n        }\n    }\n    return settings;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.registerBlockType',\n    'awp\/spacer-background-attribute',\n    addSpacerAttributes\n);<\/code><\/pre>\n<h3>Ajouter le panneau ColorSettings \u00e0 l&rsquo;inspecteur<\/h3>\n<p>La deuxi\u00e8me \u00e9tape consiste \u00e0 ajouter un panneau de param\u00e8tres de couleur \u00e0 l&rsquo;inspecteur pour le bloc Spacer en filtrant <code>editor.BlockEdit<\/code>.<\/p>\n<pre><code>const spacerInspectorControls = wp.compose.compose(\n    wp.blockEditor.withColors({backgroundColor: 'background-color'}),\n\u00a0\n    wp.compose.createHigherOrderComponent((BlockEdit) =&gt; {\n        return (props) =&gt; {\n\u00a0\n            if (props.name !== 'core\/spacer') {\n                return(&lt;BlockEdit {...props} \/&gt;);\n            }\n\u00a0\n            const { Fragment } = wp.element;\n            const { InspectorControls, PanelColorSettings } = wp.blockEditor;\n            const { attributes, setAttributes, isSelected } = props;\n            const { backgroundColor, setBackgroundColor } = props;\n\u00a0\n            let newClassName = (attributes.className != undefined)? attributes.className: '';\n            let newStyles = {...props.style};\n            if (backgroundColor != undefined) {\n                if (backgroundColor.class == undefined) {\n                    newStyles.backgroundColor = backgroundColor.color;\n                } else {\n                    newClassName += ' ' + backgroundColor.class;\n                }\n            }\n            const newProps = {\n                ...props,\n                attributes: {\n                    ...attributes,\n                    className: newClassName\n                },\n                style: newStyles\n            }\n\u00a0\n            return (&lt;Fragment&gt;\n                    &lt;div style={newStyles} className={newClassName}&gt;\n                        &lt;BlockEdit {...newProps} \/&gt;\n                        {isSelected &amp;&amp; (props.name == 'core\/spacer') &amp;&amp; \n                            &lt;InspectorControls&gt;\n                                &lt;PanelColorSettings \n                                    title={wp.i18n.__('Color Settings', 'awp')}\n                                    colorSettings={[\n                                        {\n                                            value: backgroundColor.color,\n                                            onChange: setBackgroundColor,\n                                            label: wp.i18n.__('Background color', 'awp')\n                                        }\n                                    ]}\n                                \/&gt;\n                            &lt;\/InspectorControls&gt;\n                        }\n                    &lt;\/div&gt;\n                &lt;\/Fragment&gt;\n            );\n        };\n}, 'spacerInspectorControls'));\n\u00a0\nwp.hooks.addFilter(\n    'editor.BlockEdit',\n    'awp\/spacer-inspector-control',\n    spacerInspectorControls\n);<\/code><\/pre>\n<p>Nous devons utiliser <code>compose<\/code>pour combiner le composant d&rsquo;ordre sup\u00e9rieur renvoy\u00e9 par ce filtre et <code>withColors<\/code>. En d&rsquo;autres termes, nous encapsulons simplement le composant renvoy\u00e9 dans <code>withColors<\/code>. En param\u00e8tre, <code>withColors<\/code>nous fournissons notre attribut <code>backgroundColor<\/code>.<\/p>\n<p>\u00c0 l&rsquo;int\u00e9rieur du composant envelopp\u00e9, nous nous assurons de toujours revenir <code>BlockEdit<\/code>(ligne <code>#9<\/code>et <code>#39<\/code>pour les blocs Spacer). Pour les blocs de type Spacer, nous nous accrochons \u00e9galement <code>InspectorControls<\/code>pour ajouter un <code>PanelColorSettings<\/code>pour notre choix de couleur. Il s&rsquo;agit de la proc\u00e9dure standard d&rsquo;ajout de param\u00e8tres de couleur.<\/p>\n<p>\u00c0 la ligne, <code>#17 - 34<\/code>nous g\u00e9n\u00e9rons manuellement la classe n\u00e9cessaire et\/ou le style en ligne. Ensuite, \u00e0 la ligne, <code>#38<\/code>nous ajoutons un div enveloppant <code>BlockEdit<\/code>avec ces classes et ces styles en ligne.<\/p>\n<p>Le r\u00e9sultat est un nouveau panneau de param\u00e8tres de couleur dans l&rsquo;inspecteur pour les blocs Spacer, enti\u00e8rement fonctionnel.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7041a66b.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-152421-61e4d7041a66b.png\" alt=\"Ajouter des param\u00e8tres personnalis\u00e9s aux blocs WordPress Gutenberg existants\"><\/a><\/p>\n<p>Le choix d&rsquo;une couleur de palette ou d&rsquo;une couleur personnalis\u00e9e sera en effet affect\u00e9 dans la div d&rsquo;habillage \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;\u00e9diteur. Mais vous ne pouvez le voir que lorsque vous d\u00e9s\u00e9lectionnez le bloc Spacer\u00a0!<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152421-61e4d7052e0c9.gif\" 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-152421-61e4d7052e0c9.gif\" alt=\"Ajouter des param\u00e8tres personnalis\u00e9s aux blocs WordPress Gutenberg existants\"><\/a><\/p>\n<p>Cela se produit parce que WordPress applique son propre style lors de la s\u00e9lection d&rsquo;un bloc d&rsquo;espacement. Nous le corrigerons \u00e0 la fin, nous avons d&rsquo;abord juste besoin d&rsquo;appliquer la m\u00eame classe et\/ou le m\u00eame style en ligne dans le frontend.<\/p>\n<h3>Ajoutez une classe personnalis\u00e9e et un style en ligne pour enregistrer<\/h3>\n<p>Enfin, nous devons filtrer <code>blocks.getSaveContent.extraProps<\/code>et appliquer la classe n\u00e9cessaire et\/ou le style en ligne pour le frontend. Encore une fois, cela est tr\u00e8s similaire \u00e0 ce que nous avons fait dans l&rsquo;exemple 1 ci-dessus. Si une couleur de palette a \u00e9t\u00e9 choisie, nous devons ajouter un nom de classe qui suit les normes de WordPress pour les param\u00e8tres de couleur (&quot; <code>has-&lt;PALETTESLUG&gt;-background-color<\/code>&quot;). Si une couleur personnalis\u00e9e a \u00e9t\u00e9 choisie, nous devons ajouter un style en ligne avec la couleur hexad\u00e9cimale.<\/p>\n<p>Remarque\u00a0: Si vous devez beaucoup g\u00e9rer les noms de classe, je vous recommande d&rsquo;importer la <code>classnames<\/code>biblioth\u00e8que. Ceci est fortement utilis\u00e9 dans Gutenberg car cela simplifie consid\u00e9rablement la d\u00e9finition des noms de classe appropri\u00e9s. Le code ci-dessous suppose que vous ne l&rsquo;avez pas fait et compose le nom de la classe manuellement.<\/p>\n<pre><code>function applySpacerBackground(props, blockType, attributes) {\n    if (blockType.name == 'core\/spacer') {\n        const { backgroundColor, customBackgroundColor } = attributes;\n\u00a0\n        \/\/ For improved class name handling, use classnames library. Or do it manually like..\n        let className = (props.className != undefined)? props.className: '';\n        if (backgroundColor != undefined) {\n            className += ' has-' + backgroundColor + '-background-color';\n        }\n        props.className = className;\n        if (customBackgroundColor != undefined) {\n            Object.assign(props, { style: { ...props.style, backgroundColor: customBackgroundColor }});\n        }\n    }\n    return props;\n}\n\u00a0\nwp.hooks.addFilter(\n    'blocks.getSaveContent.extraProps',\n    'awp\/spacer-apply-class',\n    applySpacerBackground\n);<\/code><\/pre>\n<p>Avec le code ci-dessus, l&rsquo;interface rendra d\u00e9sormais parfaitement les blocs Spacer avec notre choix de couleur personnalis\u00e9\u00a0!<\/p>\n<p>Le correctif final (facultatif) consiste \u00e0 ajouter du CSS \u00e0 l&rsquo;\u00e9diteur. Vous devrez soit ajouter du CSS en ligne, soit une feuille de style d&rsquo;\u00e9diteur. Par exemple, vous pouvez mettre en file d&rsquo;attente une feuille de style dans le m\u00eame crochet PHP que nous avons utilis\u00e9 pour mettre en file d&rsquo;attente notre fichier Javascript. Je n&rsquo;entrerai pas dans les d\u00e9tails sur la fa\u00e7on de proc\u00e9der; mais le CSS dont vous aurez besoin est quelque chose comme ci-dessous. Tout ce qu&rsquo;il fait est de d\u00e9finir l&rsquo;espaceur <code>background-color<\/code>sur la couleur h\u00e9rit\u00e9e (il h\u00e9ritera de notre div d&#8217;emballage) lorsque le bloc est s\u00e9lectionn\u00e9\u00a0:<\/p>\n<pre><code>.block-library-spacer__resize-container.is-selected { \n    background-color: inherit; \n}<\/code><\/pre>\n<p>PS: Gardez \u00e0 l&rsquo;esprit que cela est susceptible de changer \u00e0 l&rsquo;avenir. Gutenberg est toujours en pleine \u00e9volution.<\/p>\n<h2>Conclusion<\/h2>\n<p>Dans cet article, nous avons appris deux m\u00e9thodes pour impl\u00e9menter des param\u00e8tres personnalis\u00e9s dans les blocs WordPress Gutenberg existants. C&rsquo;est tout \u00e0 fait possible pour des param\u00e8tres simples qui ne n\u00e9cessitent peut-\u00eatre qu&rsquo;une classe ou un style en ligne. Nous avons examin\u00e9 les mises en garde, qui, je l&rsquo;esp\u00e8re, seront corrig\u00e9es dans les versions ult\u00e9rieures de Gutenberg\u00a0!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article, nous expliquerons en d\u00e9tail comment ajouter vos param\u00e8tres personnalis\u00e9s aux blocs Gutenberg de WordPress existants avec deux exemples de code de cas d&rsquo;utilisation r\u00e9els.<\/p>\n","protected":false},"author":1,"featured_media":152422,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,717,717,832,936,936,1110,832,841,841,862,862],"tags":[1167],"class_list":["post-234246","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-gutenberg-3","category-n-a","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234246","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=234246"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234246\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/152422"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}