{"id":49143,"date":"2021-10-21T10:07:54","date_gmt":"2021-10-21T08:07:54","guid":{"rendered":"https:\/\/kinqsta.com\/?p=105115"},"modified":"2025-09-09T11:29:04","modified_gmt":"2025-09-09T10:29:04","slug":"blocs-gutenberg","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/","title":{"rendered":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs"},"content":{"rendered":"<p>De nombreuses personnes se plaignent des obstacles \u00e0 surmonter pour se lancer dans la construction de blocs et d&rsquo;applications Gutenberg. La courbe d&rsquo;apprentissage est raide, principalement en raison de la difficult\u00e9 d&rsquo;installer et de configurer l&rsquo;environnement de d\u00e9veloppement. En outre, une solide connaissance de JavaScript, Node.js, React et Redux sont des ingr\u00e9dients indispensables pour cette recette assez complexe.<\/p>\n<p>Le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">manuel officiel de l&rsquo;\u00e9diteur de blocs de WordPress<\/a> fournit aux d\u00e9veloppeurs une quantit\u00e9 consid\u00e9rable d&rsquo;informations, mais vous risquez de vous perdre dans cette mer de d\u00e9tails.<\/p>\n<p>Et il convient de mentionner ce que Mat\u00edas Ventura, architecte principal du projet Gutenberg, a rapport\u00e9 dans <a href=\"https:\/\/wptavern.com\/a-discussion-with-gutenberg-project-lead-matias-ventura-on-the-barrier-to-entry\">son entretien avec WP Tavern<\/a> :<\/p>\n<blockquote><p><em>Bien que certaines personnes puissent l&rsquo;apprendre rapidement, c&rsquo;est toujours un obstacle important pour les gens. Je pense qu&rsquo;il y a plusieurs niveaux \u00e0 cela ; la documentation pourrait \u00eatre am\u00e9lior\u00e9e d&rsquo;un ordre de grandeur \u00e0 la fois dans l&rsquo;organisation et la pr\u00e9sentation. J&rsquo;esp\u00e8re que nous pourrons faire beaucoup plus dans ce domaine.<\/em><\/p><\/blockquote>\n<p>Dans cette optique, nous avons d\u00e9cid\u00e9 de fournir un tutoriel \u00e9tape par \u00e9tape visant \u00e0 aider nos lecteurs \u00e0 se lancer dans le d\u00e9veloppement de blocs Gutenberg.<\/p>\n<p>Cela vous semble int\u00e9ressant ? Plongeons-y !<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Conditions pr\u00e9alables au d\u00e9veloppement de bloc Gutenberg<\/h2>\n<p>Pour ce tutoriel, les seules comp\u00e9tences requises sont une bonne connaissance du d\u00e9veloppement d&rsquo;extensions WordPress et au moins une <a href=\"https:\/\/kinqsta.com\/fr\/blog\/meilleures-pratiques-html\/\">compr\u00e9hension basique de HTML<\/a>, CSS, JavaScript et React.<\/p>\n<p>S&rsquo;agira-t-il d&rsquo;un projet ambitieux ? Bien s\u00fbr qu&rsquo;il le sera !<\/p>\n<p>Il n&rsquo;a pas \u00e9t\u00e9 facile de trouver le bon compromis entre exhaustivit\u00e9 et simplicit\u00e9, ni de d\u00e9cider des sujets \u00e0 inclure et de ceux \u00e0 laisser de c\u00f4t\u00e9.<\/p>\n<p>Esp\u00e9rons que les lecteurs interm\u00e9diaires et avanc\u00e9s nous pardonneront de ne pas approfondir certains concepts tels que <a href=\"https:\/\/reactjs.org\/docs\/state-and-lifecycle.html\">React state<\/a>, <a href=\"https:\/\/redux.js.org\/api\/store\">Redux store<\/a>, les <a href=\"https:\/\/reactjs.org\/docs\/higher-order-components.html\">composants d&rsquo;ordre \u00e9lev\u00e9<\/a>, etc. Ces sujets n\u00e9cessitent un espace et une attention suppl\u00e9mentaires et sont probablement trop avanc\u00e9s pour le d\u00e9veloppement de blocs par des d\u00e9butants (\u00e0 moins que vous ne soyez un d\u00e9veloppeur React).<\/p>\n<p>Pour la m\u00eame raison, nous ne couvrirons pas certains des sujets les plus avanc\u00e9s li\u00e9s au d\u00e9veloppement des blocs Gutenberg, tels que les <a href=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-dynamiques-gutenberg\/\">blocs dynamiques<\/a> et les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">bo\u00eetes m\u00e9ta<\/a>.<\/p>\n<p>Gr\u00e2ce aux connaissances que vous aurez acquises \u00e0 la fin de cet article, vous pourrez commencer d\u00e8s maintenant \u00e0 vous amuser et \u00e0 \u00eatre productif.<\/p>\n<p>Une fois que vous aurez commenc\u00e9 \u00e0 construire des blocs, vous serez en mesure d&rsquo;am\u00e9liorer vos comp\u00e9tences et de construire vous-m\u00eame des blocs Gutenberg encore plus avanc\u00e9s.<\/p>\n\n<h2>Qu&rsquo;est-ce qu&rsquo;un bloc Gutenberg ?<\/h2>\n<p>Depuis sa premi\u00e8re sortie en d\u00e9cembre 2018, <a href=\"https:\/\/kinqsta.com\/fr\/blog\/editeur-wordpress-gutenberg\/\">l&rsquo;\u00e9diteur de blocs a \u00e9t\u00e9<\/a> grandement am\u00e9lior\u00e9 sur tous les plans : des <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/\">API plus puissantes<\/a>, une interface utilisateur plus avanc\u00e9e, une utilisibalit\u00e9 am\u00e9lior\u00e9e, une tonne de nouveaux blocs, les <a href=\"https:\/\/kinqsta.com\/fr\/blog\/wordpress-5-8\/#full-site-editing-features-in-wordpress-58\">premi\u00e8res impl\u00e9mentations de Full Site Editing<\/a>, et bien plus encore.<\/p>\n<p>En bref, m\u00eame si Gutenberg est encore en plein d\u00e9veloppement, il a parcouru un long chemin &#8211; et aujourd&rsquo;hui, l&rsquo;\u00e9diteur de blocs est un candidat \u00e0 part enti\u00e8re en tant que constructeur de pages et de sites fiable et fonctionnel.<\/p>\n<p>Du point de vue du d\u00e9veloppeur, Gutenberg est une <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\">application mono-page<\/a> (Single Page Application ou SPA) bas\u00e9e sur React qui permet aux utilisateurs de WordPress de cr\u00e9er, modifier et supprimer du contenu dans WordPress. Cependant, cela ne doit pas vous faire penser \u00e0 une version am\u00e9lior\u00e9e de <a href=\"https:\/\/kinqsta.com\/fr\/blog\/editeur-wordpress-tinymce\/\">l&rsquo;\u00e9diteur de contenu traditionnel<\/a>.<\/p>\n<p>Nous voulons que cela soit clair :<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-plain\">\n        <p><strong>Gutenberg <em>n&rsquo;est pas <\/em>un \u00e9diteur WYSIWYG ordinaire. Au contraire, il red\u00e9finit l&rsquo;ensemble de l&rsquo;exp\u00e9rience d&rsquo;\u00e9dition de WordPress. <\/strong><\/p>\n<\/aside>\n\n<p>Dans Gutenberg, le contenu est divis\u00e9 en blocs, qui sont des \u00ab briques \u00bb que les utilisateurs peuvent utiliser pour cr\u00e9er des articles et des pages ou leurs sites web.<\/p>\n<p>Mais techniquement, qu&rsquo;est-ce qu&rsquo;un bloc ?<\/p>\n<p>Nous aimons la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-blocks\/\">d\u00e9finition de WordPress<\/a> :<\/p>\n<blockquote><p><em>\u00ab Bloc \u00bb est le terme abstrait utilis\u00e9 pour d\u00e9crire les unit\u00e9s de balisage qui, compos\u00e9es ensemble, forment le contenu ou la mise en page d&rsquo;une page web. L&rsquo;id\u00e9e combine les concepts de ce que nous r\u00e9alisons aujourd&rsquo;hui dans WordPress avec les codes courts, le HTML personnalis\u00e9 et la d\u00e9couverte d&rsquo;int\u00e9gration dans une API et une exp\u00e9rience utilisateur uniques et coh\u00e9rentes.<\/em><\/p><\/blockquote>\n<p>Les titres, paragraphes, colonnes, images, galeries et tous les \u00e9l\u00e9ments qui composent l&rsquo;interface de l&rsquo;\u00e9diteur, des panneaux de la colonne lat\u00e9rale aux commandes de la barre d&rsquo;outils du bloc, sont des composants React.<\/p>\n<p>Alors, que sont les composants React ? W3Schools fournit la <a href=\"https:\/\/www.w3schools.com\/react\/react_components.asp\">d\u00e9finition suivante<\/a> :<\/p>\n<blockquote><p><em>Les composants sont des morceaux de code ind\u00e9pendants et r\u00e9utilisables. Ils servent le m\u00eame objectif que les fonctions JavaScript, mais fonctionnent de mani\u00e8re isol\u00e9e et renvoient du HTML via une fonction <code>render()<\/code> .<\/em><\/p><\/blockquote>\n<figure id=\"attachment_105117\" aria-describedby=\"caption-attachment-105117\" style=\"width: 2874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105117 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/working-with-blocks.jpg\" alt=\"Travailler avec les blocs Gutenberg dans WordPress 5.8.\" width=\"2874\" height=\"1344\"><figcaption id=\"caption-attachment-105117\" class=\"wp-caption-text\">Travailler avec les blocs Gutenberg dans WordPress 5.8.<\/figcaption><\/figure>\n<p>Alors que l&rsquo;exp\u00e9rience d&rsquo;\u00e9dition d\u00e9livr\u00e9e par Gutenberg est nouvelle par rapport \u00e0 l&rsquo;\u00e9diteur classique de WordPress, la fa\u00e7on dont WordPress stocke vos morceaux de contenu dans la base de donn\u00e9es ne change pas du tout. C&rsquo;est parce que Gutenberg est une application qui fonctionne au sein de WordPress, mais qui ne change pas la fa\u00e7on dont le CMS fonctionne en son c\u0153ur.<\/p>\n<p>Les publications (et cela inclut les articles, les pages et les types de publication personnalis\u00e9s) cr\u00e9\u00e9es avec Gutenberg sont toujours stock\u00e9es dans la table <code>wp_posts<\/code>, exactement comme avec l&rsquo;\u00e9diteur classique.<\/p>\n<p>Mais dans un article cr\u00e9\u00e9 avec Gutenberg, vous trouverez des informations suppl\u00e9mentaires dans le tableau qui repr\u00e9sentent une diff\u00e9rence fondamentale entre les publications cr\u00e9\u00e9es via l&rsquo;\u00e9diteur classique et Gutenberg.<\/p>\n<p>Ces \u00e9l\u00e9ments d&rsquo;information ressemblent \u00e0 des commentaires HTML, et ils ont une fonction sp\u00e9cifique : d\u00e9limiter des blocs :<\/p>\n<figure id=\"attachment_105118\" aria-describedby=\"caption-attachment-105118\" style=\"width: 1522px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105118 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/code-editor-view.jpg\" alt=\"Un article de blog vu dans l'\u00e9diteur de code.\" width=\"1522\" height=\"1054\"><figcaption id=\"caption-attachment-105118\" class=\"wp-caption-text\">Un article de blog vu dans l&rsquo;\u00e9diteur de code.<\/figcaption><\/figure>\n<p>Les <strong>d\u00e9limiteurs de bloc <\/strong>indiquent \u00e0 WordPress quel bloc doit \u00eatre rendu \u00e0 l&rsquo;\u00e9cran. Ils fournissent \u00e9galement des valeurs pour les propri\u00e9t\u00e9s du bloc dans un objet JSON. Ces propri\u00e9t\u00e9s d\u00e9terminent la mani\u00e8re dont le bloc doit \u00eatre rendu \u00e0 l&rsquo;\u00e9cran :<\/p>\n<figure id=\"attachment_105119\" aria-describedby=\"caption-attachment-105119\" style=\"width: 1630px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105119 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/post-content.jpg\" alt=\"Un article de blog stock\u00e9 dans la table wp_posts.\" width=\"1630\" height=\"1036\"><figcaption id=\"caption-attachment-105119\" class=\"wp-caption-text\">Un article de blog stock\u00e9 dans la table <code>wp_posts<\/code>.<\/figcaption><\/figure>\n<h2>Configuration de votre environnement de d\u00e9veloppement WordPress<\/h2>\n<p>La mise en place d&rsquo;un environnement de d\u00e9veloppement JavaScript moderne n\u00e9cessite une solide connaissance des technologies avanc\u00e9es telles que <a href=\"https:\/\/webpack.js.org\/\">Webpack<\/a>, <a href=\"https:\/\/reactjs.org\/\">React<\/a> et <a href=\"https:\/\/facebook.github.io\/jsx\/\">JSX<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/index.html\">Babel<\/a>, <a href=\"https:\/\/eslint.org\/\">ESLint<\/a>, etc.<\/p>\n<p>Intimid\u00e9 ? Ne le soyez pas ! La communaut\u00e9 WordPress est d\u00e9j\u00e0 venue \u00e0 la rescousse en fournissant des outils puissants qui vous permettent d&rsquo;\u00e9viter un processus de configuration manuelle fastidieux.<\/p>\n<p>Pour garder les choses simples, nous ne couvrirons pas la <a href=\"https:\/\/kinqsta.com\/fr\/blog\/transpiler-php\/\">transpilation<\/a> dans cet article (avec laquelle nous vous recommandons n\u00e9anmoins de vous familiariser une fois que vous aurez appris les bases du d\u00e9veloppement par blocs). Au lieu de cela, nous allons pr\u00e9senter deux outils alternatifs que vous pouvez utiliser pour mettre en place rapidement et facilement un environnement de d\u00e9veloppement JavaScript moderne en quelques minutes. C&rsquo;est \u00e0 vous de choisir celui qui vous convient le mieux pour votre projet.<\/p>\n<p>La mise en place d&rsquo;un environnement de d\u00e9veloppement JavaScript pour construire des blocs Gutenberg est un processus en trois \u00e9tapes :<\/p>\n<ol>\n<li><a href=\"#node-npm\">Installer Node.js et npm<\/a><\/li>\n<li><a href=\"#dev-environment\">Configurer l&rsquo;environnement de d\u00e9veloppement<\/a><\/li>\n<li><a href=\"#block-plugin\">Configurer l&rsquo;extension de bloc<\/a><\/li>\n<\/ol>\n<p>Commen\u00e7ons.<\/p>\n<h3 id=\"node-npm\">1. Installer Node.js et npm<\/h3>\n<p>Avant d&rsquo;installer votre environnement de d\u00e9veloppement et d&rsquo;enregistrer votre premier bloc, vous devrez installer <a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-ce-que-node-js\/\">Node.js<\/a> et le gestionnaire de paquets Node (npm).<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> est un moteur d&rsquo;ex\u00e9cution JavaScript construit sur le moteur JavaScript V8 de Chrome. <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>, commun\u00e9ment appel\u00e9 le gestionnaire de paquets Node, est consid\u00e9r\u00e9 comme \u00ab le plus grand registre de logiciels du monde \u00bb<\/p>\n<\/aside>\n\n<p>Vous pouvez <a href=\"https:\/\/kinqsta.com\/fr\/blog\/comment-installer-node-js\/\">installer Node.js et npm<\/a> de <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-node-js-and-npm\">plusieurs fa\u00e7ons diff\u00e9rentes<\/a>. Mais d&rsquo;abord, vous pouvez v\u00e9rifier si le logiciel est d\u00e9j\u00e0 install\u00e9 sur votre machine.<\/p>\n<p>Pour ce faire, lancez le terminal et ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">node -v<\/code><\/pre>\n<p>Si le r\u00e9sultat est <code>commande non trouv\u00e9e<\/code>, alors Node.js n&rsquo;est pas install\u00e9 sur votre ordinateur, et vous pouvez poursuivre l&rsquo;installation.<\/p>\n<p>Pour cet article, nous avons choisi l&rsquo;option d&rsquo;installation la plus simple, qui est le <a href=\"https:\/\/nodejs.org\/en\/download\/\">Node Installer<\/a>. Tout ce que vous devez faire est de t\u00e9l\u00e9charger la version correspondant \u00e0 votre syst\u00e8me d&rsquo;exploitation et de lancer l&rsquo;assistant d&rsquo;installation :<\/p>\n<figure id=\"attachment_105120\" aria-describedby=\"caption-attachment-105120\" style=\"width: 1974px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105120 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/nodejs-downloads.jpg\" alt=\"Page de t\u00e9l\u00e9chargement de Node.js.\" width=\"1974\" height=\"1550\"><figcaption id=\"caption-attachment-105120\" class=\"wp-caption-text\">Page de t\u00e9l\u00e9chargement de Node.js.<\/figcaption><\/figure>\n<p>Une fois que vous avez install\u00e9 Node.js, ex\u00e9cutez \u00e0 nouveau la commande <code>node -v<\/code> dans votre terminal. Vous pouvez \u00e9galement ex\u00e9cuter la commande <code>npm -v<\/code> pour confirmer que vous avez le paquet npm disponible.<\/p>\n<p>Vous \u00eates maintenant \u00e9quip\u00e9 des outils suivants :<\/p>\n<ul>\n<li>Le gestionnaire de paquets node.js <code>npx<\/code>. Cela vous permet d&rsquo;ex\u00e9cuter une commande <code>npm<\/code> sans l&rsquo;installer au pr\u00e9alable.<\/li>\n<li>Le gestionnaire de paquets <code>npm<\/code> Node.js (<a href=\"https:\/\/docs.npmjs.com\/\">voir docs<\/a>). Il est utilis\u00e9 pour installer les d\u00e9pendances et ex\u00e9cuter les scripts.<\/li>\n<\/ul>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 installer l&rsquo;environnement de d\u00e9veloppement.<\/p>\n<h3 id=\"dev-environment\">2. Configurer votre environnement de d\u00e9veloppement<\/h3>\n<p>Une fois que vous aurez install\u00e9 les derni\u00e8res versions de Node.js et de npm sur votre machine locale, vous aurez besoin d&rsquo;un environnement de d\u00e9veloppement pour WordPress.<\/p>\n<p>Vous pouvez soit utiliser un environnement de d\u00e9veloppement local comme DevKinsta, soit utiliser l&rsquo;outil officiel de WordPress. Jetons un coup d&rsquo;\u0153il aux deux options.<\/p>\n<h4 id=\"devkinsta\">Option 1 : Environnement de d\u00e9veloppement local (DevKinsta)<\/h4>\n<p>En quelques clics, vous pouvez <a href=\"https:\/\/kinqsta.com\/fr\/ebooks\/wordpress\/wordpress-developpement-local\/\">installer WordPress localement<\/a> en utilisant <a href=\"https:\/\/kinqsta.com\/fr\/devkinsta\/\">DevKinsta<\/a>, notre outil moderne de d\u00e9veloppement local de WordPress. Vous pouvez \u00e9galement opter pour un autre outil de d\u00e9veloppement local, tel que <a href=\"https:\/\/kinqsta.com\/fr\/blog\/installer-wordpress-localement\/#how-to-install-wordpress-locally-on-mac-using-mamp\">MAMP<\/a> ou <a href=\"https:\/\/kinqsta.com\/fr\/blog\/installer-wordpress-localement\/#how-to-install-wordpress-locally-using-xampp\">XAMPP<\/a> :<\/p>\n<figure id=\"attachment_105122\" aria-describedby=\"caption-attachment-105122\" style=\"width: 2502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105122 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/dev-kinsta-create-new-site.jpg\" alt=\"Cr\u00e9er un nouveau site web WordPress dans DevKinsta.\" width=\"2502\" height=\"1252\"><figcaption id=\"caption-attachment-105122\" class=\"wp-caption-text\">Cr\u00e9er un nouveau site web WordPress dans DevKinsta.<\/figcaption><\/figure>\n<h4 id=\"wp-env\">Option 2 : wp-env<\/h4>\n<p>Vous pouvez \u00e9galement opter pour l&rsquo;<a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">outil officiel<\/a><a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\"><code>wp-env<\/code><\/a> , qui fournit un environnement de d\u00e9veloppement WordPress local que vous pouvez lancer directement \u00e0 partir de la ligne de commande. Noah Alen <a href=\"https:\/\/make.wordpress.org\/core\/2020\/03\/03\/wp-env-simple-local-environments-for-wordpress\/\">le d\u00e9finit comme suit<\/a> :<\/p>\n<blockquote><p><em>Les environnements locaux de WordPress sont maintenant aussi simples que l&rsquo;ex\u00e9cution d&rsquo;une seule commande. <\/em><code><em>wp-env<\/em><\/code> <em>est un outil sans configuration pour des environnements locaux de WordPress sans douleur. Il fournit des d\u00e9cisions sur les options afin que les utilisateurs puissent rapidement lancer WordPress sans perdre de temps. En effet, l&rsquo;objectif est de rendre ces environnements facilement accessibles \u00e0 tous &#8211; que vous soyez d\u00e9veloppeur, concepteur, gestionnaire ou autre.<\/em><\/p><\/blockquote>\n<p>Si vous d\u00e9cidez d&rsquo;essayer, l&rsquo;installation de <code>wp-env<\/code> ne demande qu&rsquo;un effort minimal. Il suffit de suivre les \u00e9tapes suivantes :<\/p>\n<h5>\u00c9tape 1 : Confirmer l&rsquo;installation de Docker et Node.js<\/h5>\n<p>Pour r\u00e9pondre aux exigences techniques, vous devrez d&rsquo;abord avoir install\u00e9 <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> et Node.js sur votre ordinateur. En effet, <code>wp-env<\/code> cr\u00e9e une instance Docker qui ex\u00e9cute un site web WordPress. Toute modification apport\u00e9e au code est imm\u00e9diatement r\u00e9percut\u00e9e dans l&rsquo;instance WordPress.<\/p>\n<h5>\u00c9tape 2 : Installer <code>@wordpress\/env<\/code> \u00e0 partir de la ligne de commande<\/h5>\n<p>Une fois que Docker et Node.js fonctionnent sur votre ordinateur, vous pouvez passer \u00e0 l&rsquo;installation de l&rsquo;<a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">environnement de d\u00e9veloppement<\/a> WordPress.<\/p>\n<p>Vous pouvez installer <code>wp-env<\/code> de mani\u00e8re globale ou locale. Pour l&rsquo;installer globalement, vous devez ex\u00e9cuter la commande suivante \u00e0 partir du r\u00e9pertoire des extensions (plus d&rsquo;informations \u00e0 ce sujet dans l&rsquo;encadr\u00e9 \u00ab Important \u00bb ci-dessous) :<\/p>\n<pre><code class=\"language-bash\">npm install -g @wordpress\/env<\/code><\/pre>\n<p>D\u00e9composons \u00e7a :<\/p>\n<ul>\n<li><code>npm install<\/code> installe <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-install\">le paquet<\/a>.<\/li>\n<li>Le suffixe <code>-g<\/code> ajout\u00e9 \u00e0 la commande <a href=\"https:\/\/docs.npmjs.com\/downloading-and-installing-packages-globally\">installe le paquet sp\u00e9cifi\u00e9 de mani\u00e8re globale<\/a>.<\/li>\n<li><code>@wordpress\/env<\/code> est le <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env\">paquet que vous allez installer<\/a>.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Par d\u00e9faut, sur Mac ou Linux, les paquets node sont install\u00e9s dans <strong>\/usr\/local\/lib\/node_modules<\/strong>.<\/p>\n<p>Si l&rsquo;utilisateur actuel ne dispose pas de droits d&rsquo;\u00e9criture sur ce r\u00e9pertoire, une erreur EACCES sera \u00e9mise. En savoir plus sur la <a href=\"https:\/\/docs.npmjs.com\/resolving-eacces-permissions-errors-when-installing-packages-globally\">r\u00e9solution des erreurs de permissions EACCES lors de l&rsquo;installation globale de paquets<\/a><\/p>\n<\/aside>\n\n<p>Pour confirmer que <code>wp-env<\/code> a bien \u00e9t\u00e9 install\u00e9, ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">wp-env --version<\/code><\/pre>\n<p>Vous devriez voir la version actuelle de <code>wp-env<\/code>, ce qui signifie que vous pouvez maintenant lancer l&rsquo;environnement en utilisant la commande suivante <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/env#user-content-usage\">depuis le dossier de votre extension<\/a> :<\/p>\n<pre><code class=\"language-bash\">wp-env start<\/code><\/pre>\n<p>Vous pouvez acc\u00e9der au tableau de bord de WordPress en utilisant l&rsquo;adresse suivante :<\/p>\n<ul>\n<li>http:\/\/localhost:8888\/wp-admin\/<\/li>\n<\/ul>\n<p>Les informations d&rsquo;identification par d\u00e9faut sont les suivantes :<\/p>\n<ul>\n<li>Identifiant : <code>admin<\/code><\/li>\n<li>Mot de passe : <code>password<\/code><\/li>\n<\/ul>\n<h3 id=\"block-plugin\">Configurez votre extension de bloc<\/h3>\n<p>Vous avez maintenant besoin d&rsquo;une extension de bloc de d\u00e9marrage sur laquelle vous appuyer. Mais au lieu de cr\u00e9er manuellement une extension de bloc de d\u00e9veloppement avec tous les fichiers et r\u00e9pertoires n\u00e9cessaires, vous pouvez simplement ex\u00e9cuter un outil de d\u00e9veloppement fournissant tous les fichiers et configurations dont vous avez besoin pour commencer le d\u00e9veloppement de blocs.<\/p>\n<p>L\u00e0 encore, vous avez le choix entre plusieurs options. Examinons chacune d&rsquo;elles.<\/p>\n<h4 id=\"create-block\">Option 1 : Configurer une extension de bloc avec @wordpress\/create-block<\/h4>\n<p><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\">@wordpress\/create-block<\/a> est l&rsquo;outil officiel sans configuration pour la cr\u00e9ation de blocs Gutenberg :<\/p>\n<blockquote><p><em>Create Block est un moyen officiellement support\u00e9 de cr\u00e9er des blocs pour enregistrer un bloc pour une extension WordPress. Il offre une configuration de construction moderne sans aucune configuration. Il g\u00e9n\u00e8re du code PHP, JS, CSS, et tout ce dont vous avez besoin pour d\u00e9marrer le projet.<\/em><\/p>\n<p>Il est largement inspir\u00e9 de <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\/\">create-react-app<\/a>. Un grand bravo \u00e0 <a href=\"https:\/\/github.com\/gaearon\">@gaearon<\/a>, \u00e0 toute l&rsquo;\u00e9quipe de Facebook et \u00e0 la communaut\u00e9 React.<\/p><\/blockquote>\n<p>Une fois que votre environnement local est op\u00e9rationnel, vous pouvez configurer un bloc de d\u00e9marrage en ex\u00e9cutant simplement la <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">commande<\/a> <code>npx @wordpress\/create-block<\/code>, et il fournira tous les fichiers et r\u00e9pertoires dont vous avez besoin pour <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/\">cr\u00e9er l&rsquo;\u00e9chafaudage de l&rsquo;extension<\/a> et enregistrer un nouveau bloc.<\/p>\n<p>Faisons un test pour voir comment cela fonctionne.<\/p>\n<p>\u00c0 partir de votre outil de ligne de commande, acc\u00e9dez au r\u00e9pertoire <strong>\/wp-content\/plugins\/ <\/strong>et ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block my-first-block<\/code><\/pre>\n<p>Lorsqu&rsquo;on vous demande de confirmer, saisissez <code>y<\/code> pour continuer :<\/p>\n<figure id=\"attachment_105124\" aria-describedby=\"caption-attachment-105124\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105124 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/create-block-my-first-block.jpg\" alt=\"Cr\u00e9ation d'un bloc avec @wordpress\/create-block.\" width=\"1136\" height=\"170\"><figcaption id=\"caption-attachment-105124\" class=\"wp-caption-text\">Cr\u00e9ation d&rsquo;un bloc avec @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Le processus prend quelques instants. Une fois qu&rsquo;il est termin\u00e9, vous devriez obtenir la r\u00e9ponse suivante :<\/p>\n<figure id=\"attachment_105125\" aria-describedby=\"caption-attachment-105125\" style=\"width: 1134px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105125 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/wordpress-create-block-completed.jpg\" alt=\"L'extension de bloc a \u00e9t\u00e9 cr\u00e9\u00e9e.\" width=\"1134\" height=\"680\"><figcaption id=\"caption-attachment-105125\" class=\"wp-caption-text\">L&rsquo;extension de bloc a \u00e9t\u00e9 cr\u00e9\u00e9e.<\/figcaption><\/figure>\n<p>Et c&rsquo;est tout !<\/p>\n<p>Lancez maintenant votre environnement de d\u00e9veloppement WordPress et allez \u00e0 l&rsquo;\u00e9cran des <strong>Extensions <\/strong>dans le tableau de bord de WordPress. Une nouvelle extension nomm\u00e9 \u00ab My First Block \u00bb devrait avoir \u00e9t\u00e9 ajout\u00e9e \u00e0 votre liste d&rsquo;extensions :<\/p>\n<figure id=\"attachment_105126\" aria-describedby=\"caption-attachment-105126\" style=\"width: 1956px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105126 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/my-first-block-plugin.jpg\" alt=\"L'extension de bloc a bien \u00e9t\u00e9 install\u00e9e.\" width=\"1956\" height=\"1168\"><figcaption id=\"caption-attachment-105126\" class=\"wp-caption-text\">L&rsquo;extension de bloc a bien \u00e9t\u00e9 install\u00e9e.<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si vous utilisez l&rsquo;outil <code>wp-env<\/code> et ex\u00e9cutez <code>wp-env start<\/code> depuis le r\u00e9pertoire contenant l&rsquo;extension, il montera et activera automatiquement l&rsquo;extension. Si vous ex\u00e9cutez <code>wp-env start<\/code> \u00e0 partir de n&rsquo;importe quel autre r\u00e9pertoire, un environnement WordPress g\u00e9n\u00e9rique sera cr\u00e9\u00e9 (voir aussi <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/#wordpress-development-site\">Site de d\u00e9veloppement WordPress<\/a>)<\/p>\n<\/aside>\n\n<p>Activez l&rsquo;extension si n\u00e9cessaire, cr\u00e9ez un nouvel article de blog, faites d\u00e9filer l&rsquo;outil dinsertion de blocs jusqu&rsquo;\u00e0 la section <strong>Widgets<\/strong>, et s\u00e9lectionnez votre nouveau bloc :<\/p>\n<figure id=\"attachment_134071\" aria-describedby=\"caption-attachment-134071\" style=\"width: 2190px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134071 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/example-block.jpg\" alt=\"Un exemple de bloc cr\u00e9\u00e9 avec @wordpress\/create-block.\" width=\"2190\" height=\"1034\"><figcaption id=\"caption-attachment-134071\" class=\"wp-caption-text\">Un exemple de bloc cr\u00e9\u00e9 avec @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Maintenant, retournez au terminal et changez le r\u00e9pertoire courant en <strong>my-first-block <\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd my-first-block<\/code><\/pre>\n<p>Ensuite, ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Cela vous permet d&rsquo;ex\u00e9cuter l&rsquo;extension en mode d\u00e9veloppement. Pour cr\u00e9er le code de production, vous devez utiliser la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<h4 id=\"create-guten-block\">Option 2 : Configuration d&rsquo;une extension de bloc avec create-guten-block<\/h4>\n<p><a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\"><code>create-guten-block<\/code><\/a> est un outil de d\u00e9veloppement tiers pour la construction de blocs Gutenberg :<\/p>\n<blockquote><p><em><code>create-guten-block<\/code> est un dev-toolkit sans configuration (#0CJS) pour d\u00e9velopper des blocs WordPress Gutenberg en quelques minutes sans configurer React, webpack, ES6\/7\/8\/Next, ESLint, Babel, etc.<\/em><\/p><\/blockquote>\n<p>Tout comme l&rsquo;outil officiel <code>create-block<\/code>, <code>create-guten-block<\/code> est bas\u00e9 sur <a href=\"https:\/\/create-react-app.dev\/docs\/getting-started\">create-react-app<\/a> et peut vous aider \u00e0 g\u00e9n\u00e9rer votre premi\u00e8re extension de bloc sans probl\u00e8me.<\/p>\n<p>La bo\u00eete \u00e0 outils fournit tout ce dont vous avez besoin pour cr\u00e9er une extension WordPress moderne, <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#whats-included\">notamment les \u00e9l\u00e9ments suivants<\/a> :<\/p>\n<blockquote>\n<ul>\n<li>Prise en charge des syntaxes React, JSX et ES6.<\/li>\n<li>Processus de construction de webpack pour le d\u00e9veloppement et la production en arri\u00e8re-plan.<\/li>\n<li>Les extras du langage au-del\u00e0 de l&rsquo;ES6, comme l&rsquo;<a href=\"https:\/\/kinqsta.com\/fr\/blog\/operateur-spread-javascript\/\">op\u00e9rateur d&rsquo;\u00e9talement<\/a> d&rsquo;objet.<\/li>\n<li>CSS auto-pr\u00e9fix\u00e9, de sorte que vous n&rsquo;avez pas besoin de -webkit ou d&rsquo;autres pr\u00e9fixes.<\/li>\n<li>Un script de construction pour regrouper JS, CSS et images pour la production avec des cartes de source.<\/li>\n<li>Mises \u00e0 jour sans probl\u00e8me pour les outils ci-dessus avec une seule d\u00e9pendance cgb-scripts.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Il convient de noter l&rsquo;avertissement suivant :<\/p>\n<blockquote><p><em>La contrepartie est que ces outils sont pr\u00e9configur\u00e9s pour fonctionner d&rsquo;une mani\u00e8re sp\u00e9cifique. Si votre projet n\u00e9cessite davantage de personnalisation, vous pouvez <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block#--npm-run-eject\">\u00ab l&rsquo;\u00e9jecter \u00bb<\/a> et le personnaliser, mais vous devrez alors maintenir cette configuration.<\/em><\/p><\/blockquote>\n<p>Une fois que vous avez un site WordPress local en main, lancez votre outil de ligne de commande, allez dans le r\u00e9pertoire <strong>\/wp-content\/plugins <\/strong>de votre installation, et ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npx create-guten-block my-first-block<\/code><\/pre>\n<p>Vous devrez attendre une minute ou deux pendant que la structure du projet est cr\u00e9\u00e9e et que les d\u00e9pendances sont t\u00e9l\u00e9charg\u00e9es :<\/p>\n<figure id=\"attachment_105147\" aria-describedby=\"caption-attachment-105147\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105147 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block.jpg\" alt=\"Cr\u00e9er un bloc Gutenberg avec create-guten-block.\" width=\"1136\" height=\"290\"><figcaption id=\"caption-attachment-105147\" class=\"wp-caption-text\">Cr\u00e9er un bloc Gutenberg avec create-guten-block.<\/figcaption><\/figure>\n<p>Lorsque le processus est termin\u00e9, vous devriez voir l&rsquo;\u00e9cran suivant :<\/p>\n<figure id=\"attachment_105132\" aria-describedby=\"caption-attachment-105132\" style=\"width: 1130px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105132 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-complete.jpg\" alt=\"Le bloc Gutenberg a bien \u00e9t\u00e9 cr\u00e9\u00e9 avec create-guten-block.\" width=\"1130\" height=\"673\"><figcaption id=\"caption-attachment-105132\" class=\"wp-caption-text\">Le bloc Gutenberg a bien \u00e9t\u00e9 cr\u00e9\u00e9 avec create-guten-block.<\/figcaption><\/figure>\n<p>L&rsquo;image suivante montre la structure du projet avec le terminal ex\u00e9cut\u00e9 dans <a href=\"https:\/\/kinqsta.com\/fr\/blog\/meilleurs-editeurs-de-texte\/#visual-studio-code\">Visual Studio Code<\/a> :<\/p>\n<figure id=\"attachment_105133\" aria-describedby=\"caption-attachment-105133\" style=\"width: 2350px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105133 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/create-guten-block-plugin-in-visual-studio-code.jpg\" alt=\"L'extension de bloc dans Visual Studio Code.\" width=\"2350\" height=\"1484\"><figcaption id=\"caption-attachment-105133\" class=\"wp-caption-text\">L&rsquo;extension de bloc dans Visual Studio Code.<\/figcaption><\/figure>\n<p>Retournez maintenant \u00e0 votre tableau de bord WordPress. Un nouvel \u00e9l\u00e9ment devrait \u00eatre list\u00e9 dans l&rsquo;\u00e9cran des extensions &#8211; il s&rsquo;agit de l&rsquo;extension <strong>my-first-block <\/strong>:<\/p>\n<figure id=\"attachment_105134\" aria-describedby=\"caption-attachment-105134\" style=\"width: 2136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105134 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/plugins-screen.jpg\" alt=\"L'\u00e9cran des extensions avec une nouvelle extension cr\u00e9\u00e9e avec create-guten-block.\" width=\"2136\" height=\"1155\"><figcaption id=\"caption-attachment-105134\" class=\"wp-caption-text\">L&rsquo;\u00e9cran des extensions avec une nouvelle extension cr\u00e9\u00e9e avec create-guten-block.<\/figcaption><\/figure>\n<p>Activez l&rsquo;extension et retournez dans le terminal. Changez le r\u00e9pertoire courant en <strong>my-first-block<\/strong>, puis lancez <code>npm start<\/code> :<\/p>\n<pre><code class=\"language-bash\">cd my-first-block\nnpm start<\/code><\/pre>\n<p>Vous devriez obtenir la r\u00e9ponse suivante :<\/p>\n<figure id=\"attachment_105128\" aria-describedby=\"caption-attachment-105128\" style=\"width: 1129px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105128 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/npm-started.jpg\" alt=\"npm a d\u00e9marr\u00e9.\" width=\"1129\" height=\"390\"><figcaption id=\"caption-attachment-105128\" class=\"wp-caption-text\">npm a d\u00e9marr\u00e9.<\/figcaption><\/figure>\n<p>Encore une fois, cela vous permet d&rsquo;ex\u00e9cuter l&rsquo;extension en mode d\u00e9veloppement. Pour cr\u00e9er le code de production, vous devez utiliser :<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Activez l&rsquo;extension et cr\u00e9ez un nouvel article ou une nouvelle page, puis parcourez vos blocs et s\u00e9lectionnez votre tout nouveau bloc Gutenberg :<\/p>\n<figure id=\"attachment_105136\" aria-describedby=\"caption-attachment-105136\" style=\"width: 2458px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105136 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/first-block-created-with-create-guten-block.jpg\" alt=\"Un nouveau bloc cr\u00e9\u00e9 avec create-guten-block.\" width=\"2458\" height=\"1220\"><figcaption id=\"caption-attachment-105136\" class=\"wp-caption-text\">Un nouveau bloc cr\u00e9\u00e9 avec create-guten-block.<\/figcaption><\/figure>\n<p>Pour un aper\u00e7u plus approfondi ou en cas d&rsquo;erreur, consultez la <a href=\"https:\/\/github.com\/ahmadawais\/create-guten-block\">documentation fournie par Ahmad Awais<\/a>.<\/p>\n<h2>Une visite guid\u00e9e de l&rsquo;\u00e9chafaudage du Starter Block<\/h2>\n<p>Quel que soit l&rsquo;outil de d\u00e9veloppement choisi (<code>create-block<\/code> ou <code>create-guten-block<\/code>), vous disposez maintenant d&rsquo;un \u00e9chafaudage de blocs que vous pouvez utiliser comme point de d\u00e9part pour cr\u00e9er une extension de bloc.<\/p>\n<p>Mais qu&rsquo;est-ce qu&rsquo;un <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/28\/new-wordpress-create-block-package-for-block-scaffolding\/\">\u00e9chafaudage de bloc<\/a> ?<\/p>\n<blockquote><p><em>L&rsquo;\u00e9chafaudage (scaffolding) de bloc est un terme abr\u00e9g\u00e9 qui d\u00e9crit la structure de r\u00e9pertoire de soutien dont vous avez besoin pour que WordPress reconnaisse un bloc. En g\u00e9n\u00e9ral, ce r\u00e9pertoire comprend des fichiers tels que <strong>index.php<\/strong>, <strong>index.js<\/strong>, <strong>style.css<\/strong>, et d&rsquo;autres &#8211; qui contiennent \u00e0 leur tour des appels comme <\/em><code><em>register_block_type<\/em><\/code><em>.<\/em><\/p><\/blockquote>\n<p>Nous avons opt\u00e9 pour l&rsquo;outil officiel <strong>Create Block<\/strong>, car <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/devenv\/\">il est utilis\u00e9 dans le manuel de l&rsquo;\u00e9diteur de blocs<\/a>. Mais m\u00eame si vous d\u00e9cidez d&rsquo;utiliser un outil tiers comme <code>create-guten-block<\/code>, votre exp\u00e9rience ne sera pas trop diff\u00e9rente.<\/p>\n<p>Ceci \u00e9tant dit, plongeons plus profond\u00e9ment dans l&rsquo;<a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">outil<\/a> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\"><code>create-block<\/code><\/a>.<\/p>\n<h3>Un regard plus approfondi sur l&rsquo;outil de d\u00e9veloppement Create Block<\/h3>\n<p>Comme nous l&rsquo;avons mentionn\u00e9 plus haut, <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/create-block\">Create Block<\/a> est l&rsquo;outil officiel en ligne de commande pour cr\u00e9er des blocs Gutenberg. L&rsquo;ex\u00e9cution de <code>@wordpress\/create-block<\/code> dans votre terminal g\u00e9n\u00e8re les fichiers PHP, JS, et SCSS et le code n\u00e9cessaire pour enregistrer un nouveau type de bloc :<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block [options] [slug]<\/code><\/pre>\n<ul>\n<li><code>[slug]<\/code> (facultatif) &#8211; permet d&rsquo;attribuer le slug du bloc et d&rsquo;installer l&rsquo;extension.<\/li>\n<li><code>[options]<\/code> (facultatif) &#8211; options disponibles<\/li>\n<\/ul>\n<p>Par d\u00e9faut, un mod\u00e8le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">ESNext<\/a> est attribu\u00e9. Cela signifie que vous obtiendrez la <a href=\"https:\/\/www.freecodecamp.org\/news\/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e\/\">prochaine version de JavaScript<\/a>, avec l&rsquo;ajout de la <a href=\"https:\/\/kinqsta.com\/fr\/blog\/guide-syntaxe-jsx\/\">syntaxe JSX<\/a>.<\/p>\n<p>Si vous omettez le nom du bloc, la commande s&rsquo;ex\u00e9cute en mode interactif, ce qui vous permet de personnaliser plusieurs options avant de g\u00e9n\u00e9rer les fichiers :<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<figure id=\"attachment_133845\" aria-describedby=\"caption-attachment-133845\" style=\"width: 1684px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133845 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/create-block-interactive-mode-1.jpg\" alt=\"Ex\u00e9cution de create-block en mode interactif.\" width=\"1684\" height=\"1005\"><figcaption id=\"caption-attachment-133845\" class=\"wp-caption-text\">Ex\u00e9cution de create-block en mode interactif.<\/figcaption><\/figure>\n<p>L&rsquo;image ci-dessous montre la structure de fichier d&rsquo;une extension de bloc cr\u00e9\u00e9e avec l&rsquo;outil officiel Create Block :<\/p>\n<figure id=\"attachment_133848\" aria-describedby=\"caption-attachment-133848\" style=\"width: 1404px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133848 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-structure.jpg\" alt=\"Fichiers et r\u00e9pertoires d'une extension de bloc cr\u00e9\u00e9 avec @wordpress\/create-block.\" width=\"1404\" height=\"960\"><figcaption id=\"caption-attachment-133848\" class=\"wp-caption-text\">Fichiers et r\u00e9pertoires d&rsquo;une extension de bloc cr\u00e9\u00e9 avec @wordpress\/create-block.<\/figcaption><\/figure>\n<p>Ceci \u00e9tant dit, passons en revue les principaux fichiers et r\u00e9pertoire de notre nouvelle extension de bloc.<\/p>\n<h3 id=\"plugin-file\">Le fichier de l&rsquo;extension<\/h3>\n<p>Avec le fichier principal de l&rsquo;extension, vous <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#php-server-side\">enregistrez le bloc sur le serveur<\/a> :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name:       Kinsta Academy Block\n * Plugin URI:        https:\/\/kinqsta.com\/\n * Description:       An example block for Kinsta Academy students\n * Requires at least: 5.9\n * Requires PHP:      7.0\n * Version:           0.1.0\n * Author:            Kinsta Students\n * License:           GPL-2.0-or-later\n * License URI:       https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\n * Text Domain:       ka-example-block\n *\n * @package           ka-example-block\n *\/\n\n\/**\n * Registers the block using the metadata loaded from the `block.json` file.\n * Behind the scenes, it registers also all assets so they can be enqueued\n * through the block editor in the corresponding context.\n *\n * @see https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\n *\/\nfunction ka_example_block_ka_example_block_block_init() {\n\tregister_block_type( __DIR__ . '\/build' );\n}\nadd_action( 'init', 'ka_example_block_ka_example_block_block_init' );<\/code><\/pre>\n<p>La fonction <code>register_block_type<\/code> <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_block_type\/\">enregistre un type de bloc sur le serveur<\/a> en utilisant les m\u00e9tadonn\u00e9es stock\u00e9es dans le fichier <strong>block.json<\/strong>.<\/p>\n<ul>\n<li>Le nom du type de bloc, y compris l&rsquo;espace de noms, ou un chemin d&rsquo;acc\u00e8s au r\u00e9pertoire o\u00f9 se trouve le fichier <strong>block.json<\/strong>, ou un objet <code>WP_Block_Type<\/code> complet.<\/li>\n<li>Un tableau d&rsquo;arguments de type de bloc<\/li>\n<\/ul>\n<p>Dans le code ci-dessus, la <a href=\"https:\/\/www.php.net\/manual\/en\/language.constants.magic.php\">constante magique<\/a> <code>__DIR__<\/code> renvoie le r\u00e9pertoire actuel. Cela signifie que le fichier <strong>block.json<\/strong> r\u00e9side dans le sous-dossier<em> \/build<\/em>.<\/p>\n<h3 id=\"package-json\">Le fichier package.json<\/h3>\n<p>Le <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">fichier package.json<\/a> d\u00e9finit les propri\u00e9t\u00e9s et les scripts JavaScript de votre projet. C&rsquo;est ici que vous pouvez installer les d\u00e9pendances de votre projet.<\/p>\n<p>Pour mieux comprendre \u00e0 quoi sert ce fichier, ouvrez-le avec votre <a href=\"https:\/\/kinqsta.com\/fr\/blog\/editeurs-html-gratuits\/\">\u00e9diteur de code pr\u00e9f\u00e9r\u00e9<\/a> :<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"author\": \"Kinsta Students\",\n\t\"license\": \"GPL-2.0-or-later\",\n\t\"homepage\": \"https:\/\/kinqsta.com\/\",\n\t\"main\": \"build\/index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"format\": \"wp-scripts format\",\n\t\t\"lint:css\": \"wp-scripts lint-style\",\n\t\t\"lint:js\": \"wp-scripts lint-js\",\n\t\t\"packages-update\": \"wp-scripts packages-update\",\n\t\t\"plugin-zip\": \"wp-scripts plugin-zip\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@wordpress\/scripts\": \"^24.1.0\"\n\t},\n\t\"dependencies\": {\n\t\t\"classnames\": \"^2.3.2\"\n\t}\n}<\/code><\/pre>\n<p>La <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/using-npm\/scripts\">propri\u00e9t\u00e9<\/a> <code>scripts<\/code> est un <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">dictionnaire contenant des commandes<\/a> qui sont ex\u00e9cut\u00e9es \u00e0 diff\u00e9rents moments du <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json\">cycle de vie d&rsquo;un paquet<\/a> en utilisant <code>npm run [cmd]<\/code>.<\/p>\n<p>Dans cet article, nous utiliserons les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/wp-plugin\/#package-json\">commandes suivantes<\/a> :<\/p>\n<ul>\n<li><code>npm run build<\/code> &#8211; cr\u00e9e un build de production (compress\u00e9)<\/li>\n<li><code>npm run start<\/code> ou <code>npm start<\/code> &#8211; cr\u00e9e un build de d\u00e9veloppement (non compress\u00e9)<\/li>\n<\/ul>\n<p><code>dependencies<\/code> et <code>devDependencies<\/code> sont deux objets faisant correspondre <a href=\"https:\/\/docs.npmjs.com\/cli\/v7\/configuring-npm\/package-json#dependencies\">un nom de paquet \u00e0 une version<\/a>. <code>dependencies<\/code> est n\u00e9cessaire en production, tandis que <code>devDependences<\/code> est uniquement n\u00e9cessaire pour le d\u00e9veloppement local (<a href=\"https:\/\/docs.npmjs.com\/specifying-dependencies-and-devdependencies-in-a-package-json-file\">en savoir plus<\/a>).<\/p>\n<p>La seule d\u00e9pendance de d\u00e9veloppement par d\u00e9faut est le paquet <code>@wordpress\/scripts<\/code>, qui est <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">d\u00e9fini comme<\/a> \u00ab une collection de scripts r\u00e9utilisables adapt\u00e9s au d\u00e9veloppement de WordPress \u00bb.<\/p>\n<h3 id=\"block-json\">Le fichier block.json<\/h3>\n<p>\u00c0 partir de WordPress 5.8, le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">fichier de m\u00e9tadonn\u00e9es<\/a> <strong>block.json <\/strong>est la <a href=\"https:\/\/kinqsta.com\/fr\/blog\/wordpress-5-8\/#block-api-enhancements\">fa\u00e7on canonique d&rsquo;enregistrer les types de blocs<\/a>.<\/p>\n<p>Le fait de disposer d&rsquo;un fichier <strong>block.json<\/strong> pr\u00e9sente plusieurs avantages, notamment une <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#benefits-using-the-metadata-file\">am\u00e9lioration des performances<\/a> et une meilleure visibilit\u00e9 dans le <a href=\"https:\/\/wordpress.org\/plugins\/\">r\u00e9pertoire des extensions de WordPress<\/a> :<\/p>\n<blockquote><p><em>Du point de vue des performances, lorsque les th\u00e8mes prennent en charge le chargement diff\u00e9r\u00e9 des ressources, la mise en file d&rsquo;attente des ressources des blocs enregistr\u00e9s avec <strong>block.json est <\/strong>optimis\u00e9e d\u00e8s le d\u00e9part. Les ressources CSS et JavaScript frontend \u00e9num\u00e9r\u00e9es dans les propri\u00e9t\u00e9s de <\/em><code><em>style<\/em><\/code> <em>ou de <\/em><code><em>script<\/em><\/code> <em>ne seront mises en file d&rsquo;attente que lorsque le bloc sera pr\u00e9sent sur la page, ce qui permettra de r\u00e9duire la taille des pages.<\/em><\/p><\/blockquote>\n<p>L&rsquo;ex\u00e9cution de la commande <code>@wordpress\/create-block<\/code> g\u00e9n\u00e8re le fichier <strong>block.json <\/strong>suivant :<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<p>Voici la liste compl\u00e8te des <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-api\">propri\u00e9t\u00e9s par d\u00e9faut<\/a> :<\/p>\n<ul>\n<li><code>apiVersion<\/code> \u2014 la version de l&rsquo;API utilis\u00e9e par le bloc (la version actuelle est 2)<\/li>\n<li><code>name<\/code> \u2014 un identifiant unique pour un bloc, y compris un espace de noms.<\/li>\n<li><code>version<\/code> \u2014 la version actuelle d&rsquo;un bloc<\/li>\n<li><code>title<\/code> \u2014 un titre d&rsquo;affichage pour un bloc<\/li>\n<li><code>category<\/code> \u2014 une cat\u00e9gorie de bloc<\/li>\n<li><code>icon<\/code> \u2014 un slug <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\">Dashicon<\/a> ou une ic\u00f4ne SVG personnalis\u00e9en<\/li>\n<li><code>description<\/code> \u2014 une br\u00e8ve description visible dans l&rsquo;inspecteur de bloc<\/li>\n<li><code>supports<\/code> \u2014\u00a0un ensemble d&rsquo;options pour contr\u00f4ler les fonctionnalit\u00e9s utilis\u00e9es dans l&rsquo;\u00e9diteur<\/li>\n<li><code>textdomain<\/code> \u2014 le text-domain de l&rsquo;extension<\/li>\n<li><code>editorScript<\/code> \u2014 d\u00e9finition du script de l&rsquo;\u00e9diteur<\/li>\n<li><code>editorStyle<\/code> \u2014 d\u00e9finition du style de l&rsquo;\u00e9diteur<\/li>\n<li><code>style<\/code> \u2014 fournit des styles alternatifs pour un bloc<\/li>\n<\/ul>\n<p>Outre les propri\u00e9t\u00e9s r\u00e9pertori\u00e9es ci-dessus, vous pouvez (et allez probablement) d\u00e9finir un objet <code>attributes<\/code> fournissant des informations sur les donn\u00e9es stock\u00e9es par votre bloc. Dans votre <strong>block.json<\/strong>, vous pouvez d\u00e9finir un nombre quelconque d&rsquo;attributs dans des paires <em>cl\u00e9\/valeur<\/em>, o\u00f9 la cl\u00e9 est le nom de l&rsquo;attribut et la valeur est la d\u00e9finition de l&rsquo;attribut.<\/p>\n<p>Regardez l&rsquo;exemple suivant de d\u00e9finitions d&rsquo;attributs :<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"array\",\n\t\t\"source\": \"children\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"link\": { \n\t\t\"type\": \"string\", \n\t\t\"default\": \"https:\/\/kinqsta.com\" \n\t}\n},<\/code><\/pre>\n<p>Nous nous pencherons plus en d\u00e9tail sur le fichier <strong>block.json <\/strong><a href=\"#block-json-at-work\">plus loin dans l&rsquo;article<\/a>, mais vous pouvez \u00e9galement consulter le manuel de l&rsquo;\u00e9diteur de blocs pour obtenir des informations plus d\u00e9taill\u00e9es sur les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/\">m\u00e9tadonn\u00e9es<\/a> et les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributs<\/a> <strong>block.json<\/strong>.<\/p>\n<h3 id=\"src-folder\">Le r\u00e9pertoire src<\/h3>\n<p>Le r\u00e9pertoire <code>src<\/code> est l&rsquo;endroit o\u00f9 le d\u00e9veloppement se fait. Dans ce r\u00e9pertoire, vous trouverez les fichiers suivants :<\/p>\n<ul>\n<li><strong>index.js<\/strong><\/li>\n<li><strong>edit.js<\/strong><\/li>\n<li><strong>save.js<\/strong><\/li>\n<li><strong>editor.scss<\/strong><\/li>\n<li><strong>style.scss<\/strong><\/li>\n<\/ul>\n<h4>index.js<\/h4>\n<p>Le fichier <strong>index.js <\/strong>est votre point de d\u00e9part. C&rsquo;est ici que vous allez importer les d\u00e9pendances et enregistrer le type de bloc sur le client :<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from '@wordpress\/blocks';\n\nimport '.\/style.scss';\n\nimport Edit from '.\/edit';\nimport save from '.\/save';\nimport metadata from '.\/block.json';\n\nregisterBlockType( metadata.name, {\n\t\/**\n\t * @see .\/edit.js\n\t *\/\n\tedit: Edit,\n\n\t\/**\n\t * @see .\/save.js\n\t *\/\n\tsave,\n} );<\/code><\/pre>\n<p>La premi\u00e8re d\u00e9claration importe la fonction <code>registerBlockType<\/code> depuis le paquetage <code>@wordpress\/blocks<\/code>. Les <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">instructions d&rsquo;importation<\/a> suivantes importent la feuille de style ainsi que les fonctions <code>Edit<\/code> et <code>save<\/code>, et un objet de m\u00e9tadonn\u00e9es depuis le fichier<em> block.json<\/em>.<\/p>\n<p>La fonction <code>registerBlockType<\/code> <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">enregistre le composant sur le client<\/a>. La fonction prend deux param\u00e8tres : un nom de bloc et un objet de configuration de bloc.<\/p>\n<p>La fonction <code>Edit<\/code> fournit l&rsquo;interface du bloc telle qu&rsquo;elle est rendue dans l&rsquo;\u00e9diteur de blocs, tandis que la fonction <code>save<\/code> fournit la structure qui sera s\u00e9rialis\u00e9e et enregistr\u00e9e dans la base de donn\u00e9es (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/\">en savoir plus)<\/a>.<\/p>\n<h4>edit.js<\/h4>\n<p><strong>edit.js <\/strong>est l&rsquo;endroit o\u00f9 vous allez construire l&rsquo;interface d&rsquo;administration du bloc :<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p {...useBlockProps()}&gt;\n\t\t\t{__('My First Block \u2013 hello from the editor!', 'my-first-block')}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Tout d&rsquo;abord, il importe la fonction <code>__<\/code> du paquet <code>@wordpress\/i18n<\/code> (ce paquet contient une version JavaScript des fonctions de traduction), le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">crochet React<\/a> <code><a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">useBlockProps<\/a><\/code> et le fichier editor.scss.<\/p>\n<p>Ensuite, il exporte le composant React (pour en savoir plus sur les d\u00e9clarations <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\">d&rsquo;importation<\/a> et <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/export\">d&rsquo;exportation<\/a>).<\/p>\n<h4>save.js<\/h4>\n<p>Le fichier <strong>save.js <\/strong>est l&rsquo;endroit o\u00f9 nous construisons la structure du bloc \u00e0 sauvegarder dans la base de donn\u00e9es :<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\n\nexport default function save() {\n\treturn (\n\t\t&lt;p {...useBlockProps.save()}&gt;\n\t\t\t{__(\n\t\t\t\t'My First Block \u2013 hello from the saved content!',\n\t\t\t\t'my-first-block'\n\t\t\t)}\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<h4>editor.scss et style.scss<\/h4>\n<p>Outre les scripts, deux fichiers <a href=\"https:\/\/sass-lang.com\/\">SASS<\/a> r\u00e9sident dans les r\u00e9pertoires <strong>src<\/strong>. Le fichier <strong>editor.scss <\/strong>contient les styles appliqu\u00e9s au bloc dans le contexte de l&rsquo;\u00e9diteur, tandis que le fichier <strong>style.scss <\/strong>contient les styles du bloc pour l&rsquo;affichage <a href=\"https:\/\/developer.wordpress.org\/block-editor\/contributors\/code\/coding-guidelines\/#scss-file-naming-conventions-for-blocks\">dans l&rsquo;interface publique ainsi que dans l&rsquo;\u00e9diteur<\/a>.\u00a0Nous nous pencherons plus en d\u00e9tail sur ces fichiers dans la deuxi\u00e8me partie de ce guide.<\/p>\n<h3 id=\"node_modules-build\">Les r\u00e9pertoires node_modules et build<\/h3>\n<p>Le r\u00e9pertoire <code>node_modules<\/code> contient les modules node et leurs d\u00e9pendances. Nous n&rsquo;allons pas nous plonger plus profond\u00e9ment dans les paquets node car cela d\u00e9passe le cadre de cet article, mais vous pouvez en lire plus dans <a href=\"https:\/\/nodejs.dev\/learn\/where-does-npm-install-the-packages\">cet article sur l&rsquo;endroit o\u00f9 npm installe les paquets<\/a>.<\/p>\n<p>Le r\u00e9pertoire <code>build<\/code> contient les fichiers JS et CSS r\u00e9sultant du processus de construction. Vous pouvez approfondir le processus de construction dans les guides de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/esnext-js\/\">syntaxe ESNext<\/a> et de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/javascript\/js-build-setup\/\">configuration de la construction JavaScript<\/a>.<\/p>\n<h2>Le projet : Construire votre premier bloc Gutenberg<\/h2>\n<p>Il est temps de se salir les mains. Cette section vous apprendra \u00e0 cr\u00e9er une extension fournissant un bloc d&rsquo;appel \u00e0 action (CTA) nomm\u00e9 Kinsta Academy.<\/p>\n<p>Le bloc sera compos\u00e9 de deux colonnes, avec une image \u00e0 gauche et un paragraphe de texte \u00e0 droite. Un bouton avec un lien personnalisable sera plac\u00e9 sous le texte :<\/p>\n<figure id=\"attachment_137853\" aria-describedby=\"caption-attachment-137853\" style=\"width: 1502px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-137853 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/custom-block-final-2.jpg\" alt=\"Le type de bloc que vous allez apprendre \u00e0 construire dans ce guide\" width=\"1502\" height=\"808\"><figcaption id=\"caption-attachment-137853\" class=\"wp-caption-text\">Le type de bloc que vous allez apprendre \u00e0 construire dans ce guide.<\/figcaption><\/figure>\n<p>Ce n&rsquo;est qu&rsquo;un exemple simple, mais il nous permet de couvrir les bases du d\u00e9veloppement des blocs Gutenberg. Une fois que vous aurez bien compris les bases, vous pourrez vous lancer dans la cr\u00e9ation de blocs Gutenberg de plus en plus complexes avec l&rsquo;aide du <a href=\"https:\/\/developer.wordpress.org\/block-editor\/\">Block Editor Handbook<\/a> et de toutes les autres ressources disponibles.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Le code des exemples fournis dans ce tutoriel est \u00e9galement <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponible sur Gist<\/a> pour votre r\u00e9f\u00e9rence.<\/p>\n<\/aside>\n\n<p>En supposant que vous avez la derni\u00e8re version de WordPress sur votre environnement de d\u00e9veloppement local, voici ce que vous allez apprendre \u00e0 partir de maintenant :<\/p>\n<ul>\n<li><a href=\"#set-up-the-plugin\">Comment configurer l&rsquo;extension Starter Block ?<\/a><\/li>\n<li><a href=\"#block-json-at-work\">block.json au travail<\/a><\/li>\n<li><a href=\"#using-richtext-component\">Utilisation des composants int\u00e9gr\u00e9s : Le composant RichText<\/a><\/li>\n<li><a href=\"#adding-block-toolbar-controls\">Ajout de contr\u00f4les \u00e0 la barre d&rsquo;outils du bloc<\/a><\/li>\n<li><a href=\"#settings-sidebar\">Personnalisation de la colonne lat\u00e9rale des r\u00e9glages du bloc<\/a><\/li>\n<li><a href=\"#external-link\">Ajout et personnalisation d&rsquo;un lien externe<\/a><\/li>\n<li><a href=\"#multiple-block-styles\">Ajout de styles de blocs multiples<\/a><\/li>\n<li><a href=\"#innerblocks-component\">Embo\u00eetement des blocs avec le composant InnerBlocks<\/a><\/li>\n<li><a href=\"#additional-improvements\">Am\u00e9liorations suppl\u00e9mentaires<\/a><\/li>\n<\/ul>\n<p>\u00c0 vos marques&#8230;pr\u00eats&#8230; partez !<\/p>\n<h3 id=\"set-up-the-plugin\">Comment configurer l&rsquo;extension Starter Block ?<\/h3>\n<p>Lancez votre outil de ligne de commande et acc\u00e9dez au r\u00e9pertoire <strong>\/wp-content\/plugins <\/strong>:<\/p>\n<figure id=\"attachment_105130\" aria-describedby=\"caption-attachment-105130\" style=\"width: 1224px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105130 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/new-terminal-at-folder.jpg\" alt=\"Nouveau terminal dans le r\u00e9pertoire dans Mac OS.\" width=\"1224\" height=\"958\"><figcaption id=\"caption-attachment-105130\" class=\"wp-caption-text\">Nouveau terminal dans le r\u00e9pertoire dans Mac OS.<\/figcaption><\/figure>\n<p>Maintenant, ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npx @wordpress\/create-block<\/code><\/pre>\n<p>Cette commande g\u00e9n\u00e8re les fichiers PHP, SCSS et JS pour l&rsquo;enregistrement d&rsquo;un bloc en mode interactif, ce qui vous permet d&rsquo;ajouter facilement les donn\u00e9es n\u00e9cessaires \u00e0 votre bloc. Pour notre exemple, nous utiliserons les donn\u00e9es suivantes :<\/p>\n<ul>\n<li><strong>Variante du mod\u00e8le :<\/strong> statique<\/li>\n<li><strong>Nom du bloc :<\/strong> ka-example-block<\/li>\n<li><strong>Espace de noms interne :<\/strong> ka-example-block<\/li>\n<li><strong>Titre d&rsquo;affichage du bloc :<\/strong> Bloc Kinsta Academy<\/li>\n<li><strong>Description courte du bloc :<\/strong> Un bloc d&rsquo;exemple pour les \u00e9tudiants de la Kinsta Academy<\/li>\n<li>Dashicon : superhero-altsuperhero-alt<\/li>\n<li><strong>Nom de la cat\u00e9gorie :<\/strong> widgets<\/li>\n<li><strong>Voulez-vous personnaliser l&rsquo;extension WordPress?<\/strong> : oui<\/li>\n<li><strong>La page d&rsquo;accueil de l&rsquo;extension :<\/strong> https:\/\/kinqsta.com\/<\/li>\n<li><strong>Version actuelle de l&rsquo;extension :<\/strong> 0.1.0<\/li>\n<li><strong>Auteur de l&rsquo;extension :<\/strong> votre nom<\/li>\n<li><strong>Licence :<\/strong> &#8211;<\/li>\n<li><strong>Lien vers le texte de la licence :<\/strong> &#8211;<\/li>\n<li><strong>Chemin du domaine personnalis\u00e9 pour les traductions :<\/strong> &#8211;<\/li>\n<\/ul>\n<p>L&rsquo;installation de l&rsquo;extension et de toutes les d\u00e9pendances prend quelques minutes. Lorsque le processus est termin\u00e9, vous verrez la r\u00e9ponse suivante :<\/p>\n<figure id=\"attachment_134076\" aria-describedby=\"caption-attachment-134076\" style=\"width: 1136px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134076 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/example-block-installed.jpg\" alt=\"Le bloc d'exemple a \u00e9t\u00e9 install\u00e9 et enregistr\u00e9 pour le d\u00e9veloppeur.\" width=\"1136\" height=\"682\"><figcaption id=\"caption-attachment-134076\" class=\"wp-caption-text\">Le bloc d&rsquo;exemple a \u00e9t\u00e9 install\u00e9 et enregistr\u00e9 pour le d\u00e9veloppeur.<\/figcaption><\/figure>\n<p>Maintenant, ex\u00e9cutez la commande suivante depuis le r\u00e9pertoire <strong>\/wp-content\/plugins <\/strong>:<\/p>\n<pre><code class=\"language-bash\">cd ka-example-block<\/code><\/pre>\n<p><aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Si vous ex\u00e9cutez votre environnement WordPress, vous devez d&rsquo;abord lancer Docker Desktop, puis ex\u00e9cuter <code>wp-env start<\/code> depuis le r\u00e9pertoire de votre extension.<\/p>\n<p>Vous pouvez ensuite lancer <em>http:\/\/localhost:8888\/wp-login <\/em>\u00e0 partir de votre navigateur web et utiliser l&rsquo; <strong>identifiant : admin <\/strong>et le <strong>mot de passe : password <\/strong>pour vous connecter \u00e0 votre tableau de bord WordPress<span style=\"font-family: Roboto, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem\">.<\/p>\n<\/aside>\n<\/span><\/p>\n<figure id=\"attachment_105184\" aria-describedby=\"caption-attachment-105184\" style=\"width: 2508px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-105184 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2021\/10\/visual-studio-code-terminal.jpg\" alt=\"Ex\u00e9cution de commandes \u00e0 partir du terminal de Visual Studio Code.\" width=\"2508\" height=\"1612\"><figcaption id=\"caption-attachment-105184\" class=\"wp-caption-text\">Ex\u00e9cution de commandes \u00e0 partir du terminal de Visual Studio Code.<\/figcaption><\/figure>\n<p>Enfin, \u00e0 partir du r\u00e9pertoire de votre extension (<strong>ka-example-block <\/strong>dans notre exemple), vous pouvez commencer \u00e0 d\u00e9velopper avec :<\/p>\n<pre><code class=\"language-bash\">npm start<\/code><\/pre>\n<p>Ouvrez maintenant l&rsquo;\u00e9cran Extensions pour trouver et activer l&rsquo;extension <strong>Kinsta Academy\u00a0Block <\/strong>:<\/p>\n<figure id=\"attachment_133866\" aria-describedby=\"caption-attachment-133866\" style=\"width: 2214px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133866 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/plugins-screen.jpg\" alt=\"Activez le bloc d'exemple\" width=\"2214\" height=\"1254\"><figcaption id=\"caption-attachment-133866\" class=\"wp-caption-text\">Activez le bloc d&rsquo;exemple<\/figcaption><\/figure>\n<p>Cr\u00e9ez un nouvel article, ouvrez le module d&rsquo;insertion de blocs et faites d\u00e9filer la liste jusqu&rsquo;\u00e0 la cat\u00e9gorie <strong>Design<\/strong>. Cliquez pour ajouter le bloc Kinsta Academy :<\/p>\n<figure id=\"attachment_133869\" aria-describedby=\"caption-attachment-133869\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133869 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/starter-block.jpg\" alt=\"Un bloc de d\u00e9marrage construit avec @wordpress\/create-block.\" width=\"2216\" height=\"1242\"><figcaption id=\"caption-attachment-133869\" class=\"wp-caption-text\">Un bloc de d\u00e9marrage construit avec @wordpress\/create-block.<\/figcaption><\/figure>\n<h3 id=\"block-json-at-work\">block.json au travail<\/h3>\n<p>Comme nous l&rsquo;avons mentionn\u00e9 pr\u00e9c\u00e9demment, l&rsquo;enregistrement du bloc c\u00f4t\u00e9 serveur a lieu dans le fichier <strong>.php <\/strong>principal. Cependant, nous ne d\u00e9finirons pas les r\u00e9glages dans le fichier <strong>.php<\/strong>. Nous utiliserons plut\u00f4t le fichier <strong>block.json<\/strong>.<\/p>\n<p>Ouvrez \u00e0 nouveau le <strong>fichier block.json <\/strong>et examinez de plus pr\u00e8s les r\u00e9glages par d\u00e9faut :<\/p>\n<pre><code class=\"language-json\">{\n\t\"$schema\": \"https:\/\/schemas.wp.org\/trunk\/block.json\",\n\t\"apiVersion\": 2,\n\t\"name\": \"ka-example-block\/ka-example-block\",\n\t\"version\": \"0.1.0\",\n\t\"title\": \"Kinsta Academy Block\",\n\t\"category\": \"widgets\",\n\t\"icon\": \"superhero-alt\",\n\t\"description\": \"An example block for Kinsta Academy students\",\n\t\"supports\": {\n\t\t\"html\": false\n\t},\n\t\"textdomain\": \"ka-example-block\",\n\t\"editorScript\": \"file:.\/index.js\",\n\t\"editorStyle\": \"file:.\/index.css\",\n\t\"style\": \"file:.\/style-index.css\"\n}<\/code><\/pre>\n<h4>Scripts et styles<\/h4>\n<p>Les propri\u00e9t\u00e9s <code>editorScript<\/code>, <code>editorStyle<\/code> et <code>style<\/code> fournissent les chemins relatifs vers les scripts et les styles de l&rsquo;interface publique et de l&rsquo;administration.<\/p>\n<p>Vous n&rsquo;avez pas \u00e0 enregistrer manuellement les scripts et les styles d\u00e9finis ici car ils sont automatiquement enregistr\u00e9s et mis en file d&rsquo;attente par WordPress. Pour le prouver, lancez l&rsquo;inspecteur du navigateur et ouvrez l&rsquo;onglet <strong>R\u00e9seau <\/strong>:<\/p>\n<figure id=\"attachment_133870\" aria-describedby=\"caption-attachment-133870\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133870 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/chrome-devtools-network.jpg\" alt=\"Inspection des ressources dans Chrome DevTools.\" width=\"2216\" height=\"1256\"><figcaption id=\"caption-attachment-133870\" class=\"wp-caption-text\">Inspecting resources in Chrome DevTools.<\/figcaption><\/figure>\n<p>Comme vous pouvez le voir dans l&rsquo;image ci-dessus, notre script <strong>index.js <\/strong>r\u00e9sidant dans le r\u00e9pertoire <strong>build <\/strong>a \u00e9t\u00e9 r\u00e9guli\u00e8rement mis en file d&rsquo;attente <strong>sans avoir \u00e0 ajouter de code PHP<\/strong>.<\/p>\n<h4>Libell\u00e9s de l&rsquo;UI<\/h4>\n<p>Les propri\u00e9t\u00e9s <code>title<\/code> et <code>description<\/code> fournissent les libell\u00e9s n\u00e9cessaires pour identifier le bloc dans l&rsquo;\u00e9diteur :<\/p>\n<figure id=\"attachment_133871\" aria-describedby=\"caption-attachment-133871\" style=\"width: 2216px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133871 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-labels.jpg\" alt=\"Nom et description du bloc dans la colonne lat\u00e9rale du bloc.\" width=\"2216\" height=\"742\"><figcaption id=\"caption-attachment-133871\" class=\"wp-caption-text\">Nom et description du bloc dans la colonne lat\u00e9rale du bloc.<\/figcaption><\/figure>\n<h4>Mots cl\u00e9s<\/h4>\n<p>Comme nous l&rsquo;avons mentionn\u00e9 pr\u00e9c\u00e9demment, vous pouvez configurer avec pr\u00e9cision les r\u00e9glages de vos blocs \u00e0 l&rsquo;aide de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-registration\/\">propri\u00e9t\u00e9s<\/a> et <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">d&rsquo;attributs<\/a>. Par exemple, vous pouvez ajouter un ou plusieurs <code>keywords<\/code> pour aider les utilisateurs \u00e0 rechercher des blocs :<\/p>\n<pre><code class=\"language-json\">\"keywords\": [ \n\t\t\"kinsta\", \n\t\t\"academy\", \n\t\t\"superhero\" \n\t],<\/code><\/pre>\n<p>Si vous saisissez maintenant \u00ab kinsta \u00bb, \u00ab academy \u00bb ou \u00ab superhero \u00bb dans l&rsquo;insertion rapide, l&rsquo;\u00e9diteur vous proposera le bloc Kinsta Academy :<\/p>\n<figure id=\"attachment_133969\" aria-describedby=\"caption-attachment-133969\" style=\"width: 2086px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133969 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-keywords.jpg\" alt=\"Recherche d'un bloc \u00e0 l'aide d'un mot cl\u00e9 dans l'insertion rapide.\" width=\"2086\" height=\"944\"><figcaption id=\"caption-attachment-133969\" class=\"wp-caption-text\">Recherche d&rsquo;un bloc \u00e0 l&rsquo;aide d&rsquo;un mot cl\u00e9 dans l&rsquo;insertion rapide.<\/figcaption><\/figure>\n<h4>Localisation<\/h4>\n<p>Si vous vous demandez comment se fait la localisation des cha\u00eenes de caract\u00e8res dans le fichier JSON, voici la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/30293\">r\u00e9ponse<\/a> :<\/p>\n<blockquote><p><em>En JavaScript, vous pouvez utiliser la m\u00e9thode <code>registerBlockTypeFromMetadata<\/code> du package <code>@wordpress\/blocks<\/code> pour enregistrer un type de bloc \u00e0 l&rsquo;aide des m\u00e9tadonn\u00e9es charg\u00e9es dans le fichier <strong>block.json<\/strong>. Toutes les propri\u00e9t\u00e9s localis\u00e9es sont automatiquement envelopp\u00e9es dans des appels de fonction \u00a0<code>_x<\/code> (du paquet <code>@wordpress\/i18n<\/code> ) de la m\u00eame mani\u00e8re que cela fonctionne en PHP avec <code>register_block_type_from_metadata<\/code>. \u00a0La seule exigence est de d\u00e9finir la propri\u00e9t\u00e9 <code>textdomain<\/code> dans le fichier <strong>block.json<\/strong>.<\/em><\/p><\/blockquote>\n<p>Nous utilisons ici la fonction <code>registerBlockType<\/code> au lieu de <code>registerBlockTypeFromMetadata<\/code>, car cette derni\u00e8re <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/32030\">est obsol\u00e8te<\/a> depuis <a href=\"https:\/\/make.wordpress.org\/core\/2021\/05\/27\/whats-new-in-gutenberg-10-7-26-may\/\">Gutenberg 10.7<\/a>, mais le m\u00e9canisme est le m\u00eame.<\/p>\n<h3 id=\"using-richtext-component\">Utilisation des composants int\u00e9gr\u00e9s : Le composant RichText<\/h3>\n<p>Les \u00e9l\u00e9ments qui composent un bloc Gutenberg sont des composants React, et vous pouvez acc\u00e9der \u00e0 ces composants via la variable globale <code>wp<\/code>. Par exemple, essayez de saisir <code>wp.editor<\/code> dans la console de votre navigateur. Vous obtiendrez ainsi la liste compl\u00e8te des composants inclus dans le module <code>wp.editor<\/code>.<\/p>\n<p>Faites d\u00e9filer la liste et devinez \u00e0 quoi servent les composants d&rsquo;apr\u00e8s leur nom.<\/p>\n<p>De m\u00eame, vous pouvez v\u00e9rifier la liste des composants inclus dans le module <code>wp.components<\/code> :<\/p>\n<figure id=\"attachment_133970\" aria-describedby=\"caption-attachment-133970\" style=\"width: 2288px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133970 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/wp-components.jpg\" alt=\"Composants WP\" width=\"2288\" height=\"1392\"><figcaption id=\"caption-attachment-133970\" class=\"wp-caption-text\">Composants WP<\/figcaption><\/figure>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>La <strong>programmation modulaire <\/strong>est une technique de conception de logiciels qui met l&rsquo;accent sur la s\u00e9paration de la fonctionnalit\u00e9 d&rsquo;un programme en <strong>modules <\/strong>ind\u00e9pendants et interchangeables, de sorte que chacun d&rsquo;entre eux contient tout ce qui est n\u00e9cessaire pour ex\u00e9cuter un seul aspect de la fonctionnalit\u00e9 souhait\u00e9e (Source : <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\">Wikipedia<\/a>)<\/p>\n<\/aside>\n\n<p>Retournez maintenant au fichier <strong>edit.js <\/strong>et regardez de plus pr\u00e8s le script :<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit() {\n\treturn (\n\t\t&lt;p { ...useBlockProps() }&gt;\n\t\t\t{ __(\n\t\t\t\t'Kinsta Academy Block \u2013 hello from the editor!',\n\t\t\t\t'ka-example-block'\n\t\t\t) }\n\t\t&lt;\/p&gt;\n\t);\n}<\/code><\/pre>\n<p>Ce code g\u00e9n\u00e8re un bloc statique avec un texte simple et non modifiable. Mais nous pouvons facilement changer les choses :<\/p>\n<figure id=\"attachment_133971\" aria-describedby=\"caption-attachment-133971\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133971 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/starter-block-in-code-editor.jpg\" alt=\"Le bloc de d\u00e9marrage dans l'\u00e9diteur de code.\" width=\"1400\" height=\"772\"><figcaption id=\"caption-attachment-133971\" class=\"wp-caption-text\">Le bloc de d\u00e9marrage dans l&rsquo;\u00e9diteur de code.<\/figcaption><\/figure>\n<p>Pour rendre le texte modifiable, il faudra remplacer la balise <code>&lt;p&gt;<\/code> actuelle par un composant qui rend le <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">contenu de la saisie modifiable<\/a>. Pour cela, Gutenberg fournit le <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">composant RichText<\/a> int\u00e9gr\u00e9.<\/p>\n<p>L&rsquo;ajout d&rsquo;un composant int\u00e9gr\u00e9 \u00e0 votre bloc est un processus en 5 \u00e9tapes :<\/p>\n<ol>\n<li><a href=\"#import-components\">Importer les composants n\u00e9cessaire \u00e0 partir d&rsquo;un paquet WordPress<\/a><\/li>\n<li><a href=\"#jsx-elements\">Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/a><\/li>\n<li><a href=\"#define-attributes\">D\u00e9finir les attributs n\u00e9cessaires dans le fichier block.json<\/a><\/li>\n<li><a href=\"#define-event-handlers\">D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/a><\/li>\n<li><a href=\"#save-data\">Enregistrer les donn\u00e9es<\/a><\/li>\n<\/ol>\n<h4 id=\"import-components\">\u00c9tape 1 : Importer les composants n\u00e9cessaires \u00e0 partir d&rsquo;un paquet WordPress<\/h4>\n<p>Ouvrez maintenant le fichier <strong>edit.js <\/strong>et modifiez l&rsquo;instruction <code>import<\/code> suivante :<\/p>\n<pre><code class=\"language-js\">import { useBlockProps } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>\u2026en :<\/p>\n<pre><code class=\"language-js\">import { useBlockProps, RichText } from '@wordpress\/block-editor';<\/code><\/pre>\n<p>De cette fa\u00e7on, vous importez la fonction <code>useBlockProps<\/code> et le composant <code>RichText<\/code> du paquet <code>@wordpress\/block-editor<\/code>.<\/p>\n<h5>useBlockProps<\/h5>\n<p>Le crochet React <code><a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">useBlockProps<\/a><\/code> marque <a href=\"https:\/\/make.wordpress.org\/core\/2020\/11\/18\/block-api-version-2\/\">l&rsquo;\u00e9l\u00e9ment d&rsquo;habillage du bloc<\/a> :<\/p>\n<blockquote><p><em>Lorsque vous utilisez la version 2 de l&rsquo;API, vous devez utiliser le nouveau crochet <\/em><code><em>useBlockProps<\/em><\/code> dans<em> la fonction <code>edit<\/code><\/em> <em>du bloc pour marquer l&rsquo;\u00e9l\u00e9ment d&rsquo;habillage du bloc. Le crochet ins\u00e9rera les attributs et les gestionnaires d&rsquo;\u00e9v\u00e9nements n\u00e9cessaires pour activer le comportement du bloc. Tous les attributs que vous souhaitez transmettre \u00e0 l&rsquo;\u00e9l\u00e9ment du bloc doivent passer par <\/em><code><em>useBlockProps<\/em><\/code> <em>et la valeur renvoy\u00e9e doit \u00eatre r\u00e9partie sur l&rsquo;\u00e9l\u00e9ment.<\/em><\/p><\/blockquote>\n<p>Pour faire simple, les <code>useBlockProps<\/code> attribuent automatiquement des attributs et des classes \u00e0 l&rsquo;\u00e9l\u00e9ment d&rsquo;habillage (l&rsquo;\u00e9l\u00e9ment <code>p<\/code> dans notre exemple) :<\/p>\n<figure id=\"attachment_133973\" aria-describedby=\"caption-attachment-133973\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133973 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/useblockprops.jpg\" alt=\"\u00c9l\u00e9ments et classes g\u00e9n\u00e9r\u00e9s par useBlockProps.\" width=\"2614\" height=\"966\"><figcaption id=\"caption-attachment-133973\" class=\"wp-caption-text\">\u00c9l\u00e9ments et classes g\u00e9n\u00e9r\u00e9s par useBlockProps.<\/figcaption><\/figure>\n<p>Si vous supprimez <code>useBlockProps<\/code> de l&rsquo;\u00e9l\u00e9ment wrapper, vous aurez une simple cha\u00eene de texte sans acc\u00e8s aux fonctionnalit\u00e9s et au style des blocs :<\/p>\n<figure id=\"attachment_133974\" aria-describedby=\"caption-attachment-133974\" style=\"width: 2614px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-133974 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/without-useblockprops.jpg\" alt=\"Le m\u00eame bloc sans useBlockProps.\" width=\"2614\" height=\"1016\"><figcaption id=\"caption-attachment-133974\" class=\"wp-caption-text\">Le m\u00eame bloc sans useBlockProps.<\/figcaption><\/figure>\n<p>Comme nous <a href=\"#additional-improvements\">l&rsquo;expliquerons plus tard<\/a>, vous pouvez \u00e9galement passer \u00e0 useBlockProps un objet de propri\u00e9t\u00e9s pour personnaliser la sortie.<\/p>\n<h5>RichText<\/h5>\n<p>Le composant RichText fournit une entr\u00e9e <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/HTML\/Editable_content\">dont le contenu est modifiable<\/a>, ce qui permet aux utilisateurs de modifier et de formater le contenu.<\/p>\n<p>Vous trouverez le composant document\u00e9 sur GitHub \u00e0 <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">gutenberg\/packages\/block-editor\/src\/components\/rich-text\/README.md<\/a>.<\/p>\n<h4 id=\"jsx-elements\">\u00c9tape 2 : Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/h4>\n<pre><code class=\"language-jsx\">...\n\nconst blockProps = useBlockProps();\n\nreturn (\n\t&lt;RichText \n\t\t{ ...blockProps }\n\t\ttagName=\"p\"\n\t\tonChange={ onChangeContent }\n\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\tvalue={ attributes.content }\n\t\tplaceholder={ __( 'Write your text...' ) }\n\t\/&gt;\n);<\/code><\/pre>\n<p>Commentons le code ligne par ligne :<\/p>\n<ul>\n<li><code>tagName<\/code> \u2014 nom de la balise de l&rsquo;\u00e9l\u00e9ment HTML modifiable<\/li>\n<li><code>onChange<\/code> \u2014 fonction appel\u00e9e lorsque le contenu de l&rsquo;\u00e9l\u00e9ment change<\/li>\n<li><code>allowedFormats<\/code> \u2014 tableau des formats autoris\u00e9s. Par d\u00e9faut, tous les formats sont autoris\u00e9s<\/li>\n<li><code>value<\/code> \u2014 cha\u00eene HTML \u00e0 rendre modifiable<\/li>\n<li><code>placeholder<\/code> \u2014 texte de remplacement \u00e0 afficher lorsque l&rsquo;\u00e9l\u00e9ment est vide.<\/li>\n<\/ul>\n<h4 id=\"define-attributes\">\u00c9tape 3 : D\u00e9finir les attributs n\u00e9cessaires dans le fichier block.json<\/h4>\n<p>Les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/\">attributs<\/a> fournissent des informations sur les donn\u00e9es stock\u00e9es par un bloc, comme le contenu riche, la couleur d&rsquo;arri\u00e8re-plan, les URL, etc.<\/p>\n<p>Vous pouvez d\u00e9finir un nombre arbitraire <code>attributes<\/code> dans un objet attributs sous forme de paires cl\u00e9\/valeur, o\u00f9 la cl\u00e9 est le nom de l&rsquo;attribut et la valeur est la d\u00e9finition de l&rsquo;attribut.<\/p>\n<p>Ouvrez maintenant le fichier <strong>block.json <\/strong>et ajoutez les <code>attributes<\/code> prop suivants :<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t}\n},<\/code><\/pre>\n<p>L&rsquo;attribut de <code>content<\/code> permet de stocker le texte saisi par l&rsquo;utilisateur dans le champ modifiable :<\/p>\n<ul>\n<li><code>type<\/code> indique le type de donn\u00e9es stock\u00e9es par l&rsquo;attribut. Le type est obligatoire, sauf si vous d\u00e9finissez une propri\u00e9t\u00e9 de type <code>enum<\/code>.<\/li>\n<li><code>source<\/code> d\u00e9finit comment la valeur de l&rsquo;attribut est extraite du contenu de l&rsquo;article. Dans notre exemple, il s&rsquo;agit du contenu HTML. Notez que si vous ne fournissez pas de propri\u00e9t\u00e9 source, les donn\u00e9es sont stock\u00e9es dans le d\u00e9limiteur de bloc (<a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-attributes\/#value-source\">en savoir plus<\/a>).<\/li>\n<li><code>selector<\/code> est une balise HTML ou tout autre s\u00e9lecteur, tel qu&rsquo;un nom de classe ou un attribut id.<\/li>\n<\/ul>\n<p>Nous allons passer \u00e0 la fonction <code>Edit<\/code> un objet de propri\u00e9t\u00e9s. Donc, retournez au fichier <strong>edit.js <\/strong>et faites la modification suivante :<\/p>\n<pre><code class=\"language-js\">export default function Edit( { attributes, setAttributes } ) { ... }<\/code><\/pre>\n<h4 id=\"define-event-handlers\">\u00c9tape 4 : D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/h4>\n<p>L&rsquo;\u00e9l\u00e9ment <code>RichText<\/code> poss\u00e8de un attribut <code>onChange<\/code>, qui fournit une fonction \u00e0 appeler lorsque le contenu de l&rsquo;\u00e9l\u00e9ment change.<\/p>\n<p>D\u00e9finissons cette fonction et voyons l&rsquo;ensemble du script <strong>edit.js :<\/strong><\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\nimport '.\/editor.scss';\n\nexport default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\n\treturn (\n\t\t&lt;RichText \n\t\t\t{ ...blockProps }\n\t\t\ttagName=\"p\"\n\t\t\tonChange={ onChangeContent }\n\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\tvalue={ attributes.content }\n\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Enregistrez maintenant le fichier et retournez \u00e0 votre tableau de bord WordPress, cr\u00e9ez un nouvel article ou une nouvelle page et ajoutez votre bloc personnalis\u00e9 :<\/p>\n<figure id=\"attachment_134001\" aria-describedby=\"caption-attachment-134001\" style=\"width: 2618px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134001 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/rich-text-component.jpg\" alt=\"La sortie du composant RichText dans l'\u00e9diteur de blocs.\" width=\"2618\" height=\"960\"><figcaption id=\"caption-attachment-134001\" class=\"wp-caption-text\">La sortie du composant RichText dans l&rsquo;\u00e9diteur de blocs.<\/figcaption><\/figure>\n<p>Ajoutez du texte et passez \u00e0 la vue Code. Voici \u00e0 quoi devrait ressembler votre code :<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\"&gt;Kinsta Academy Block \u2013 hello from the saved content!&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<p>Comme vous pouvez le voir, si vous passez \u00e0 l&rsquo;\u00e9diteur de code, le contenu de votre bloc a chang\u00e9. C&rsquo;est parce que vous devez modifier le fichier <strong>save.js <\/strong>pour stocker les entr\u00e9es de l&rsquo;utilisateur dans la base de donn\u00e9es lorsque l&rsquo;article est enregistr\u00e9.<\/p>\n<h4 id=\"save-data\">\u00c9tape 5 : Enregistrer les donn\u00e9es<\/h4>\n<p>Ouvrez maintenant le fichier <strong>save.js <\/strong>et modifiez le script comme suit :<\/p>\n<pre><code class=\"language-jsx\">import { __ } from '@wordpress\/i18n';\nimport { useBlockProps, RichText } from '@wordpress\/block-editor';\n\nexport default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>C&rsquo;est ce que nous faisons ici :<\/p>\n<ul>\n<li>Importez le composant <code>RichText<\/code> du paquetage <code>block-editor<\/code>.<\/li>\n<li>Passez plusieurs propri\u00e9t\u00e9s \u00e0 la fonction de <code>save<\/code> via un argument objet (dans cet exemple, nous ne passons que les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#attributes\"><code>attributs<\/code>property<\/a>).<\/li>\n<li>Renvoie le contenu du composant <code>RichText<\/code><\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Chaque fois que vous modifiez la fonction d&rsquo;enregistrement, vous devez supprimer toute instance de bloc dans le canevas de l&rsquo;\u00e9diteur et l&rsquo;inclure \u00e0 nouveau pour qu&rsquo;elle fonctionne correctement. En savoir plus sur la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#validation\">validation des blocs<\/a>.<\/p>\n<\/aside>\n\n<figure id=\"attachment_134002\" aria-describedby=\"caption-attachment-134002\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134002 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-content-in-the-code-editor.jpg\" alt=\"Le contenu du bloc a \u00e9t\u00e9 enregistr\u00e9 dans la base de donn\u00e9es.\" width=\"1770\" height=\"1000\"><figcaption id=\"caption-attachment-134002\" class=\"wp-caption-text\">Le contenu du bloc a \u00e9t\u00e9 enregistr\u00e9 dans la base de donn\u00e9es.<\/figcaption><\/figure>\n<p>Vous pouvez en savoir plus sur le composant <code>RichText<\/code> dans le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/richtext\/\">manuel de l&rsquo;\u00e9diteur de blocs<\/a> et trouver la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/HEAD\/packages\/block-editor\/src\/components\/rich-text\/README.md\">liste compl\u00e8te des props sur Github<\/a>.<\/p>\n<p>Allons maintenant un peu plus loin. Dans la section suivante, vous apprendrez \u00e0 ajouter des contr\u00f4les \u00e0 la barre d&rsquo;outils du bloc.<\/p>\n<h3 id=\"adding-block-toolbar-controls\">Ajout de contr\u00f4les \u00e0 la barre d&rsquo;outils du bloc<\/h3>\n<p>La <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">barre d&rsquo;outils du bloc<\/a> contient un ensemble de contr\u00f4les permettant aux utilisateurs de manipuler des parties du contenu du bloc. Pour chaque contr\u00f4le de la barre d&rsquo;outils, vous trouverez un composan\u00a0:<\/p>\n<figure id=\"attachment_134007\" aria-describedby=\"caption-attachment-134007\" style=\"width: 1212px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134007 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/paragraph-toolbar.jpg\" alt=\"La barre d'outils du bloc de paragraphe principal.\" width=\"1212\" height=\"242\"><figcaption id=\"caption-attachment-134007\" class=\"wp-caption-text\">La barre d&rsquo;outils du bloc de paragraphe principal.<\/figcaption><\/figure>\n<p>Par exemple, vous pouvez ajouter un contr\u00f4le d&rsquo;alignement du texte pour votre bloc. Il vous suffit d&rsquo;importer deux composants du paquetage <code>@wordpress\/block-editor<\/code>.<\/p>\n<p>Nous allons suivre les m\u00eames \u00e9tapes que dans l&rsquo;exemple pr\u00e9c\u00e9dent :<\/p>\n<ol>\n<li>Importer les composants n\u00e9cessaires \u00e0 partir des paquets WordPress<\/li>\n<li>Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/li>\n<li>D\u00e9finir les attributs n\u00e9cessaires dans le fichier <strong>block.json<\/strong><\/li>\n<li>D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/li>\n<li>Enregistrer les donn\u00e9es<\/li>\n<\/ol>\n<h4>\u00c9tape 1 : Importer les composants BlockControls et AlignmentControl de @wordpress\/block-editor<\/h4>\n<p>Pour ajouter un contr\u00f4le d&rsquo;alignement \u00e0 la barre d&rsquo;outils du bloc, vous avez besoin de deux composants :<\/p>\n<ul>\n<li><code>BlockControls<\/code> rend une barre d&rsquo;outils dynamique de contr\u00f4les (non document\u00e9).<\/li>\n<li><code>AlignmentControl<\/code> rend un menu d\u00e9roulant qui affiche les options d&rsquo;alignement pour le bloc s\u00e9lectionn\u00e9 (<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/alignment-control\/README.md\">en savoir plus<\/a>).<\/li>\n<\/ul>\n<p>Ouvrez le fichier <strong>edit.js <\/strong>et modifiez l&rsquo;instruction <code>import<\/code> comme indiqu\u00e9 ci-dessous :<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls \n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>\u00c9tape 2 : Ajouter les \u00e9l\u00e9ments BlockControls et AlignmentControl<\/h4>\n<p>Allez dans la fonction <code>Edit<\/code> et ins\u00e9rez l&rsquo;\u00e9l\u00e9ment <code>&lt;BlockControls \/&gt;<\/code> au m\u00eame niveau que <code>&lt;RichText \/&gt;<\/code>. Ajoutez ensuite un <code>&lt;AlignmentControl \/&gt;<\/code> \u00e0 l&rsquo;int\u00e9rieur de <code>&lt;BlockControls \/&gt;<\/code> :<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Dans le code ci-dessus, <code>&lt;&gt;<\/code> et <code>&lt;\/&gt;<\/code> sont la syntaxe courte pour d\u00e9clarer les <a href=\"https:\/\/reactjs.org\/docs\/fragments.html#short-syntax\">fragments React<\/a>, qui sont la fa\u00e7on dont nous retournons plusieurs \u00e9l\u00e9ments dans React.<\/p>\n<p>Dans cet exemple, <code>AlignmentControl<\/code> poss\u00e8de deux attributs :<\/p>\n<ul>\n<li><code>value<\/code> fournit la valeur actuelle de l&rsquo;\u00e9l\u00e9ment<\/li>\n<li><code>onChange<\/code> fournit un <a href=\"https:\/\/reactjs.org\/docs\/handling-events.html\">gestionnaire d&rsquo;\u00e9v\u00e9nement<\/a> \u00e0 ex\u00e9cuter lorsque la valeur change.<\/li>\n<\/ul>\n<p>Nous avons \u00e9galement d\u00e9fini des attributs suppl\u00e9mentaires pour l&rsquo;\u00e9l\u00e9ment <code>RichText<\/code> (consultez la <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/rich-text\/README.md\">liste compl\u00e8te des attributs avec des exemples<\/a>)<\/p>\n<h4>\u00c9tape 3 : D\u00e9finir l&rsquo;attribut align dans block.json<\/h4>\n<p>Maintenant, allez dans le fichier <strong>block.json <\/strong>et ajoutez l&rsquo;attribut <code>align<\/code> :<\/p>\n<pre><code class=\"language-json\">\"align\": {\n\t\"type\": \"string\",\n\t\"default\": \"none\"\n}<\/code><\/pre>\n<p>Quand vous avez termin\u00e9, retournez \u00e0 l&rsquo;\u00e9diteur de bloc, actualisez la page et s\u00e9lectionnez le bloc. Vous devriez voir un message d&rsquo;erreur dans votre bloc.<\/p>\n<figure id=\"attachment_134008\" aria-describedby=\"caption-attachment-134008\" style=\"width: 1770px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134008 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-showing-an-error-message.jpg\" alt=\"Le bloc affiche un message d'erreur\" width=\"1770\" height=\"818\"><figcaption id=\"caption-attachment-134008\" class=\"wp-caption-text\">Le bloc affiche un message d&rsquo;erreur<\/figcaption><\/figure>\n<p>La raison en est que nous n&rsquo;avons pas encore d\u00e9fini notre gestionnaire d&rsquo;\u00e9v\u00e9nements.<\/p>\n<h4>\u00c9tape 4 : D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/h4>\n<p>D\u00e9finissez maintenant <code>onChangeAlign<\/code>:<\/p>\n<pre><code class=\"language-js\">const onChangeAlign = ( newAlign ) =&gt; {\n\tsetAttributes( { \n\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t} )\n}<\/code><\/pre>\n<p>Si <code>newAlign<\/code> est <code>undefined<\/code>, alors nous mettons <code>newAlign<\/code> \u00e0 <code>none<\/code>. Sinon, nous utilisons <code>newAlign<\/code>.<\/p>\n<p>Notre script <strong>edit.js <\/strong>devrait \u00eatre complet (pour l&rsquo;instant) :<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ attributes.align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ attributes.content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Vous pouvez maintenant retourner dans l&rsquo;\u00e9diteur et aligner le contenu du bloc. Votre bloc devrait maintenant afficher fi\u00e8rement une barre d&rsquo;outils d&rsquo;alignement.<\/p>\n<figure id=\"attachment_134009\" aria-describedby=\"caption-attachment-134009\" style=\"width: 1772px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134009 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/alignment-toolbar.jpg\" alt=\"Notre bloc poss\u00e8de maintenant une barre d'outils d'alignement\" width=\"1772\" height=\"702\"><figcaption id=\"caption-attachment-134009\" class=\"wp-caption-text\">Notre bloc poss\u00e8de maintenant une barre d&rsquo;outils d&rsquo;alignement<\/figcaption><\/figure>\n<p>Mais si vous enregistrez l&rsquo;article, vous verrez que le contenu de votre bloc n&rsquo;est pas align\u00e9 sur l&rsquo;interface publique comme il l&rsquo;est dans l&rsquo;\u00e9diteur de bloc. C&rsquo;est parce que nous devons modifier la fonction <code>save<\/code> afin de boutique le contenu et les attributs du bloc dans la base de donn\u00e9es.<\/p>\n<h4>\u00c9tape 5 : Sauvegarder les donn\u00e9es<\/h4>\n<p>Ouvrez <strong>save.js <\/strong>et modifiez la fonction <code>save<\/code> comme suit :<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ attributes.content } \n\t\t\tstyle={ { textAlign: attributes.align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Enfin, pour rendre le code plus lisible, vous pouvez extraire les propri\u00e9t\u00e9s individuelles de l&rsquo;objet <code>attribute<\/code> en utilisant la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/Destructuring_assignment\">syntaxe d&rsquo;affectation de la d\u00e9structuration<\/a> :<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Vous pouvez faire de m\u00eame dans le fichier <strong>edit.js<\/strong>.<\/p>\n<p>Enregistrez maintenant le fichier et passez \u00e0 l&rsquo;\u00e9diteur de code. Le code du bloc devrait ressembler \u00e0 quelque chose comme ceci :<\/p>\n<pre><code class=\"language-html\">&lt;!-- wp:ka-example-block\/ka-example-block {\"align\":\"right\"} --&gt;\n&lt;p class=\"wp-block-ka-example-block-ka-example-block\" style=\"text-align:right\"&gt;This is my first editable &lt;strong&gt;Gutenberg&lt;\/strong&gt; &lt;em&gt;block&lt;\/em&gt; \ud83d\ude0e&lt;\/p&gt;\n&lt;!-- \/wp:ka-example-block\/ka-example-block --&gt;<\/code><\/pre>\n<figure id=\"attachment_134010\" aria-describedby=\"caption-attachment-134010\" style=\"width: 1446px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134010 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-toolbar-controls.jpg\" alt=\"V\u00e9rification des contr\u00f4les de la barre d'outils du bloc\" width=\"1446\" height=\"498\"><figcaption id=\"caption-attachment-134010\" class=\"wp-caption-text\">V\u00e9rification des contr\u00f4les de la barre d&rsquo;outils du bloc<\/figcaption><\/figure>\n<p>Voil\u00e0, c&rsquo;est fait ! Vous venez d&rsquo;ajouter un contr\u00f4le d&rsquo;alignement \u00e0 la barre d&rsquo;outils du bloc \ud83e\udd13.<\/p>\n<p>Vous pouvez en savoir plus sur les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">commandes de la barre d&rsquo;outils du bloc<\/a> dans le manuel de l&rsquo;\u00e9diteur de bloc.<\/p>\n<h3 id=\"settings-sidebar\">Personnalisation de la colonne lat\u00e9rale des r\u00e9glages du bloc<\/h3>\n<p>Vous pouvez \u00e9galement ajouter des contr\u00f4les \u00e0 la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/\">colonne lat\u00e9rale des r\u00e9glages<\/a> du bloc (ou m\u00eame cr\u00e9er une nouvelle colonne lat\u00e9rale pour votre application).<\/p>\n<p>L&rsquo;API fournit un <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\">composant<\/a> <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inspector-controls\/README.md\"><code>InspectorControls<\/code><\/a> pour cela.<\/p>\n<p>Le manuel de l&rsquo;\u00e9diteur de blocs explique <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/block-controls-toolbar-and-sidebar\/#settings-sidebar\">comment utiliser la colonne lat\u00e9rale des r\u00e9glages<\/a> :<\/p>\n<blockquote><p><em>La colonne lat\u00e9rale des r\u00e9glages est utilis\u00e9e pour afficher les r\u00e9glages moins souvent utilis\u00e9s ou ceux qui n\u00e9cessitent plus d&rsquo;espace \u00e0 l&rsquo;\u00e9cran. La colonne lat\u00e9rale des r\u00e9glages <strong>ne doit \u00eatre utilis\u00e9e que pour les r\u00e9glages au niveau du bloc<\/strong>.<\/em><\/p>\n<p><em>Si vous disposez de r\u00e9glages qui n&rsquo;affectent que le contenu s\u00e9lectionn\u00e9 \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc (par exemple, le r\u00e9glage \u00ab gras \u00bb pour le texte s\u00e9lectionn\u00e9 dans un paragraphe), <\/em>ne les placez pas dans la colonne lat\u00e9rale des r\u00e9glages.<em> La colonne lat\u00e9rale des r\u00e9glages s&rsquo;affiche m\u00eame lors de l&rsquo;\u00e9dition d&rsquo;un bloc en mode HTML. Elle ne doit donc contenir que les r\u00e9glages relatifs aux blocs.<\/em><\/p><\/blockquote>\n<p>Encore une fois :<\/p>\n<ol>\n<li>Importer les composants n\u00e9cessaires \u00e0 partir des paquets WordPress<\/li>\n<li>Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/li>\n<li>D\u00e9finir les attributs n\u00e9cessaires dans le fichier block.json<\/li>\n<li>D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/li>\n<li>Enregistrer les donn\u00e9es<\/li>\n<\/ol>\n<h4>\u00c9tape 1. Importation des composants InspectorControls et PanelColorSettings depuis @wordpress\/block-editor<\/h4>\n<p>Vous pouvez ajouter plusieurs contr\u00f4les pour permettre aux utilisateurs de personnaliser des aspects sp\u00e9cifiques du bloc. Par exemple, vous pouvez fournir un panneau de contr\u00f4le des couleurs. Pour ce faire, vous devez importer les composants <code>InspectorControls<\/code> et <code>PanelColorSettings<\/code> du module <code>block-editor<\/code> :<\/p>\n<pre><code class=\"language-js\">import { \n\tuseBlockProps, \n\tRichText, \n\tAlignmentControl, \n\tBlockControls,\n\tInspectorControls,\n\tPanelColorSettings\n} from '@wordpress\/block-editor';<\/code><\/pre>\n<h4>\u00c9tape 2 : Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/h4>\n<p>Vous pouvez maintenant ajouter les \u00e9l\u00e9ments correspondants au JSX renvoy\u00e9 par la fonction <code>Edit<\/code> :<\/p>\n<pre><code class=\"language-jsx\">export default function Edit( { attributes, setAttributes } ) {\n\tconst blockProps = useBlockProps();\n\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\n\tconst onChangeContent = ( newContent ) =&gt; {\n\t\tsetAttributes( { content: newContent } )\n\t}\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\treturn (\n\t\t&lt;&gt;\n\t\t\t&lt;InspectorControls&gt;\n\t\t\t\t&lt;PanelColorSettings \n\t\t\t\t\ttitle={ __( 'Color settings', 'ka-example-block' ) }\n\t\t\t\t\tinitialOpen={ false }\n\t\t\t\t\tcolorSettings={ [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: textColor,\n\t\t\t\t\t\t  onChange: onChangeTextColor,\n\t\t\t\t\t\t  label: __( 'Text color', 'ka-example-block' )\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t  value: backgroundColor,\n\t\t\t\t\t\t  onChange: onChangeBackgroundColor,\n\t\t\t\t\t\t  label: __( 'Background color', 'ka-example-block' )\n\t\t\t\t\t\t}\n\t\t\t\t\t] }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/InspectorControls&gt;\n\t\t\t&lt;BlockControls&gt;\n\t\t\t\t&lt;AlignmentControl\n\t\t\t\t\tvalue={ align }\n\t\t\t\t\tonChange={ onChangeAlign }\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/BlockControls&gt;\n\t\t\t&lt;RichText \n\t\t\t\t{ ...blockProps }\n\t\t\t\ttagName=\"p\"\n\t\t\t\tonChange={ onChangeContent }\n\t\t\t\tallowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t\t\t\tvalue={ content }\n\t\t\t\tplaceholder={ __( 'Write your text...' ) }\n\t\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\t\/&gt;\n\t\t&lt;\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Notez que nous avons \u00e9galement mis \u00e0 jour l&rsquo;attribut <code>style<\/code> de l&rsquo;\u00e9l\u00e9ment <code>RichText<\/code> :<\/p>\n<pre><code class=\"language-jsx\">&lt;RichText \n\t { ...blockProps }\n\t tagName=\"p\"\n\t onChange={ onChangeContent }\n\t allowedFormats={ [ 'core\/bold', 'core\/italic' ] }\n\t value={ content }\n\t placeholder={ __( 'Write your text...' ) }\n\t style={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\/&gt;<\/code><\/pre>\n<h4>\u00c9tape 3 : D\u00e9finir les attributs n\u00e9cessaires dans block.json<\/h4>\n<p>D\u00e9finissez maintenant les attributs <code>backgroundColor<\/code> et <code>textColor<\/code> dans le fichier <strong>block.json <\/strong>:<\/p>\n<pre><code class=\"language-json\">\"attributes\": {\n\t\"content\": {\n\t\t\"type\": \"string\",\n\t\t\"source\": \"html\",\n\t\t\"selector\": \"p\"\n\t},\n\t\"align\": {\n\t\t\"type\": \"string\",\n\t\t\"default\": \"none\"\n\t},\n\t\"backgroundColor\": {\n\t\t\"type\": \"string\"\n\t},\t \n\t\"textColor\": {\n\t\t\"type\": \"string\"\n\t}\n},<\/code><\/pre>\n<h4>\u00c9tape 4 : D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/h4>\n<p>Vous devez maintenant d\u00e9finir deux fonctions pour mettre \u00e0 jour <code>backgroundColor<\/code> et <code>textColor<\/code> en fonction des entr\u00e9es de l&rsquo;utilisateur :<\/p>\n<pre><code class=\"language-js\">const onChangeBackgroundColor = ( newBackgroundColor ) =&gt; {\n\tsetAttributes( { backgroundColor: newBackgroundColor } )\n}\n\nconst onChangeTextColor = ( newTextColor ) =&gt; {\n\tsetAttributes( { textColor: newTextColor } )\n}<\/code><\/pre>\n<h4>\u00c9tape 5 : Enregistrer les donn\u00e9es<\/h4>\n<p>Une derni\u00e8re \u00e9tape : Ouvrez le fichier <strong>save.js <\/strong>et modifiez le script comme suit :<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\tconst blockProps = useBlockProps.save();\n\tconst { content, align, backgroundColor, textColor } = attributes;\n\treturn (\n\t\t&lt;RichText.Content \n\t\t\t{ ...blockProps } \n\t\t\ttagName=\"p\" \n\t\t\tvalue={ content } \n\t\t\tstyle={ { textAlign: align, backgroundColor: backgroundColor, color: textColor } }\n\t\t\/&gt;\n\t);\n}<\/code><\/pre>\n<p>Enregistrez le fichier et v\u00e9rifiez le bloc dans l&rsquo;\u00e9diteur. Vous trouverez peut-\u00eatre une mauvaise surprise : un message d&rsquo;erreur vous informant que le bloc contient un contenu inattendu ou non valide.<\/p>\n<figure id=\"attachment_134011\" aria-describedby=\"caption-attachment-134011\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134011 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/unexpected-or-invalid-content.jpg\" alt=\"Message d'erreur sur le contenu inattendu ou non valide\" width=\"1396\" height=\"542\"><figcaption id=\"caption-attachment-134011\" class=\"wp-caption-text\">Message d&rsquo;erreur sur le contenu inattendu ou non valide<\/figcaption><\/figure>\n<p>Cela se produit parce que le fichier <strong>save.js<\/strong> est modifi\u00e9 et que le code enregistr\u00e9 dans la base de donn\u00e9es ne correspond pas au code utilis\u00e9 dans l&rsquo;\u00e9diteur.<\/p>\n<p>Pour r\u00e9soudre ce probl\u00e8me, actualisez la page, supprimez toute instance de votre bloc et ajoutez-le \u00e0 nouveau \u00e0 votre publication :<\/p>\n<figure id=\"attachment_134012\" aria-describedby=\"caption-attachment-134012\" style=\"width: 1962px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134012 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/color-settings-panel.jpg\" alt=\"Le panneau des r\u00e9glages de couleur dans la colonne lat\u00e9rale du bloc R\u00e9glage des couleurs\" width=\"1962\" height=\"1020\"><figcaption id=\"caption-attachment-134012\" class=\"wp-caption-text\">Le panneau des r\u00e9glages de couleur dans la colonne lat\u00e9rale du bloc R\u00e9glage des couleurs<\/figcaption><\/figure>\n<p>Apportez vos modifications, enregistrez l&rsquo;article et affichez-le dans le site principal. Les modifications que vous avez apport\u00e9es dans l&rsquo;\u00e9diteur de blocs doivent \u00eatre refl\u00e9t\u00e9es sur le site principal.<\/p>\n<figure id=\"attachment_134013\" aria-describedby=\"caption-attachment-134013\" style=\"width: 1918px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134013 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/custom-settings-applied.jpg\" alt=\"Le bloc personnalis\u00e9 fonctionne d\u00e9sormais correctement sur l'interface publique\" width=\"1918\" height=\"628\"><figcaption id=\"caption-attachment-134013\" class=\"wp-caption-text\">Le bloc personnalis\u00e9 fonctionne d\u00e9sormais correctement sur l&rsquo;interface publique<\/figcaption><\/figure>\n<h3 id=\"external-link\">Ajout et personnalisation d&rsquo;un lien externe<\/h3>\n<p>Dans cette section, vous allez ajouter de nouveaux composants \u00e0 votre type de bloc :<\/p>\n<ul>\n<li>Un composant <code>ExternalLink<\/code> permettant aux utilisateurs d&rsquo;ajouter un lien personnalisable \u00e0 votre bloc personnalis\u00e9<\/li>\n<li>Plusieurs contr\u00f4les de la colonne lat\u00e9rale permettant aux utilisateurs de personnaliser les r\u00e9glages des liens.<\/li>\n<\/ul>\n<h4>\u00c9tape 1. Importez les composants depuis @wordpress\/components<\/h4>\n<p>Maintenant, vous devez importer plusieurs composants de <code>@wordpress\/components<\/code>. Ouvrez votre fichier edit.js et ajoutez l&rsquo;instruction <code>import<\/code> suivante :<\/p>\n<pre><code class=\"language-js\">import {\n\tTextControl,\n\tPanelBody,\n\tPanelRow,\n\tToggleControl,\n\tExternalLink\n} from '@wordpress\/components';<\/code><\/pre>\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelbody\"><code>PanelBody<\/code><\/a> ajoute un conteneur pliable \u00e0 la colonne lat\u00e9rale des r\u00e9glages.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/panel\/README.md#panelrow\"><code>PaneRow<\/code><\/a> produit un conteneur g\u00e9n\u00e9rique pour les contr\u00f4les de la colonne lat\u00e9rale.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/text-control\/README.md\"><code>TextControl<\/code><\/a> fournit un contr\u00f4le de saisie de texte.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/toggle-control\/README.md\"><code>ToggleControl<\/code><\/a> fournit une bascule permettant aux utilisateurs d&rsquo;activer\/d\u00e9sactiver une option sp\u00e9cifique.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/README.md\"><code>ExternalLink<\/code><\/a> est un composant simple pour ajouter un lien externe.<\/li>\n<\/ul>\n<h4>\u00c9tape 2. Inclure les \u00e9l\u00e9ments correspondants dans votre code JSX<\/h4>\n<p>Vous allez d&rsquo;abord ajouter l&rsquo;\u00e9l\u00e9ment <code>ExternalLink<\/code> au m\u00eame niveau que <code>RichText<\/code> dans un conteneur <code>div<\/code> :<\/p>\n<pre><code class=\"language-jsx\">&lt;div { ...blockProps }&gt;\n\t&lt;RichText \n\t\t...\n\t\/&gt;\n\t&lt;ExternalLink \n\t\thref={ kaLink }\n\t\tclassName=\"ka-button\"\n\t\trel={ hasLinkNofollow ? \"nofollow\" : \"\" }\n\t&gt;\n\t\t\t{ linkLabel }\n\t&lt;\/ExternalLink&gt;\n\n&lt;\/div&gt;<\/code><\/pre>\n<p>Le composant <code>ExternalLink<\/code> n&rsquo;est pas document\u00e9, nous nous sommes donc r\u00e9f\u00e9r\u00e9s au <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/components\/src\/external-link\/index.js\">composant lui-m\u00eame<\/a> pour obtenir la liste des attributs disponibles. Ici, nous utilisons les attributs <code>href<\/code>, <code>className<\/code> et <code>rel<\/code>.<\/p>\n<p>Par d\u00e9faut, la valeur de l&rsquo;attribut <code>rel<\/code> est d\u00e9finie sur <code>noopener noreferrer<\/code>. Notre code ajoutera le <a href=\"https:\/\/kinqsta.com\/fr\/blog\/comment-ajouter-liens-nofollow-dans-wordpress\/\"><code>nofollow<\/code> mot cl\u00e9<\/a> \u00e0 l&rsquo;attribut <code>rel<\/code> de la balise <code>a<\/code> r\u00e9sultante lorsque la commande de basculement sera <strong>activ\u00e9e<\/strong>.<\/p>\n<p>Vous pouvez maintenant ajouter des r\u00e9glages de liens dans la colonne lat\u00e9rale du bloc.<\/p>\n<p>Tout d&rsquo;abord, vous allez ajouter un \u00e9l\u00e9ment <code>PanelBody<\/code> dans <code>InspectorControls<\/code>, au m\u00eame niveau que <code>PanelColorSettings<\/code> :<\/p>\n<pre><code class=\"language-jsx\">&lt;InspectorControls&gt;\n\t&lt;PanelColorSettings \n\t...\n\t\/&gt;\n\t&lt;PanelBody \n\t\ttitle={ __( 'Link Settings' )}\n\t\tinitialOpen={true}\n\t&gt;\n\t...\n\t&lt;\/PanelBody&gt;\n&lt;\/InspectorControls&gt;<\/code><\/pre>\n<p>Voici ce que nous faisons avec \u00e7a :<\/p>\n<ol>\n<li>L&rsquo;attribut <code>title<\/code> fournit le titre du panneau.<\/li>\n<li><code>initialOpen<\/code> d\u00e9finit si le panneau est initialement ouvert ou non.<\/li>\n<\/ol>\n<p>Ensuite, nous allons ajouter deux \u00e9l\u00e9ments <code>PanelRow<\/code> \u00e0 l&rsquo;int\u00e9rieur de <code>PanelBody<\/code>, et un \u00e9l\u00e9ment <code>TextControl<\/code> \u00e0 l&rsquo;int\u00e9rieur de chaque <code>PanelRow<\/code> :<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelBody \n\ttitle={ __( 'Link Settings', 'ka-example-block' )}\n\tinitialOpen={true}\n&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'KA link', 'ka-example-block' )}\n\t\t\t\tvalue={ kaLink }\n\t\t\t\tonChange={ onChangeKaLink }\n\t\t\t\thelp={ __( 'Add your Academy link', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n\t&lt;PanelRow&gt;\n\t\t&lt;fieldset&gt;\n\t\t\t&lt;TextControl\n\t\t\t\tlabel={__( 'Link label', 'ka-example-block' )}\n\t\t\t\tvalue={ linkLabel }\n\t\t\t\tonChange={ onChangeLinkLabel }\n\t\t\t\thelp={ __( 'Add link label', 'ka-example-block' )}\n\t\t\t\/&gt;\n\t\t&lt;\/fieldset&gt;\n\t&lt;\/PanelRow&gt;\n&lt;\/PanelBody&gt;<\/code><\/pre>\n<p>Le code ci-dessus devrait maintenant avoir l&rsquo;air assez simple. Les deux contr\u00f4les de texte permettent aux utilisateurs de d\u00e9finir le libell\u00e9 du lien et l&rsquo;URL.<\/p>\n<p>Nous ajouterons \u00e9galement un <code>PanelRow<\/code> suppl\u00e9mentaire avec un <code>ToggleControl<\/code> pour activer\/d\u00e9sactiver une option sp\u00e9cifique, comme l&rsquo;inclusion ou non d&rsquo;un attribut :<\/p>\n<pre><code class=\"language-jsx\">&lt;PanelRow&gt;\n\t&lt;fieldset&gt;\n\t\t&lt;ToggleControl\n\t\t\tlabel=\"Add rel = nofollow\"\n\t\t\thelp={\n\t\t\t\thasLinkNofollow\n\t\t\t\t\t? 'Has rel nofollow.'\n\t\t\t\t\t: 'No rel nofollow.'\n\t\t\t}\n\t\t\tchecked={ hasLinkNofollow }\n\t\t\tonChange={ toggleNofollow }\n\t\t\/&gt;\n\t&lt;\/fieldset&gt;\n&lt;\/PanelRow&gt;<\/code><\/pre>\n<h4>\u00c9tape 3 : D\u00e9finir les attributs n\u00e9cessaires dans block.json<\/h4>\n<p>D\u00e9finissez maintenant les attributs <code>kaLink<\/code>, <code>linkLabel<\/code> et <code>hasLinkNofollow<\/code> dans le fichier <strong>block.json <\/strong>:<\/p>\n<pre><code class=\"language-json\">\"kaLink\": {\n\t\"type\": \"string\",\n\t\"default\": \"\"\n},\n\"linkLabel\": {\n\t\"type\": \"string\",\n\t\"default\": \"Check it out!\"\n},\n\"hasLinkNofollow\": {\n\t\"type\": \"boolean\",\n\t\"default\": false\n}<\/code><\/pre>\n<p>Rien de plus \u00e0 ajouter ici ! Passons \u00e0 la d\u00e9finition des <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Events\/Event_handlers\">fonctions de gestion des \u00e9v\u00e9nements<\/a>.<\/p>\n<h4>\u00c9tape 4 : D\u00e9finir les gestionnaires d&rsquo;\u00e9v\u00e9nements<\/h4>\n<p>Revenez au fichier <strong>edit.js<\/strong>, ajoutez les nouveaux attributs \u00e0 l&rsquo;objet attributes, et ajoutez les fonctions suivantes :<\/p>\n<pre><code class=\"language-js\">const { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\nconst onChangeKaLink = ( newKaLink ) =&gt; {\n\tsetAttributes( { kaLink: newKaLink === undefined ? '' : newKaLink } )\n}\n\nconst onChangeLinkLabel = ( newLinkLabel ) =&gt; {\n\tsetAttributes( { linkLabel: newLinkLabel === undefined ? '' : newLinkLabel } )\n}\n\nconst toggleNofollow = () =&gt; {\n\tsetAttributes( { hasLinkNofollow: ! hasLinkNofollow } )\n}<\/code><\/pre>\n<p>Ces fonctions mettent \u00e0 jour les valeurs des attributs correspondants lors de la saisie par l&rsquo;utilisateur.<\/p>\n<h4>\u00c9tape 5 : Enregistrer les donn\u00e9es<\/h4>\n<p>Enfin, nous devons mettre \u00e0 jour la fonction de <code>save<\/code> dans <strong>save.js <\/strong>:<\/p>\n<pre><code class=\"language-jsx\">export default function save( { attributes } ) {\n\t\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t\n\treturn (\n\t\t&lt;div \n\t\t\t{ ...blockProps }\n\t\t\tstyle={ { backgroundColor: backgroundColor } }\n\t\t&gt;\n\t\t\t&lt;RichText.Content \n\t\t\t\ttagName=\"p\" \n\t\t\t\tvalue={ content } \n\t\t\t\tstyle={ { color: textColor } }\n\t\t\t\/&gt;\n\t\t\t&lt;p&gt;\n\t\t\t\t&lt;a \n\t\t\t\t\thref={ kaLink }\n\t\t\t\t\tclassName=\"ka-button\"\n\t\t\t\t\trel={ hasLinkNofollow ? \"nofollow\" : \"noopener noreferrer\" }\n\t\t\t\t&gt;\n\t\t\t\t\t{ linkLabel }\n\t\t\t\t&lt;\/a&gt;\n\t\t\t&lt;\/p&gt;\n\t\t&lt;\/div&gt;\n\t);\n}<\/code><\/pre>\n<p>Notez qu&rsquo;ici nous avons utilis\u00e9 un \u00e9l\u00e9ment <code>a<\/code> normal au lieu de <code>ExternalLink<\/code> .<\/p>\n<p>Vous pouvez voir le r\u00e9sultat dans l&rsquo;image ci-dessous.<\/p>\n<figure id=\"attachment_134015\" aria-describedby=\"caption-attachment-134015\" style=\"width: 1964px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134015 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/link-settings.jpg\" alt=\"Le panneau des r\u00e9glages du lien dans la colonne lat\u00e9rale des r\u00e9glages du bloc\" width=\"1964\" height=\"1146\"><figcaption id=\"caption-attachment-134015\" class=\"wp-caption-text\">Le panneau des r\u00e9glages du lien dans la colonne lat\u00e9rale des r\u00e9glages du bloc<\/figcaption><\/figure>\n<h3 id=\"multiple-block-styles\">Ajout de styles de blocs multiples<\/h3>\n<p>Dans une section pr\u00e9c\u00e9dente, vous avez appris \u00e0 ajouter un contr\u00f4le de barre d&rsquo;outils de bloc permettant aux utilisateurs d&rsquo;aligner la saisie de l&rsquo;utilisateur. Nous pouvons ajouter d&rsquo;autres contr\u00f4les de style \u00e0 la barre d&rsquo;outils de bloc, mais nous pouvons \u00e9galement fournir un ensemble de styles de bloc pr\u00e9d\u00e9finis parmi lesquels l&rsquo;utilisateur peut choisir d&rsquo;un simple clic.<\/p>\n<p>\u00c0 cette fin, nous allons utiliser une fonctionnalit\u00e9 utile de l&rsquo;API de bloc : les <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-metadata\/#block-styles\">styles de bloc<\/a>.<\/p>\n<p>Il vous suffit de d\u00e9finir la propri\u00e9t\u00e9 styles du fichier<strong> block.json <\/strong>et de d\u00e9clarer les <code>styles<\/code> correspondants dans vos feuilles de style.<\/p>\n<p>Par exemple, vous pouvez ajouter le tableau de styles suivant :<\/p>\n<pre><code class=\"language-json\">\"styles\": [\n\t{\n\t\t\"name\": \"default\",\n\t\t\"label\": \"Default\",\n\t\t\"isDefault\": true\n\t},\n\t{\n\t\t\"name\": \"border\",\n\t\t\"label\": \"Border\"\n\t}\n],<\/code><\/pre>\n<p>Ainsi, vous venez d&rsquo;ajouter un style par d\u00e9faut et un style suppl\u00e9mentaire appel\u00e9 <code>border<\/code>. Revenez maintenant \u00e0 l&rsquo;\u00e9diteur de blocs :<\/p>\n<figure id=\"attachment_134064\" aria-describedby=\"caption-attachment-134064\" style=\"width: 1874px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134064 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-styles.jpg\" alt=\"Deux styles de bloc pr\u00e9-construits.\" width=\"1874\" height=\"1034\"><figcaption id=\"caption-attachment-134064\" class=\"wp-caption-text\">Deux styles de bloc pr\u00e9-construits.<\/figcaption><\/figure>\n<p>Les styles seront disponibles pour l&rsquo;utilisateur en cliquant sur le <a href=\"https:\/\/kinqsta.com\/fr\/blog\/wordpress-5-8\/#normalized-block-toolbars\">s\u00e9lecteur de bloc<\/a>, puis en recherchant le <strong>panneau de styles <\/strong>dans la <strong>colonne lat\u00e9rale des r\u00e9glages du bloc<\/strong>.<\/p>\n<p>S\u00e9lectionnez un style et v\u00e9rifiez les classes appliqu\u00e9es \u00e0 l&rsquo;\u00e9l\u00e9ment p. Cliquez avec le bouton droit de la souris sur le bloc et <strong>inspectez<\/strong>. Une nouvelle classe a \u00e9t\u00e9 ajout\u00e9e avec un nom structur\u00e9 comme suit :<\/p>\n<pre><code class=\"language-css\">is-style-{style-name}<\/code><\/pre>\n<p>Si vous avez coch\u00e9 le style \u00ab Border \u00bb, une classe <code>is-style-border<\/code>\u00a0sera ajout\u00e9e \u00e0 l&rsquo;\u00e9l\u00e9ment p. Si vous avez coch\u00e9 le style \u00ab Default \u00bb, une classe <code>is-style-default<\/code> sera ajout\u00e9e \u00e0 la place.<\/p>\n<p>Il ne vous reste plus qu&rsquo;\u00e0 d\u00e9clarer les propri\u00e9t\u00e9s CSS. Ouvrez le fichier <strong>editor.scss <\/strong>et remplacez les styles actuels par les suivants :<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n    padding: 4px;\n}<\/code><\/pre>\n<p>Vous pouvez maintenant faire de m\u00eame avec <strong>style.scss<\/strong>. Comme nous l&rsquo;avons mentionn\u00e9 plus haut, les styles d\u00e9finis dans <strong>style.scss<\/strong> sont appliqu\u00e9s \u00e0 la fois sur l&rsquo;interface publique et dans l&rsquo;\u00e9diteur :<\/p>\n<pre><code class=\"language-css\">.wp-block-ka-example-block-ka-example-block {\n\t&.is-style-default{\n\t\tborder: 0;\n        background-color: #FFE2C7;\n\t}\n\t&.is-style-border{\n\t\tborder: 2px solid #000;\n        border-radius: 16px;\n        background-color: #F6F6F6;\n\t}\n}<\/code><\/pre>\n<p>Et c&rsquo;est tout ! Rafra\u00eechissez la page et amusez-vous avec vos nouveaux styles de blocs :<\/p>\n<figure id=\"attachment_134067\" aria-describedby=\"caption-attachment-134067\" style=\"width: 1876px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134067 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-styles-compared.jpg\" alt=\"Comparaison des styles de bloc\" width=\"1876\" height=\"960\"><figcaption id=\"caption-attachment-134067\" class=\"wp-caption-text\">Comparaison des styles de bloc<\/figcaption><\/figure>\n<h3 id=\"innerblocks-component\">Embo\u00eeter les blocs Gutenberg avec le composant InnerBlocks<\/h3>\n<p>Bien que pleinement fonctionnel, notre bloc personnalis\u00e9 n&rsquo;est toujours pas tr\u00e8s attrayant. Pour le rendre plus attrayant pour le public, nous pourrions ajouter une image.<\/p>\n<p>Cela peut ajouter une couche de complexit\u00e9 \u00e0 notre bloc, mais heureusement, vous n&rsquo;avez pas besoin de r\u00e9inventer la roue car Gutenberg fournit un composant sp\u00e9cifique que vous pouvez utiliser pour cr\u00e9er une structure de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/nested-blocks-inner-blocks\/\">blocs imbriqu\u00e9s<\/a>.<\/p>\n<p>Le composant <code>InnerBlocks<\/code> est <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/packages\/block-editor\/src\/components\/inner-blocks\/README.md\">d\u00e9fini comme suit<\/a> :<\/p>\n<blockquote><p><code><em>InnerBlocks<\/em><\/code> <em>exporte une paire de composants qui peuvent \u00eatre utilis\u00e9s dans les impl\u00e9mentations de blocs pour activer le contenu des blocs imbriqu\u00e9s.<\/em><\/p><\/blockquote>\n<p>Tout d&rsquo;abord, vous devez cr\u00e9er un nouveau fichier <strong>.js <\/strong>dans le dossier <strong>src<\/strong>. Dans notre exemple, nous appellerons ce fichier <strong>container.js<\/strong>.<\/p>\n<p>Vous devez maintenant importer la nouvelle ressource dans le fichier <strong>index.js <\/strong>:<\/p>\n<pre><code class=\"language-js\">import '.\/container';<\/code><\/pre>\n<p>Retournez dans le <strong>fichier container.js <\/strong>et importez les composants n\u00e9cessaires :<\/p>\n<pre><code class=\"language-js\">import { registerBlockType } from \"@wordpress\/blocks\";\nimport { __ } from \"@wordpress\/i18n\";\nimport {\n\tuseBlockProps, \n\tInnerBlocks \n} from \"@wordpress\/block-editor\";<\/code><\/pre>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 d\u00e9finir un mod\u00e8le fournissant la structure dans laquelle les blocs seront plac\u00e9s. Dans l&rsquo;exemple suivant, nous d\u00e9finissons un mod\u00e8le compos\u00e9 de deux colonnes contenant un bloc Image de base et notre bloc personnalis\u00e9 :<\/p>\n<pre><code class=\"language-js\">const TEMPLATE = [ [ 'core\/columns', { backgroundColor: 'yellow', verticalAlignment: 'center' }, [\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'core\/image' ],\n\t] ],\n\t[ 'core\/column', { templateLock: 'all' }, [\n\t\t[ 'ka-example-block\/ka-example-block', { placeholder: 'Enter side content...' } ],\n\t] ],\n] ] ];<\/code><\/pre>\n<p>Le mod\u00e8le est structur\u00e9 comme un <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/blob\/a84c037a0e62a344005054102544c34d7b970a6b\/docs\/reference-guides\/block-api\/block-templates.md\">tableau de blockTypes<\/a> (nom du bloc et attributs facultatifs).<\/p>\n<p>Dans le code ci-dessus, nous avons utilis\u00e9 plusieurs attributs pour configurer les blocs Columns et Column. Plus pr\u00e9cis\u00e9ment, l&rsquo;attribut <code>templateLock : 'all'<\/code> verrouille les blocs Columns afin que l&rsquo;utilisateur ne puisse pas ajouter, r\u00e9organiser ou supprimer des blocs existants. <code>templateLock<\/code> peut prendre l&rsquo;une des valeurs suivantes :<\/p>\n<ul>\n<li><code>all<\/code> \u2014 <code>InnerBlocks<\/code> est verrouill\u00e9, et aucun bloc ne peut \u00eatre ajout\u00e9, r\u00e9organis\u00e9 ou supprim\u00e9.<\/li>\n<li><code>insert<\/code> \u2014 Les blocs peuvent uniquement \u00eatre r\u00e9organis\u00e9s ou supprim\u00e9s.<\/li>\n<li><code>false<\/code> \u2014 Le mod\u00e8le n&rsquo;est pas verrouill\u00e9.<\/li>\n<\/ul>\n<p>Le mod\u00e8le est ensuite affect\u00e9 \u00e0 l&rsquo;\u00e9l\u00e9ment <code>InnerBlocks<\/code> :<\/p>\n<pre><code class=\"language-jsx\">&lt;InnerBlocks\n\ttemplate={ TEMPLATE }\n\ttemplateLock=\"all\"\n\/&gt;<\/code><\/pre>\n<p>Pour \u00e9viter tout probl\u00e8me de compatibilit\u00e9, nous avons \u00e9galement ajout\u00e9 un attribut <code>templateLock<\/code> au composant <code>InnerBlocks<\/code> (voir \u00e9galement le probl\u00e8me #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/17262\">17262<\/a> et la commande #<a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/26128\">26128<\/a>).<\/p>\n<p>Voici notre fichier final <strong>container.js <\/strong>:<\/p>\n<pre><code class=\"language-jsx\">registerBlockType('ka-example-block\/ka-example-container-block', {\n\ttitle: __( 'KA Container block', 'ka-example-block' ),\n\tcategory: 'design',\n\n\tedit( { className } ) {\n\t\t\n\t\treturn(\n\t\t\t&lt;div className={ className }&gt;\n\t\t\t\t&lt;InnerBlocks\n\t\t\t\t\ttemplate={ TEMPLATE }\n\t\t\t\t\ttemplateLock=\"all\"\n\t\t\t\t\/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n\n\tsave() {\n\t\tconst blockProps = useBlockProps.save();\n\t\treturn(\n\t\t\t&lt;div { ...blockProps }&gt;\n\t\t\t\t&lt;InnerBlocks.Content \/&gt;\n\t\t\t&lt;\/div&gt;\n\t\t)\n\t},\n});<\/code><\/pre>\n<figure id=\"attachment_134068\" aria-describedby=\"caption-attachment-134068\" style=\"width: 2060px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-134068 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/09\/block-final.jpg\" alt=\"Le bloc final dans l'\u00e9diteur de blocs\" width=\"2060\" height=\"1326\"><figcaption id=\"caption-attachment-134068\" class=\"wp-caption-text\">Le bloc final dans l&rsquo;\u00e9diteur de blocs<\/figcaption><\/figure>\n<h3 id=\"additional-improvements\">Am\u00e9liorations suppl\u00e9mentaires<\/h3>\n<p>Notre bloc est enti\u00e8rement fonctionnel, mais nous pourrions l&rsquo;am\u00e9liorer un peu avec quelques petits changements.<\/p>\n<p>Nous avons attribu\u00e9 l&rsquo;attribut <code>backgroundColor<\/code> au paragraphe g\u00e9n\u00e9r\u00e9 par le composant <code>RichText<\/code>. Cependant, nous pouvons pr\u00e9f\u00e9rer attribuer la couleur d&rsquo;arri\u00e8re-plan \u00e0 la <code>div<\/code> du conteneur :<\/p>\n<p>Donc, modifiez le fichier <strong>edit.js <\/strong>et\u00a0 <code>div<\/code> <strong>save.js <\/strong>comme suit :<\/p>\n<pre><code class=\"language-jsx\">&lt;div \n\t{ ...blockProps }\n\tstyle={ { backgroundColor: backgroundColor } }\n&gt;\n...\n&lt;\/div&gt;<\/code><\/pre>\n<p>Cela permettra \u00e0 l&rsquo;utilisateur de modifier l&rsquo;arri\u00e8re-plan de l&rsquo;ensemble du bloc.<\/p>\n<p>En revanche, un changement plus pertinent concerne la m\u00e9thode <code>useBlockProps<\/code>. Dans le code original, nous d\u00e9finissions la constante <code>blockProps<\/code> comme suit :<\/p>\n<pre><code class=\"language-js\">const blockProps = useBlockProps();<\/code><\/pre>\n<p>Mais nous pouvons utiliser <code>useBlockProps<\/code> de mani\u00e8re plus efficace <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-edit-save\/#block-wrapper-props\">en passant un ensemble de propri\u00e9t\u00e9s<\/a>. Par exemple, nous pouvons importer <code>classnames<\/code> depuis le module <code>classnames<\/code> et d\u00e9finir le nom de la classe d&rsquo;enveloppe en cons\u00e9quence.<\/p>\n<p>Dans l&rsquo;exemple suivant, nous attribuons un nom de classe en fonction de la valeur de l&rsquo;attribut <code>align<\/code> (<strong>edit.js<\/strong>) :<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function Edit( { attributes, setAttributes } ) {\n\t...\n\t\n\tconst onChangeAlign = ( newAlign ) =&gt; {\n\t\tsetAttributes( { \n\t\t\talign: newAlign === undefined ? 'none' : newAlign, \n\t\t} )\n\t}\n\n\tconst blockProps = useBlockProps( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Nous ferons le m\u00eame changement dans le fichier <strong>save.js <\/strong>:<\/p>\n<pre><code class=\"language-js\">import classnames from 'classnames';\n\n...\n\nexport default function save( { attributes } ) {\n\t...\n\tconst { content, align, backgroundColor, textColor, kaLink, linkLabel, hasLinkNofollow } = attributes;\n\n\tconst blockProps = useBlockProps.save( {\n\t\tclassName: `has-text-align-${ align }`\n\t} );\n\t...\n}<\/code><\/pre>\n<p>Et c&rsquo;est fini ! Vous pouvez maintenant <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/#build\">ex\u00e9cuter le build pour la production<\/a> :<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Et nous voici arriv\u00e9s \u00e0 la fin de cet incroyable voyage ! Nous avons commenc\u00e9 par la configuration de l&rsquo;environnement de d\u00e9veloppement et avons fini par cr\u00e9er un type de bloc complet.<\/p>\n<p>Comme nous l&rsquo;avons mentionn\u00e9 dans l&rsquo;introduction, une solide connaissance de Node.js, Webpack, Babel et React est essentielle pour cr\u00e9er des blocs Gutenberg avanc\u00e9s et vous positionner sur le march\u00e9 en tant que d\u00e9veloppeur Gutenberg professionnel.<\/p>\n<p>Mais vous n&rsquo;avez pas besoin d&rsquo;avoir une exp\u00e9rience \u00e9tablie de React pour commencer \u00e0 vous amuser avec le d\u00e9veloppement de blocs, cependant. Le d\u00e9veloppement de blocs pourrait vous donner une motivation et des objectifs pour acqu\u00e9rir des comp\u00e9tences de plus en plus larges dans les technologies derri\u00e8re les blocs Gutenberg.<\/p>\n<p>Ce guide est donc loin d&rsquo;\u00eatre complet. Il s&rsquo;agit simplement d&rsquo;une introduction \u00e0 une grande vari\u00e9t\u00e9 de sujets qui vous aideront \u00e0 commencer \u00e0 construire vos tout premiers blocs Gutenberg.<\/p>\n<p>Pour cette raison, nous vous recommandons d&rsquo;approfondir vos connaissances en lisant attentivement la documentation et les guides en ligne. Parmi les nombreuses ressources disponibles, nous vous recommandons les suivantes :<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/handbook\/tutorials\/create-block\/\">Tutoriel officiel de cr\u00e9ation d&rsquo;un bloc<\/a> pour les d\u00e9butants<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/\">Tutoriel officiel sur les blocs<\/a> pour les d\u00e9veloppeurs interm\u00e9diaires<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/block-tutorial\/creating-dynamic-blocks\/\">Blocs dynamiques<\/a><\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-dynamiques-gutenberg\/\">Comment cr\u00e9er des blocs dynamiques pour Gutenberg<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/metabox\/\">Bo\u00eetes m\u00e9ta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/block-editor\/how-to-guides\/plugin-sidebar-0\/\">Cr\u00e9ation d&rsquo;une colonne lat\u00e9rale pour votre extension<\/a><\/li>\n<\/ul>\n<p>Si vous d\u00e9butez dans le d\u00e9veloppement de WordPress, vous voudrez peut-\u00eatre comprendre les concepts de base du d\u00e9veloppement frontend. Voici une liste rapide de ressources qui peuvent vous aider \u00e0 d\u00e9marrer :<\/p>\n<ul>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/ebooks\/wordpress\/wordpress-developpement-local\/\">Comment installer WordPress en local<\/a> (e-book gratuit)<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/ebooks\/wordpress\/hebergement-wordpress-infogere\/\">La valeur r\u00e9elle de l&rsquo;h\u00e9bergement WordPress infog\u00e9r\u00e9<\/a> (e-book gratuit)<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-javascript\/\">Qu&rsquo;est-ce que JavaScript<\/a> ?<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/html-vs-html5\/\">HTML et HTML5<\/a><\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/css-wordpress\/\">Comment modifier le CSS dans WordPress<\/a><\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-ce-que-php\/\">Qu&rsquo;est-ce que le PHP<\/a> ?<\/li>\n<li><a href=\"https:\/\/kinqsta.com\/fr\/blog\/hooks-wordpress\/\">Le Bootcamp WordPress Hooks : Comment utiliser les actions, les filtres et les crochets personnalis\u00e9s<\/a><\/li>\n<\/ul>\n<p>Et n&rsquo;oubliez pas que le code complet des exemples de ce guide est <a href=\"https:\/\/gist.github.com\/carlodaniele\/5f3dba8fff19d8ea836bdef5a2be7556\">disponible sur Gist<\/a>.<\/p>\n<p>Maintenant c&rsquo;est votre tour : Avez-vous d\u00e9velopp\u00e9 des blocs Gutenberg ? Quelles sont les principales difficult\u00e9s que vous avez rencontr\u00e9es jusqu&rsquo;\u00e0 pr\u00e9sent ? Faites-nous part de votre exp\u00e9rience dans les commentaires !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De nombreuses personnes se plaignent des obstacles \u00e0 surmonter pour se lancer dans la construction de blocs et d&rsquo;applications Gutenberg. La courbe d&rsquo;apprentissage est raide, principalement &#8230;<\/p>\n","protected":false},"author":36,"featured_media":49151,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[527,449,72],"topic":[1028],"class_list":["post-49143","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-block-editor","tag-development","tag-gutenberg","topic-developpement-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif<\/title>\n<meta name=\"description\" content=\"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n&#039;est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs\" \/>\n<meta property=\"og:description\" content=\"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n&#039;est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-21T08:07:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-09T10:29:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Carlo Daniele\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n&#039;est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\" \/>\n<meta name=\"twitter:creator\" content=\"@carlodaniele\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlo Daniele\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"55 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs\",\"datePublished\":\"2021-10-21T08:07:54+00:00\",\"dateModified\":\"2025-09-09T10:29:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\"},\"wordCount\":9942,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"keywords\":[\"Block Editor\",\"development\",\"Gutenberg\"],\"articleSection\":[\"D\u00e9veloppement WordPress\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\",\"url\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\",\"name\":\"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"datePublished\":\"2021-10-21T08:07:54+00:00\",\"dateModified\":\"2025-09-09T10:29:04+00:00\",\"description\":\"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n'est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"contentUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png\",\"width\":1460,\"height\":730,\"caption\":\"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"D\u00e9veloppement WordPress\",\"item\":\"https:\/\/kinqsta.com\/fr\/sujets\/developpement-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#website\",\"url\":\"https:\/\/kinqsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g\",\"caption\":\"Carlo Daniele\"},\"description\":\"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.\",\"sameAs\":[\"https:\/\/frammentidicodice.com\/\",\"https:\/\/x.com\/carlodaniele\"],\"url\":\"https:\/\/kinqsta.com\/fr\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif","description":"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n'est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/","og_locale":"fr_FR","og_type":"article","og_title":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs","og_description":"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n'est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.","og_url":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2021-10-21T08:07:54+00:00","article_modified_time":"2025-09-09T10:29:04+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n'est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.","twitter_image":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"55 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs","datePublished":"2021-10-21T08:07:54+00:00","dateModified":"2025-09-09T10:29:04+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/"},"wordCount":9942,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","keywords":["Block Editor","development","Gutenberg"],"articleSection":["D\u00e9veloppement WordPress"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/","url":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/","name":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","datePublished":"2021-10-21T08:07:54+00:00","dateModified":"2025-09-09T10:29:04+00:00","description":"Construire des blocs Gutenberg peut sembler intimidant au d\u00e9but. Mais ce n'est pas le cas ! Ce guide approfondi vous montrera comment cr\u00e9er votre premier bloc WP.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#primaryimage","url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","contentUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2021\/10\/Gutenberg-blocks_Blog_cover.png","width":1460,"height":730,"caption":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs"},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"D\u00e9veloppement WordPress","item":"https:\/\/kinqsta.com\/fr\/sujets\/developpement-wordpress\/"},{"@type":"ListItem","position":3,"name":"Construire des blocs Gutenberg personnalis\u00e9s : Le tutoriel d\u00e9finitif sur le d\u00e9veloppement des blocs"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/fr\/#website","url":"https:\/\/kinqsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinqsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/429e5568f88110fd9a409b84cb22197e?s=96&d=mm&r=g","caption":"Carlo Daniele"},"description":"Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.","sameAs":["https:\/\/frammentidicodice.com\/","https:\/\/x.com\/carlodaniele"],"url":"https:\/\/kinqsta.com\/fr\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/49143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/comments?post=49143"}],"version-history":[{"count":15,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/49143\/revisions"}],"predecessor-version":[{"id":80795,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/49143\/revisions\/80795"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/fr"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/es"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/pt"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/de"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/jp"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/dk"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/translations\/se"},{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/49143\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media\/49151"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media?parent=49143"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/tags?post=49143"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/topic?post=49143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}