Cet article expliquera en profondeur comment ajouter des paramètres de couleur à votre bloc WordPress Gutenberg personnalisé. Nous apprendrons comment ajouter le même composant de paramètres de couleur, qui permet de choisir parmi les couleurs de la palette et la couleur personnalisée, comme de nombreux blocs par défaut de WordPress l’utilisent.
Voici ce que nous allons ajouter à notre bloc personnalisé :
En utilisant les composants de Gutenberg, nous pouvons très facilement implémenter cette palette/section de couleurs dans notre propre bloc personnalisé. Vous pouvez définir les paramètres de couleur pour affecter la couleur de votre choix ; arrière-plan, couleur de texte, couleur de bordure ou quoi que ce soit d’autre. Vous pouvez également ajouter autant de paramètres de couleur que vous le souhaitez dans ce panneau.
Avant de plonger dans le code, il y a certaines choses dont vous devez être conscient. Ne passez pas directement au code car la section suivante expliquera en grande partie pourquoi le code doit le faire comme il le fait.
Ce que vous devez savoir en premier
Les composants pour implémenter les paramètres de palette/couleur sont PanelColorSettings
et withColors
du wp.blockEditor
package. Le composant withColors
est un soi-disant composant d’ordre supérieur et doit être implémenté un peu différemment de la simple sortie d’un composant normal. J’entrerai dans un peu plus de détails plus tard. Mais nous devons d’abord connaître les bases de la façon dont Gutenberg gère les paramètres de couleur de bloc.
Comment les blocs Gutenberg gèrent les paramètres de couleur
Il existe certaines règles sur la façon dont Gutenberg gère les paramètres de couleur dans les blocs. Si vous avez déjà créé un thème pris en charge par Gutenberg, vous connaissez probablement déjà ces règles. Nous allons néanmoins les parcourir rapidement car nous devons gérer cela dans notre code de bloc.
- Lorsqu’une couleur de palette est choisie, l’élément de bloc de nœud obtiendra une classe d’un certain motif. La classe commence par "
has-
", puis le slug de la palette vient après. La fin dépend de l’élément que la couleur doit affecter. Pour la couleur du texte, il se termine par "-color
". Pour la couleur d’arrière-plan, il se termine par "-background-color
". Par exemple, un bloc avec une palette de couleur "rouge" choisie comme couleur d’arrière-plan obtiendra la classe "has-red-background-color
". - Lorsqu’une couleur personnalisée est choisie (à partir du sélecteur de couleurs), l’élément de bloc de nœud obtiendra un style en ligne avec le code hexadécimal. Par exemple, une couleur personnalisée #DD0000 choisie pour la couleur de fond recevra l’attribut "
style="background-color: #DD0000;
".
Lorsque nous implémenterons les paramètres de couleur pour notre bloc, nous devrons implémenter la classe et le style en ligne corrects. Nous le ferons à la fin de ce tutoriel.
Comment travailler avecwithColors
Comme mentionné précédemment, il withColors
s’agit d’un composant d’ordre supérieur. Cela signifie essentiellement que c’est un composant qui prend un composant et renvoie un nouveau composant. Dans le composant renvoyé, nous obtenons des accessoires utiles du composant d’ordre supérieur. Pour faire simple, nous utiliserons withColors
pour retourner notre propre composant pour notre bloc personnalisé. Notre composant de bloc obtient les accessoires nécessaires pour travailler avec les couleurs de withColors
.
Le composant withColors
gère l’état et de nombreuses fonctionnalités pour travailler avec les couleurs. Et nous obtenons beaucoup d’automatisation dans ce processus. C’est très pratique pour déterminer si la couleur choisie est une couleur de palette (nous devons ajouter une classe) ou une couleur personnalisée (nous devons ajouter un style en ligne). withColors
simplifier une grande partie du processus de stockage de la couleur choisie, quelle qu’elle soit, dans les attributs de notre bloc. En parlant d’attributs..
Attributs etwithColors
Évidemment, votre bloc a besoin d’attributs pour stocker la couleur choisie. Afin de bénéficier de l’automatisation de withColor pour stocker la couleur correcte, vous devez en fait définir deux attributs pour chaque paramètre de couleur. Un pour stocker le slug de la palette de couleurs et un autre pour stocker le code hexadécimal. Il y a quand même quelques règles.
Supposons que vous souhaitiez ajouter un paramètre de couleur pour la couleur du texte du bloc – vous décidez donc de définir un attribut bien nommé " textColor
". Vous devrez alors définir un autre attribut dans le pattern «customYourOriginalAttribute
». Dans cet exemple, le deuxième attribut devra être nommé " customTextColor
". Attention au camelCase (majuscule) ici. Suivre ce modèle withColors
entraînera automatiquement :
- Si une couleur de palette a été choisie, l’attribut «
textColor
» contiendra le slug de la palette. - Si une couleur personnalisée a été choisie, "
customTextColor
" sera rempli avec le code hexadécimal.
Ces deux-là travaillent en tandem. Si une couleur personnalisée est choisie, textColor
sera automatiquement undefined
, et vice versa.
Et enfin, une dernière chose à retenir: vous n’aurez pas besoin d’utiliser setAttributes()
pour mettre à jour vos attributs de couleur! Les accessoires fournis par withColors
incluent une fonction qui met automatiquement à jour vos attributs pour vous. Tout ce que vous avez à faire est de passer cette fonction à l’ onChange
événement au PanelColorSettings
composant, et vos attributs seront automatiquement mis à jour.
Ok, il est temps de voir tout cela en pratique !
Implémentation des paramètres de couleur dans un bloc personnalisé
Pour commencer, j’ai un bloc personnalisé assez inutile qui ne fait rien d’autre que d’afficher un texte codé en dur. Cela facilite simplement la séparation de ce que nous devons coder pour ajouter des paramètres de couleur. J’ai une série de tutoriels sur la façon de créer vos propres blocs personnalisés si vous souhaitez en savoir plus.
Remarque : J’écris tout le code dans ES6/ESNext. Cela inclut les fonctions fléchées qui nécessitent une attention particulière dans votre configuration Babel/webpack. Si vous obtenez des erreurs sur certains des codes ci-dessous, suivez mon guide sur la façon de configurer Webpack et Babel pour ES6/ESNext ou ajustez le code pour ne pas utiliser de "syntaxes expérimentales".
Ceci est mon bloc personnalisé de base avant de faire quoi que ce soit avec les paramètres de couleur :
C’est assez basique. Notez que la edit
fonction fait simplement référence à un composant séparé, BlockWithColorSettings
, au lieu de l’écrire en ligne. Cela facilite la mise en œuvre withColors
ultérieure.
D’accord, il est temps d’implémenter les paramètres de couleur dans notre bloc ! Par exemple, je veux configurer la couleur du texte.
Ajout d’attributs
Comme mentionné précédemment, nous devons définir deux attributs pour chaque paramètre de couleur. Et nous devons faire très attention à leur dénomination. Je souhaite ajouter un attribut de couleur de texte, je nomme donc l’attribut textColor
. Ce qui signifie que je vais également ajouter un attribut customTextColor
. Les deux doivent être de type chaîne.
Nos attributs sont prêts à stocker le paramètre de couleur du texte du bloc. Il est maintenant temps de mettre en œuvre withColors
et PanelColorSettings
.
ExécutionwithColors
Comme mentionné précédemment withColors
, il s’agit d’un composant d’ordre supérieur qui devrait prendre un composant à retourner. Nous voulons évidemment qu’il renvoie notre composant d’édition, BlockWithColorSettings
. Mais comme paramètre, withColors
nous fournissons un objet.
Dans l’objet passé à, withColors
nous devons indiquer withColors
quel attribut nous voulons utiliser pour stocker la couleur et quel type d’élément il colorera (dans notre cas, la couleur du texte, qui signifie la règle CSS "couleur"). L’information sur la règle CSS permet de s’assurer que les noms de classe renvoyés sont corrects. Comme il s’agit de la couleur du texte, nous voulons des noms de classe tels que "a–couleur".
D’abord quelques déstructurations en haut. withColors
réside dans le wp.blockEditor
package.
const { withColors } = wp.blockEditor;
Nous allons changer la edit
fonction en :
Avec ce code, notre composant BlockWithColorSettings
recevra quelques accessoires supplémentaires :
props.textColor
: Est un objet qui se compose de toutes les informations sur la couleur choisie. Si une couleur de palette a été choisie, elle stockera les propriétés du code hexadécimal, du slug de palette, du nom de la classe, etc. Si une couleur personnalisée a été choisie, l’objet contiendra le code hexadécimal. Le code hexadécimal se trouve toujours dans la propriétécolor
. Et le nom de la classe (uniquement si une couleur de palette a été choisie) sera défini dans la propriétéclass
.props.setTextColor
: Une fonction qui mettra à jour nos attributs pour nous. Nous le fournissons pour l’événement des paramètres de couleuronChange
comme nous le verrons plus tard. La fonction mettra à jour les attributstextColor
et.customTextColor
Parce que nous avons suivi les règles de dénomination, il sera automatiquement mis à jourcustomTextColor
même si nous n’avons jamais fourni ce nom d’attribut.
Notez que la fonction "set" fournie comme accessoire suivra la règle : " setYourAttributeName
". Parce que nous avons fourni textColor
, la fonction est nommée setTextColor
. Si nous nommions plutôt notre attribut awesomeColor
et le fournissions dans l’ withColors
objet, la fonction set serait nommée setAwesomeColor()
.
ExécutionPanelColorSettings
La prochaine étape consiste à implémenter la section Inspecteur proprement dite. Pour ce faire, nous ajoutons PanelColorSettings
à l’intérieur d’un InspectorControls
composant. Parce que React exige que tout soit à l’intérieur d’un nœud racine, nous utilisons également Fragment
(from wp.elements
) pour tout envelopper à l’intérieur.
D’abord quelques déstructurations en haut du fichier :
const { Fragment } = wp.element;
const { InspectorControls, PanelColorSettings, withColors } = wp.blockEditor;
Et nous mettons à jour notre BlockWithColorSettings
composant en quelque chose comme ceci :
Comme vous pouvez le voir en ligne, #2
nous déstructurons les accessoires reçus de withColors
, textColor
et setTextColor
. Gardez à l’esprit que props.textColor
c’est l’objet reçu de withColors
, et props.attributes.textColor
c’est l’attribut. Nous n’avons cependant pas besoin de nous référer à l’attribut.
En tant qu’accessoires du composant, PanelColorSettings
nous pouvons fournir un titre pour la section (titre dans la boîte réductible dans l’inspecteur). La chose importante ici est l’accessoire colorSettings
où nous devons fournir un tableau d’objets de réglage de couleur. Pour chaque paramètre de couleur (nous n’en avons actuellement qu’un), nous devons fournir certaines propriétés. La propriété value
attend le code hexadécimal actuellement choisi (même si une couleur de palette a été choisie). Ceci nous est fourni dans l’ textColor
accessoire, à l’intérieur de la propriété color
. Pour la onChange
propriété, nous fournissons simplement la fonction "set" fournie par withColors
, setTextColor
. Et enfin, nous devrions donner un label
afin que l’utilisateur sache quel élément cette couleur affectera. Il apparaîtra juste au-dessus de la zone de choix d’une couleur.
Voici comment notre composant apparaît actuellement dans l’éditeur Gutenberg :
Il met maintenant à jour avec succès nos attributs lors du choix des couleurs. Vous pouvez voir qu’il se souvient de votre choix de couleur lors de l’enregistrement du message.
Cependant, rien ne se passe visuellement lorsque vous changez de couleur. Le choix de couleur est stocké dans les attributs, mais aucun changement de couleur ne se produit dans l’éditeur, ni lors de la prévisualisation de la publication. C’est parce que nous devons ajouter du code pour les classes et les styles du bloc. Nous devons le faire à la fois pour la edit
fonction (qui est pour l’éditeur) et save
la fonction (frontend). C’est la prochaine étape.
Gestion des styles de classe et en ligne dansedit
Nous devons créer les attributs de classe et de style de nœud du bloc en fonction du paramètre de couleur choisi. Heureusement, withColors
nous obtenons une certaine automatisation dans ce domaine. N’oubliez pas qu’il props.textColor
s’agit d’un objet qui contient toutes les informations dont nous avons besoin, y compris le nom de la classe.
Nous pourrions faire quelque chose comme ceci :
À la ligne, #20
nous appliquons la classe critique et le style en ligne au nœud racine de notre bloc. Avant cela, nous construisons la classe et l’attribut de style en ligne en vérifiant l’ props.textColor
objet.
Après ce changement, votre bloc personnalisé devrait maintenant être entièrement fonctionnel dans l’éditeur. Chaque fois que vous changez de couleur, le bloc change la couleur du texte. Impressionnant! La dernière étape consiste à le faire save
également pour la fonction, afin que nous obtenions également ces classes et ces styles dans le frontend.
Gestion des styles de classe et en ligne danssave
Le concept de construction des styles de classe et en ligne et de leur application au nœud racine est le même dans save
que dans edit
. Mais il y a une différence cruciale. Dans save
nous n’avons pas les accessoires fournis par withColors
. Et nous ne pouvons pas ajouter de composants d’ordre supérieur à la save
fonction. Ainsi, dans la save
fonction, toutes les informations dont nous disposons sont les attributs.
C’est une bonne règle d’or d’éviter de coder en dur les noms de classe "has-". Et si WordPress décidait de changer cette règle à l’avenir? Heureusement, nous avons une fonction qui peut nous aider à générer les bons noms de classe pour nous: getColorClassName()
.
Avant d’oublier, déstructurons-le. C’est aussi dans le wp.blockEditor
paquet.
const { InspectorControls, PanelColorSettings, withColors, getColorClassName } = wp.blockEditor;
L’utilisation de la getColorClassName()
fonction nécessite deux paramètres. D’abord une chaîne pour la règle CSS. Étant donné que notre paramètre de couleur concerne la couleur du texte, nous fournissons ‘ color
‘. Cela indique à la fonction qu’elle doit renvoyer un nom de classe "a-quelque chose-couleur" et non "a-quelque chose-couleur-arrière-plan" par exemple. Comme deuxième paramètre, nous devons fournir la valeur de l’attribut.
L’attribut style est simplement construit en définissant «color» sur la valeur de l’attribut customTextColor
, s’il est défini.
Et bien sûr, n’oubliez pas d’appliquer la classe et le style sur le nœud racine de votre bloc ; comme en ligne #12
.
PS: Si vous testez votre bloc dans l’éditeur en écrivant ce code, vous obtiendrez maintenant une erreur de bloc. Cela se produit parce que nous avons maintenant modifié la sortie de la save
fonction et que tout ce que vous avez enregistré précédemment est en conflit. Vous devrez supprimer le bloc et le rajouter à nouveau.
Après ce changement, votre bloc devrait maintenant appliquer correctement la couleur de texte choisie dans le frontend également.
Et c’est tout! Vous avez maintenant implémenté avec succès les paramètres de couleur dans votre bloc. Si vous souhaitez ajouter plusieurs paramètres de couleur (pas seulement la couleur du texte), lisez la suite.
Remarque sur les paramètres de couleurs multiples
À présent, vous devriez être en mesure d’implémenter plusieurs paramètres de couleur. Vous voudrez peut-être ajouter des paramètres pour la couleur d’arrière-plan, la couleur du texte, la couleur de la bordure ou quoi que ce soit d’autre pour votre bloc. Dans cette section, je vais faire un bref aperçu de ce que nous devons faire pour implémenter plusieurs paramètres de couleur.
Supposons que je souhaite également ajouter une couleur d’arrière-plan à mon bloc.
Je dois d’abord définir un nouvel attribut nommé de manière créative backgroundColor
. Je définis également un autre attribut customBackgroundColor
.
Dans la edit
fonction, je change l’objet fourni en withColors
tant que tel:
withColors({textColor: 'color', backgroundColor: 'background-color'})
Cela indique withColors
que mon textColor
attribut est pour la règle CSS " color
" (pour la couleur du texte), et l’attribut backgroundColor
est pour la règle CSS " background-color
". withColors
reconnaîtra et mettra également à jour automatiquement les attributs et customTextColor
.customBackgroundColor
Dans le PanelColorSettings
composant, je fournis un autre objet au tableau au prop colorSettings
. Ainsi:
Avec cela, vous devriez obtenir deux paramètres de couleur distincts dans la zone Inspecteur pour les paramètres de couleur.
La dernière étape consiste à créer les noms et les styles de classe appropriés dans edit
et save
. Il s’agit d’une étape assez simple car il s’agit simplement de créer correctement une chaîne ou un objet de style. N’oubliez pas que votre nom de classe doit prendre en charge plusieurs classes de couleurs (par exemple, si la couleur du texte et la couleur d’arrière-plan ont été choisies). Ajoutez simplement un espace entre chaque nom de classe.
PS : si vous devez gérer de nombreux noms de classe pour votre bloc, vous pourriez bénéficier de l’installation du classnames
package. Presque tous les composants de Gutenberg utilisent cette bibliothèque pour combiner plus facilement les noms de classe.
Conclusion et code complet
Vous devriez maintenant avoir appris à implémenter les paramètres de couleur dans votre bloc personnalisé. J’espère que cela vous a été utile! J’ai dû ajouter cette fonctionnalité à mon projet, et je n’ai vraiment trouvé aucune information ou bonne documentation. C’est donc le résultat de la consolidation de tout ce que j’ai appris sur ce sujet, après de nombreux essais et erreurs.
Voici le code final, au total, pour l’exemple de bloc personnalisé avec réglage de la couleur du texte :