{"id":79072,"date":"2025-01-20T09:19:45","date_gmt":"2025-01-20T08:19:45","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=79072&#038;preview=true&#038;preview_id=79072"},"modified":"2025-01-20T14:29:12","modified_gmt":"2025-01-20T13:29:12","slug":"plugin-gutenberg","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/","title":{"rendered":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&rsquo;\u00e9diteur de blocs."},"content":{"rendered":"<p>Au fil des ans, nous avons explor\u00e9 Gutenberg sous de nombreux angles. Nous avons diss\u00e9qu\u00e9 <a href=\"https:\/\/kinsta.com\/fr\/blog\/editeur-wordpress-gutenberg\/\">les fonctionnalit\u00e9s de l&rsquo;\u00e9diteur<\/a>, les avons compar\u00e9es \u00e0 celles d&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/blog\/gutenberg-vs-elementor\/\">autres constructeurs de pages<\/a>, avons construit des blocs personnalis\u00e9s <a href=\"https:\/\/kinsta.com\/fr\/blog\/blocs-gutenberg\/\">statiques<\/a> et <a href=\"https:\/\/kinsta.com\/fr\/blog\/blocs-dynamiques-gutenberg\/\">dynamiques<\/a>, et <a href=\"https:\/\/kinsta.com\/fr\/blog\/ajouter-boite-meta-champ-personnalise-wordpress\/\">bien plus encore.<\/a><\/p>\n<p>Avec les derni\u00e8res versions de WordPress, de nouvelles fonctionnalit\u00e9s et de nouveaux outils vous permettent de cr\u00e9er des mises en page complexes plus facilement en enrichissant et en am\u00e9liorant les fonctionnalit\u00e9s de l&rsquo;\u00e9diteur de blocs sans avoir besoin de construire des blocs personnalis\u00e9s.<\/p>\n<p>Gr\u00e2ce \u00e0 l&rsquo;introduction de <a href=\"https:\/\/kinsta.com\/fr\/blog\/construire-compositions-blocs-wordpress\/\">compositions de blocs<\/a> et d&rsquo;outils de d\u00e9veloppement tels que l&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/blog\/api-block-bindings\/\">API Block Bindings<\/a>, les cas d&rsquo;utilisation de blocs personnalis\u00e9s sont moins nombreux. Vous pouvez d\u00e9sormais cr\u00e9er des structures de blocs complexes, injecter des valeurs de m\u00e9tadonn\u00e9es dans votre contenu et automatiser une bonne partie de votre flux de travail sans quitter l&rsquo;interface de l&rsquo;\u00e9diteur. En bref, aujourd&rsquo;hui, WordPress vous permet de cr\u00e9er des sites complexes en aussi peu de clics qu&rsquo;auparavant.<\/p>\n<p>L&rsquo;ajout de commandes et d&rsquo;outils personnalis\u00e9s \u00e0 l&rsquo;\u00e9diteur peut contribuer \u00e0 rendre le processus de cr\u00e9ation de contenu plus fluide. Par exemple, vous pouvez avoir besoin d&rsquo;ajouter un panneau \u00e0 la colonne lat\u00e9rale de publication pour ajouter des fonctionnalit\u00e9s ou cr\u00e9er une colonne lat\u00e9rale personnalis\u00e9e pour g\u00e9rer plusieurs champs m\u00e9ta.<\/p>\n<p>C&rsquo;est parti !<\/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>Comment cr\u00e9er un plugin d&rsquo;\u00e9diteur de blocs sans cr\u00e9er de bloc personnalis\u00e9 ?<\/h2>\n<p>WordPress fournit un <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-create-block\/\" target=\"_blank\" rel=\"noopener noreferrer\">outil de ligne de commande<\/a> pratique qui vous permet d&rsquo;installer un environnement de d\u00e9veloppement Node.js local avec tous les fichiers et d\u00e9pendances n\u00e9cessaires pour cr\u00e9er un bloc personnalis\u00e9. Il suffit de saisir <code>npx @wordpress\/create-block<\/code> dans l&rsquo;outil de ligne de commande, d&rsquo;attendre quelques secondes, et le tour est jou\u00e9.<\/p>\n<p>Cependant, l&rsquo;\u00e9chafaudage d&rsquo;un bloc personnalis\u00e9 n&rsquo;est pas n\u00e9cessaire lorsque vous avez seulement besoin d&rsquo;ajouter une colonne lat\u00e9rale ou un simple panneau de r\u00e9glages. Dans ce cas, vous devez cr\u00e9er une extension Gutenberg.<\/p>\n<p>WordPress ne fournit pas d&rsquo;utilitaire pour automatiser le processus de cr\u00e9ation d&rsquo;une exwtension pour Gutenberg, vous devez donc le faire manuellement. Mais ne vous inqui\u00e9tez pas outre mesure. Le processus est relativement simple, et nous allons vous guider \u00e0 travers lui. Voici les \u00e9tapes \u00e0 suivre :<\/p>\n<div><\/div><kinsta-auto-toc list-style=\"decimal\" selector=\"h3\" count-number=\"7\" sub-toc=\"true\"><\/kinsta-auto-toc>\n<h3>1. T\u00e9l\u00e9charger et installer un environnement de d\u00e9veloppement local<\/h3>\n<p><strong>Chaque chose en son temps :<\/strong> Bien que vous puissiez d\u00e9velopper votre extension Gutenberg dans un environnement distant, il peut \u00eatre plus pratique pour vous d&rsquo;installer localement un site WordPress de d\u00e9veloppement. Vous pouvez utiliser n&rsquo;importe quel environnement bas\u00e9 sur PHP et MySQL. Parmi les <a href=\"https:\/\/kinsta.com\/fr\/blog\/mamp-alternatives\/\">nombreuses alternatives<\/a> disponibles sur le march\u00e9, nous vous recommandons <a href=\"https:\/\/kinsta.com\/fr\/devkinsta\/fonctionnalites\/\">DevKinsta<\/a>. Il est gratuit, dot\u00e9 de toutes les fonctionnalit\u00e9s, facile \u00e0 utiliser et 100 % compatible avec l&rsquo;h\u00e9bergement Kinsta.<\/p>\n<p>Une fois votre site de d\u00e9veloppement configur\u00e9, vous \u00eates pr\u00eat \u00e0 cr\u00e9er une extension d&rsquo;\u00e9diteur de blocs Gutenberg.<\/p>\n<h3>2. T\u00e9l\u00e9charger et installer Node.js et npm.<\/h3>\n<p>T\u00e9l\u00e9chargez Node.js depuis <a href=\"https:\/\/nodejs.org\/\">nodejs.org<\/a> et installez-le sur votre ordinateur. Cela permettra \u00e9galement d&rsquo;installer npm, le gestionnaire de paquets de Node.<\/p>\n<p>Une fois que vous avez fait cela, lancez votre outil de ligne de commande et ex\u00e9cutez <code>node -v<\/code> et <code>npm -v<\/code>. Vous devriez voir les versions install\u00e9es de Node.js et de npm.<\/p>\n<figure id=\"attachment_190001\" aria-describedby=\"caption-attachment-190001\" style=\"width: 1302px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190001 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/node-v.png\" alt=\"V\u00e9rifier les versions de node et de npm\" width=\"1302\" height=\"308\"><figcaption id=\"caption-attachment-190001\" class=\"wp-caption-text\">V\u00e9rifier les versions de node et de npm<\/figcaption><\/figure>\n<h3>3. Cr\u00e9er le dossier de votre plugin<\/h3>\n<p>Cr\u00e9ez un nouveau dossier sous <code>wp-content\/plugins<\/code> et renommez-le <code>my-sidebar-plugin<\/code> ou quelque chose de similaire. N&rsquo;oubliez pas que ce nom doit refl\u00e9ter le nom de votre extension.<\/p>\n<p>Ouvrez le terminal, naviguez jusqu&rsquo;au dossier de l&rsquo;extension et initialisez un projet npm avec la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npm init -y<\/code><\/pre>\n<p>Cela cr\u00e9era un fichier de base <code>package.json<\/code>.<\/p>\n<figure id=\"attachment_190003\" aria-describedby=\"caption-attachment-190003\" style=\"width: 1302px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190003 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/npm-init-y.png\" alt=\"Cr\u00e9er un fichier package.json de base\" width=\"1302\" height=\"886\"><figcaption id=\"caption-attachment-190003\" class=\"wp-caption-text\">Cr\u00e9er un fichier package.json de base<\/figcaption><\/figure>\n<h3>4. Installer les d\u00e9pendances<\/h3>\n<p>Dans votre outil de ligne de commande, saisissez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npm install @wordpress\/plugins @wordpress\/scripts --save-dev<\/code><\/pre>\n<ul>\n<li><code>@wordpress\/plugins<\/code> installe le <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-plugins\/\" target=\"_blank\" rel=\"noopener noreferrer\">module<\/a> <code>plugins<\/code> pour WordPress.<\/li>\n<li><code>@wordpress\/scripts<\/code> installe une collection de <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-scripts\/\" target=\"_blank\" rel=\"noopener noreferrer\">scripts r\u00e9utilisables<\/a> pour le d\u00e9veloppement de WordPress.<\/li>\n<\/ul>\n<p>Un nouveau dossier <code>node_modules<\/code> devrait avoir \u00e9t\u00e9 ajout\u00e9 \u00e0 votre projet.<\/p>\n<p>Maintenant, ouvrez votre <code>package.json<\/code> et mettez \u00e0 jour le <code>scripts<\/code> comme suit :<\/p>\n<pre><code class=\"language-json\">{\n\t\"name\": \"my-sidebar-plugin\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"index.js\",\n\t\"scripts\": {\n\t\t\"build\": \"wp-scripts build\",\n\t\t\"start\": \"wp-scripts start\"\n\t},\n\t\"keywords\": [],\n\t\"author\": \"\",\n\t\"license\": \"ISC\",\n\t\"description\": \"\",\n\t\"devDependencies\": {\n\t\t\"@wordpress\/plugins\": \"^7.14.0\",\n\t\t\"@wordpress\/scripts\": \"^30.7.0\"\n\t}\n}<\/code><\/pre>\n<p>Vous pouvez maintenant v\u00e9rifier le dossier de l&rsquo;extension :<\/p>\n<figure id=\"attachment_190006\" aria-describedby=\"caption-attachment-190006\" style=\"width: 1862px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190006 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/package-json.png\" alt=\"Le projet de l'extension dans Visual Studio Code\" width=\"1862\" height=\"998\"><figcaption id=\"caption-attachment-190006\" class=\"wp-caption-text\">Le projet de l&rsquo;extension dans Visual Studio Code<\/figcaption><\/figure>\n<h3>5. Cr\u00e9er les fichiers du plugin<\/h3>\n<p>Dans le r\u00e9pertoire de votre extension, cr\u00e9ez un nouveau fichier <code>.php<\/code> et donnez-lui le m\u00eame nom que votre dossier. Dans notre exemple, il s&rsquo;agit de <code>my-sidebar-plugin.php<\/code>.<\/p>\n<p>Ouvrez le fichier et collez le code suivant pour enregistrer l&rsquo;extension sur le serveur :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: My Sidebar Plugin\n *\/\n\nfunction my_sidebar_plugin_register_script() {\n\twp_enqueue_script(\n\t\t'my_sidebar_plugin_script',\n\t\tplugins_url( 'build\/index.js', __FILE__ ),\n\t\tarray( 'wp-plugins', 'wp-edit-post' ),\n\t\tfilemtime( plugin_dir_path( __FILE__ ) . 'build\/index.js' )\n\t);\n}\nadd_action( 'enqueue_block_editor_assets', 'my_sidebar_plugin_register_script' );<\/code><\/pre>\n<p>Ensuite, cr\u00e9ez un dossier <code>src<\/code> dans le r\u00e9pertoire de votre extension. Dans ce dossier, cr\u00e9ez un nouveau fichier <code>index.js<\/code> avec le code suivant :<\/p>\n<pre><code class=\"language-js\">import { registerPlugin } from '@wordpress\/plugins';\nimport { PluginSidebar } from '@wordpress\/edit-post';\n\nconst MyPluginSidebar = () =&gt; (\n\t&lt;PluginSidebar\n\t\tname=\"my-sidebar-plugin\"\n\t\ttitle=\"My Sidebar Plugin\"\n\t&gt;\n\t\t&lt;div&gt;\n\t\t\tHello my friends!\n\t\t&lt;\/div&gt;\n\t&lt;\/PluginSidebar&gt;\n);\n\nregisterPlugin( 'my-sidebar-plugin', {\n\trender: MyPluginSidebar,\n} );<\/code><\/pre>\n<h3>6. Compiler le code<\/h3>\n<p>Il ne manque plus que la compilation. Retournez \u00e0 la ligne de commande et ex\u00e9cutez la commande suivante :<\/p>\n<pre><code class=\"language-bash\">npm run build<\/code><\/pre>\n<p>Cela cr\u00e9e un dossier <code>build<\/code> avec les fichiers compress\u00e9s du projet.<\/p>\n<figure id=\"attachment_190008\" aria-describedby=\"caption-attachment-190008\" style=\"width: 2120px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190008 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/plugin-project-vsc.png\" alt=\"Le dossier du projet de l'extension dans VSC\" width=\"2120\" height=\"998\"><figcaption id=\"caption-attachment-190008\" class=\"wp-caption-text\">Le dossier du projet de l&rsquo;extension dans VSC<\/figcaption><\/figure>\n<p>Lorsque c&rsquo;est fait, naviguez vers l&rsquo;\u00e9cran <strong>Extensions<\/strong> dans votre tableau de bord WordPress et activez l&rsquo;extension. Cr\u00e9ez un nouvel article ou une nouvelle page et cliquez sur l&rsquo;ic\u00f4ne de l&rsquo;extension dans le coin sup\u00e9rieur droit pour afficher votre colonne lat\u00e9rale personnalis\u00e9e.<\/p>\n<figure id=\"attachment_190010\" aria-describedby=\"caption-attachment-190010\" style=\"width: 1976px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190010 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/gutenberg-custom-sidebar.png\" alt=\"Une barre lat\u00e9rale personnalis\u00e9e dans l'\u00e9diteur de billets\" width=\"1976\" height=\"552\"><figcaption id=\"caption-attachment-190010\" class=\"wp-caption-text\">Une barre lat\u00e9rale personnalis\u00e9e dans l&rsquo;\u00e9diteur de billets<\/figcaption><\/figure>\n<h3>7. D\u00e9velopper et construire<\/h3>\n<p>Nous avons plac\u00e9 le fichier <code>index.js<\/code> dans le dossier <code>src<\/code>. L&rsquo;utilisation d&rsquo;un dossier <code>src<\/code> est une convention courante dans le d\u00e9veloppement d&rsquo;extensions et de th\u00e8mes WordPress, ce qui rend votre code plus facile \u00e0 comprendre pour les autres d\u00e9veloppeurs.<\/p>\n<p>En pla\u00e7ant votre code JS dans le dossier <code>src<\/code>, vous pouvez utiliser la commande <code>npm start<\/code> ou <code>npm run start<\/code> pour d\u00e9marrer un environnement de d\u00e9veloppement qui surveille les scripts et recompile automatiquement le code si n\u00e9cessaire. Lorsque tu aurez termin\u00e9 le d\u00e9veloppement, la commande <code>npm build<\/code> ou <code>npm run build<\/code> compilera le code JavaScript dans le dossier <code>build<\/code>, qui contiendra le code optimis\u00e9 pour la production.<\/p>\n<p>Maintenant, mettons en pratique ce que nous avons appris et modifions l&rsquo;extension que nous avons cr\u00e9\u00e9 dans la section pr\u00e9c\u00e9dente pour ajouter un nouveau panneau \u00e0 la colonne lat\u00e9rale de l&rsquo;\u00e9diteur d&rsquo;articles afin de g\u00e9rer les champs personnalis\u00e9s.<\/p>\n<h2>Comment cr\u00e9er une colonne lat\u00e9rale suppl\u00e9mentaire pour g\u00e9rer les champs m\u00e9ta des articles ?<\/h2>\n<p>Notre objectif est de cr\u00e9er une colonne lat\u00e9rale personnalis\u00e9e qui contient un panneau avec un seul champ de texte pour ajouter et modifier un champ m\u00e9ta personnalis\u00e9.<\/p>\n<p>Avant de nous lancer, nous devons mentionner que nous pourrions utiliser une bo\u00eete m\u00e9ta personnalis\u00e9e pour obtenir le m\u00eame r\u00e9sultat. Avec WordPress 6.7, les <a href=\"https:\/\/kinsta.com\/fr\/blog\/wordpress-6-7\/#meta-boxes-in-the-post-editor\">bo\u00eetes m\u00e9ta ont re\u00e7u une mise \u00e0 niveau<\/a> et sont maintenant enti\u00e8rement compatibles avec l&rsquo;\u00e9diteur de blocs, donc vous pouvez vous demander pourquoi g\u00e9rer les champs m\u00e9ta \u00e0 partir d&rsquo;une colonne lat\u00e9rale personnalis\u00e9e plut\u00f4t que d&rsquo;une bo\u00eete m\u00e9ta. La raison en est qu&rsquo;une colonne lat\u00e9rale vous permet de profiter des composants int\u00e9gr\u00e9s. Cela vous aide \u00e0 construire des interfaces plus conviviales avec des contr\u00f4les puissants qui devraient \u00e9galement \u00eatre familiers aux utilisateurs.<\/p>\n<p>Ceci \u00e9tant dit, voici le processus de cr\u00e9ation d&rsquo;une colonne lat\u00e9rale personnalis\u00e9e qui vous permet de g\u00e9rer les champs personnalis\u00e9s \u00e0 partir de l&rsquo;\u00e9diteur.<\/p>\n<h3><code>my-sidebar-plugin.php<\/code><\/h3>\n<h4>\u00c9tape 1 : Enregistrer le m\u00e9ta de l&rsquo;article<\/h4>\n<p>Tout d&rsquo;abord, vous devez enregistrer le champ m\u00e9ta. Ajoutez le code suivant au fichier principal de l&rsquo;extension :<\/p>\n<pre><code class=\"language-php\">function my_sidebar_plugin_register_meta() {\n\tregister_post_meta(\n\t\t'post',\n\t\t'meta_fields_book_title', \n\t\tarray(\n\t\t\t'show_in_rest' =&gt; true,\n\t\t\t'type' =&gt; 'string',\n\t\t\t'single' =&gt; true,\n\t\t\t'sanitize_callback' =&gt; 'sanitize_text_field',\n\t\t\t'label' =&gt; __( 'Book title', 'my-sidebar-plugin' ),\n\t\t\t'auth_callback' =&gt; function() { \n\t\t\t\treturn current_user_can( 'edit_posts' );\n\t\t\t}\n\t\t)\n\t);\n}\nadd_action( 'init', 'my_sidebar_plugin_register_meta' );<\/code><\/pre>\n<p>La fonction <code>register_post_meta<\/code> accepte trois arguments :<\/p>\n<ul>\n<li>Le type de publication pour lequel une cl\u00e9 m\u00e9ta doit \u00eatre enregistr\u00e9e. Si la cha\u00eene est vide, la cl\u00e9 m\u00e9ta sera enregistr\u00e9e pour tous les types de publications existants.<\/li>\n<li>La cl\u00e9 m\u00e9ta \u00e0 enregistrer. Notez que nous n&rsquo;utilisons pas de trait de soulignement au d\u00e9but de la cl\u00e9 m\u00e9ta. Le fait de faire pr\u00e9c\u00e9der la cl\u00e9 m\u00e9ta d&rsquo;un trait de soulignement masquerait le champ personnalis\u00e9, de sorte que vous pourriez vouloir l&rsquo;utiliser dans une bo\u00eete m\u00e9ta. Cependant, le fait de masquer le champ personnalis\u00e9 emp\u00eacherait l&rsquo;utilisation du champ m\u00e9ta via l&rsquo;API Block Bindings dans le contenu de l&rsquo;article.<\/li>\n<li>Un tableau d&rsquo;arguments. Notez que vous devez d\u00e9finir <code>show_in_rest<\/code> sur <code>true<\/code>. Cela expose le champ m\u00e9ta \u00e0 l&rsquo;API Rest et nous permet de lier le champ m\u00e9ta aux attributs de bloc. Pour les autres attributs, voir la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/register_post_meta\/\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence de la fonction<\/a>.<\/li>\n<\/ul>\n<h4>\u00c9tape 2 : Enregistrer le champ m\u00e9ta<\/h4>\n<p>Pour assurer la compatibilit\u00e9 ascendante de votre extension, vous devez enregistrer une bo\u00eete m\u00e9ta personnalis\u00e9e pour permettre aux utilisateurs de g\u00e9rer tes champs personnalis\u00e9s, m\u00eame s&rsquo;ils utilisent l&rsquo;\u00e9diteur classique. Ajoutez le code suivant au fichier PHP de votre extension :<\/p>\n<pre><code class=\"language-php\">\/**\n * Register meta box\n * \n * @link https:\/\/developer.wordpress.org\/reference\/functions\/add_meta_box\/\n * \n *\/\nfunction my_sidebar_plugin_register_meta_box(){\n\tadd_meta_box(\n\t\t'book_meta_box', \/\/ Unique ID\n\t\t__( 'Book details' ), \/\/ Box title\n\t\t'my_sidebar_plugin_meta_box_callback', \/\/ Content callback\n\t\tarray( 'post' ), \/\/ Post types\n\t\t'advanced', \/\/ context\n\t\t'default', \/\/ priority\n\t\tarray('__back_compat_meta_box' =&gt; true) \/\/ hide the meta box in Gutenberg\n\t );\n}\nadd_action( 'add_meta_boxes', 'my_sidebar_plugin_register_meta_box' );<\/code><\/pre>\n<p>D\u00e9clarez maintenant le callback qui construit le formulaire :<\/p>\n<pre><code class=\"language-php\">\/**\n * Build meta box form\n * \n * @link https:\/\/developer.wordpress.org\/reference\/functions\/wp_nonce_field\/\n * @link https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/\n * \n *\/\nfunction my_sidebar_plugin_meta_box_callback( $post ){\n\twp_nonce_field( 'my_sidebar_plugin_save_meta_box_data', 'my_sidebar_plugin_meta_box_nonce' );\n\t$title = get_post_meta( $post-&gt;ID, 'meta_fields_book_title', true );\n\t?&gt;\n\t&lt;div class=\"inside\"&gt;\n\t\t&lt;p&gt;&lt;strong&gt;&lt;?php echo __( 'Book title', 'my-sidebar-plugin' ); ?&gt;&lt;\/strong&gt;&lt;\/p&gt;\n\t\t&lt;p&gt;&lt;input type=\"text\" id=\"meta_fields_book_title\" name=\"meta_fields_book_title\" value=\"&lt;?php echo esc_attr( $title ); ?&gt;\" \/&gt;&lt;\/p&gt;\n\t&lt;\/div&gt;\n\t&lt;?php\n}<\/code><\/pre>\n<p>Ensuite, \u00e9crivez la fonction qui enregistre vos champs m\u00e9ta dans la base de donn\u00e9es :<\/p>\n<pre><code class=\"language-php\">\/**\n * Save metadata\n * \n * @link https:\/\/developer.wordpress.org\/reference\/functions\/wp_verify_nonce\/\n * @link https:\/\/developer.wordpress.org\/reference\/functions\/current_user_can\/\n * @link https:\/\/developer.wordpress.org\/reference\/functions\/sanitize_text_field\/\n * @link https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\n * \n *\/\nfunction my_sidebar_plugin_save_meta_box_data( $post_id ) {\n\tif ( ! isset( $_POST['my_sidebar_plugin_meta_box_nonce'] ) )\n\t\treturn;\n\tif ( ! wp_verify_nonce( $_POST['my_sidebar_plugin_meta_box_nonce'], 'my_sidebar_plugin_save_meta_box_data' ) )\n\t\treturn;\n\tif ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )\n\t\treturn;\n\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\treturn;\n\tif ( ! isset( $_POST['meta_fields_book_title'] ) )\n\t\treturn;\n\n\t$title = sanitize_text_field( $_POST['meta_fields_book_title'] );\n\n\tupdate_post_meta( $post_id, 'meta_fields_book_title', $title );\n}\nadd_action( 'save_post', 'my_sidebar_plugin_save_meta_box_data' );<\/code><\/pre>\n<p>Nous ne plongerons pas plus profond\u00e9ment dans ce code car cela d\u00e9passe le cadre de cet article, mais vous pouvez trouver toutes les informations dont vous avez besoin en suivant les liens dans les en-t\u00eates des fonctions.<\/p>\n<p>Enfin, nous devons mettre en file d&rsquo;attente le fichier <code>index.js<\/code> de notre extension :<\/p>\n<pre><code class=\"language-php\">function my_sidebar_plugin_register_script() {\n\twp_enqueue_script(\n\t\t'my_sidebar_plugin_script',\n\t\tplugins_url( 'build\/index.js', __FILE__ ),\n\t\tarray( 'wp-plugins', 'wp-edit-post' ),\n\t\tfilemtime( plugin_dir_path( __FILE__ ) . 'build\/index.js' )\n\t);\n}\nadd_action( 'enqueue_block_editor_assets', 'my_sidebar_plugin_register_script' );<\/code><\/pre>\n<p>C&rsquo;est tout pour le fichier PHP. Ensuite, nous devons \u00e9crire le code JS.<\/p>\n<h3><code>index.js<\/code><\/h3>\n<p>Votre <code>index.js<\/code> se trouve dans le dossier <code>src<\/code>, qui est l&rsquo;endroit o\u00f9 vous stockez vos fichiers JS pendant la phase de d\u00e9veloppement.<\/p>\n<p>Ouvrez votre <code>index.js<\/code> et ajoutez les <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/import\" target=\"_blank\" rel=\"noopener noreferrer\">d\u00e9clarations <code>import<\/code><\/a> suivantes :<\/p>\n<pre><code class=\"language-js\">import { __ } from '@wordpress\/i18n';\nimport { registerPlugin } from '@wordpress\/plugins';\nimport { PluginSidebar } from '@wordpress\/editor';\nimport { PanelBody, PanelRow, TextControl } from '@wordpress\/components';\nimport { useSelect } from '@wordpress\/data';\nimport { useEntityProp } from '@wordpress\/core-data';<\/code><\/pre>\n<p>Vous avez besoin de ces ressources pour construire la colonne lat\u00e9rale avec les contr\u00f4les n\u00e9cessaires.<\/p>\n<p>Ensuite, vous devez construire le composant de la colonne lat\u00e9rale :<\/p>\n<pre><code class=\"language-js\">const MyPluginSidebar = () =&gt; {\n\tconst postType = useSelect(\n\t\t( select ) =&gt; select( 'core\/editor' ).getCurrentPostType(),\n\t\t[]\n\t);\n\tconst [ meta, setMeta ] = useEntityProp( 'postType', postType, 'meta' );\n\n\tconst bookTitle = meta ? meta[ 'meta_fields_book_title' ] : '';\n\n\tconst updateBookTitleMetaValue = ( newValue ) =&gt; {\n\t\tsetMeta( { ...meta, meta_fields_book_title: newValue } );\n\t};\n\n\tif ( postType === 'post' ) {\n\t\treturn (\n\t\t\t&lt;PluginSidebar\n\t\t\t\tname=\"my-sidebar-plugin\"\n\t\t\t\ticon=\"book\"\n\t\t\t\ttitle=\"My plugin sidebar\"\n\t\t\t&gt;\n\t\t\t\t&lt;PanelBody title=\"Book details\" initialOpen={ true }&gt;\n\t\t\t\t\t&lt;PanelRow&gt;\n\t\t\t\t\t\t&lt;TextControl \n\t\t\t\t\t\t\tvalue={ bookTitle }\n\t\t\t\t\t\t\tlabel={ __( \"Book title\" ) }\n\t\t\t\t\t\t\tonChange={ updateBookTitleMetaValue }\n\t\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\t\/&gt;\n\t\t\t\t\t&lt;\/PanelRow&gt;\n\t\t\t\t&lt;\/PanelBody&gt;\n\t\t\t&lt;\/PluginSidebar&gt;\n\t\t);\n\t}\n};\n\nregisterPlugin( 'my-sidebar-plugin', {\n\trender: MyPluginSidebar,\n} );<\/code><\/pre>\n<p>La fonction <code>registerPlugin<\/code> enregistre l&rsquo;extension et rend le composant nomm\u00e9 <code>MyPluginSidebar<\/code>.<\/p>\n<p>La fonction <code>MyPluginSidebar<\/code> d\u00e9clare quelques constantes et renvoie le code JSX du composant.<\/p>\n<ul>\n<li><code>useSelect<\/code> est un crochet personnalis\u00e9 qui permet de r\u00e9cup\u00e9rer les accessoires des s\u00e9lecteurs enregistr\u00e9s. Nous l&rsquo;avons utilis\u00e9 pour obtenir le type de publication actuel. Voir aussi <a href=\"https:\/\/developer.wordpress.org\/news\/2024\/03\/how-to-work-effectively-with-the-useselect-hook\/\" target=\"_blank\" rel=\"noopener noreferrer\">cet article<\/a> du blog des d\u00e9veloppeurs de WordPress.<\/li>\n<li><code>useEntityProp<\/code> renvoie un tableau de champs m\u00e9ta et une fonction setter pour d\u00e9finir de nouvelles valeurs m\u00e9ta. Voir aussi la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/packages\/packages-core-data\/#useentityprop\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence en ligne<\/a>.<\/li>\n<li><code>updateBookTitleMetaValue<\/code> est un gestionnaire d&rsquo;\u00e9v\u00e9nements qui enregistre la valeur du champ m\u00e9ta <code>bookTitle<\/code>.<\/li>\n<\/ul>\n<p>Nous avons utilis\u00e9 quelques composants int\u00e9gr\u00e9s pour construire notre colonne lat\u00e9rale :<\/p>\n<ul>\n<li><code>PluginSidebar<\/code> vous permet d&rsquo;ajouter des \u00e9l\u00e9ments \u00e0 la barre d&rsquo;outils des \u00e9crans de l&rsquo;\u00e9diteur d&rsquo;articles ou de sites. (Voir <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/slotfills\/plugin-sidebar\/\" target=\"_blank\" rel=\"noopener noreferrer\">la r\u00e9f\u00e9rence du composant<\/a>.)<\/li>\n<li><code>PanelBody<\/code> cr\u00e9e un conteneur pliable qui peut \u00eatre ouvert ou ferm\u00e9. (Voir la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/components\/panel\/\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence du composant<\/a>.)<\/li>\n<li><code>PanelRow<\/code> est un conteneur g\u00e9n\u00e9rique pour les lignes d&rsquo;un site <code>PanelBody<\/code>. (Voir la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/components\/panel\/\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence du composant<\/a>.)<\/li>\n<li><code>TextControl<\/code> est un champ d&rsquo;une seule ligne qui peut \u00eatre utilis\u00e9 pour la saisie de texte libre. (Voir la <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/components\/text-control\/\" target=\"_blank\" rel=\"noopener noreferrer\">r\u00e9f\u00e9rence du composant<\/a>.)<\/li>\n<\/ul>\n<p>Lancez maintenant la commande <code>npm run build<\/code>, activez l&rsquo;extension et cr\u00e9ez un nouvel article. Une ic\u00f4ne de nouveau livre doit appara\u00eetre dans la colonne lat\u00e9rale sup\u00e9rieure. En cliquant sur cette ic\u00f4ne, vous afficherez la colonne lat\u00e9rale de votre extension.<\/p>\n<figure id=\"attachment_190019\" aria-describedby=\"caption-attachment-190019\" style=\"width: 1976px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190019 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/plugin-sidebar.png\" alt=\"Une colonne lat\u00e9rale personnalis\u00e9e avec un champ m\u00e9ta\" width=\"1976\" height=\"558\"><figcaption id=\"caption-attachment-190019\" class=\"wp-caption-text\">Une colonne lat\u00e9rale personnalis\u00e9e avec un champ m\u00e9ta<\/figcaption><\/figure>\n<p>Et si vous n&rsquo;avez pas besoin d&rsquo;une nouvelle colonne lat\u00e9rale mais que vous voulez afficher votre champ personnalis\u00e9 dans la colonne lat\u00e9rale int\u00e9gr\u00e9e de l&rsquo;article ? Il vous suffit de remplacer <code>PluginSidebar<\/code> par <code>PluginDocumentSettingPanel<\/code>. Voici votre nouveau fichier <code>index.js<\/code>:<\/p>\n<pre><code class=\"language-js\">import { __ } from '@wordpress\/i18n';\nimport { registerPlugin } from '@wordpress\/plugins';\nimport { PluginDocumentSettingPanel } from '@wordpress\/edit-post';\nimport { PanelBody, PanelRow, TextControl } from '@wordpress\/components';\n\nimport { useSelect } from '@wordpress\/data';\nimport { useEntityProp } from '@wordpress\/core-data';\n\nconst MyPluginSidebar = () =&gt; {\n\tconst postType = useSelect(\n\t\t( select ) =&gt; select( 'core\/editor' ).getCurrentPostType(),\n\t\t[]\n\t);\n\tconst [ meta, setMeta ] = useEntityProp( 'postType', postType, 'meta' );\n\n\tconst bookTitle = meta ? meta[ 'meta_fields_book_title' ] : '';\n\n\tconst updateBookTitleMetaValue = ( newValue ) =&gt; {\n\t\tsetMeta( { ...meta, meta_fields_book_title: newValue } );\n\t};\n\n\tif ( postType === 'post' ) {\n\t\treturn (\n\t\t\t&lt;PluginDocumentSettingPanel \n\t\t\t\tname=\"my-sidebar-plugin\"\n\t\t\t\ttitle=\"Book details\" \n\t\t\t\tclassName=\"my-sidebar-plugin\"\n\t\t\t&gt;\n\t\t\t\t&lt;PanelRow&gt;\n\t\t\t\t\t&lt;TextControl \n\t\t\t\t\t\tvalue={ bookTitle }\n\t\t\t\t\t\tlabel={ __( \"Book title\" ) }\n\t\t\t\t\t\tonChange={ updateBookTitleMetaValue }\n\t\t\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\t\t\/&gt;\n\t\t\t\t&lt;\/PanelRow&gt;\n\t\t\t&lt;\/PluginDocumentSettingPanel&gt;\n\t\t);\n\t}\n};\n\nregisterPlugin( 'my-sidebar-plugin', {\n\trender: MyPluginSidebar,\n} );<\/code><\/pre>\n<p>L&rsquo;image suivante montre le r\u00e9sultat.<\/p>\n<figure id=\"attachment_190023\" aria-describedby=\"caption-attachment-190023\" style=\"width: 1914px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190023 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/default-sidebar-panel.png\" alt=\"Un panneau de r\u00e9glages personnalis\u00e9s dans la colonne lat\u00e9rale de l'article\" width=\"1914\" height=\"1418\"><figcaption id=\"caption-attachment-190023\" class=\"wp-caption-text\">Un panneau de r\u00e9glages personnalis\u00e9s dans la colonne lat\u00e9rale de l&rsquo;article<\/figcaption><\/figure>\n<h2>Un cas d&rsquo;utilisation : une substitution de composition de bloc pour automatiser votre flux de travail.<\/h2>\n<p>Vous pouvez maintenant ajouter une valeur pour le champ personnalis\u00e9, et elle sera disponible via l&rsquo;API Block Bindings pour \u00eatre utilis\u00e9e avec les attributs de bloc. Par exemple, vous pouvez ajouter un bloc Paragraphe \u00e0 votre contenu et lier le champ personnalis\u00e9 \u00e0 l&rsquo;attribut <code>content<\/code> du paragraphe.<\/p>\n<figure id=\"attachment_190026\" aria-describedby=\"caption-attachment-190026\" style=\"width: 1912px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190026 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/block-attributes.png\" alt=\"Lier les champs m\u00e9ta aux attributs de bloc\" width=\"1912\" height=\"1420\"><figcaption id=\"caption-attachment-190026\" class=\"wp-caption-text\">Lier les champs m\u00e9ta aux attributs de bloc<\/figcaption><\/figure>\n<p>Vous \u00eates libre de modifier la valeur de votre champ personnalis\u00e9, et ces changements seront automatiquement appliqu\u00e9s au contenu de votre paragraphe.<\/p>\n<p>Si vous vous demandez si vous pouvez faire plus avec les champs personnalis\u00e9s et les Block Bindings, la r\u00e9ponse est oui ! Les compositions de blocs et l&rsquo;API Block Bindings vous permettent d&rsquo;automatiser l&rsquo;ensemble du processus de cr\u00e9ation de contenu.<\/p>\n<p>Pour avoir un indice, cr\u00e9ez un mod\u00e8le avec au moins un titre ou un paragraphe. Dans cet exemple, nous cr\u00e9ons une composition de bloc avec un bloc Colonnes, une image, un titre et quelques blocs Rang\u00e9es, comprenant chacun deux paragraphes.<\/p>\n<figure id=\"attachment_190040\" aria-describedby=\"caption-attachment-190040\" style=\"width: 2116px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190040 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/building-a-pattern.png\" alt=\"Un bloc Colonnes avec une image, un titre et deux lignes\" width=\"2116\" height=\"1076\"><figcaption id=\"caption-attachment-190040\" class=\"wp-caption-text\">Un bloc Colonnes avec une image, un titre et deux lignes<\/figcaption><\/figure>\n<p>Une fois que vous \u00eates satisfait de votre mise en page, s\u00e9lectionnez les \u00e9l\u00e9ments d&rsquo;habillage et cr\u00e9ez une composition synchronis\u00e9e.<\/p>\n<figure id=\"attachment_190035\" aria-describedby=\"caption-attachment-190035\" style=\"width: 1334px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190035 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/create-pattern.png\" alt=\"Cr\u00e9er une composition\" width=\"1334\" height=\"1184\"><figcaption id=\"caption-attachment-190035\" class=\"wp-caption-text\">Cr\u00e9er une composition<\/figcaption><\/figure>\n<p>Ajoutez un nom et une cat\u00e9gorie pour la composition de bloc, et assurez-vous de la synchroniser.<\/p>\n<figure id=\"attachment_190041\" aria-describedby=\"caption-attachment-190041\" style=\"width: 1386px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190041 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/add-new-pattern.png\" alt=\"Ajouter une nouvelle composition\" width=\"1386\" height=\"994\"><figcaption id=\"caption-attachment-190041\" class=\"wp-caption-text\">Ajouter une nouvelle composition<\/figcaption><\/figure>\n<p>Ensuite, si vous avez cr\u00e9\u00e9 la composition dans l&rsquo;\u00e9diteur d&rsquo;article, s\u00e9lectionnez-le et cliquez sur <strong>Modifier l&rsquo;original<\/strong> dans la barre d&rsquo;outils du bloc. Vous pouvez aussi vous rendre dans la section <strong>Compositions <\/strong>de l&rsquo;\u00e9diteur de site et trouver la composition sous <strong>Mes compositions<\/strong> ou dans la cat\u00e9gorie de compositions que vous avez d\u00e9finie auparavant.<\/p>\n<p>Ouvrez l&rsquo;\u00e9diteur de code et trouvez le bloc que vous voulez lier \u00e0 votre champ personnalis\u00e9. Dans le d\u00e9limiteur de bloc, ajoutez le code suivant :<\/p>\n<pre><code class=\"language-json\">&lt;!-- wp:heading {\n\t\"metadata\":{\n\t\t\"bindings\":{\n\t\t\t\"content\":{\n\t\t\t\t\"source\":\"core\/post-meta\",\n\t\t\t\t\"args\":{\n\t\t\t\t\t\"key\":\"meta_fields_book_title\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} --&gt;<\/code><\/pre>\n<figure id=\"attachment_190042\" aria-describedby=\"caption-attachment-190042\" style=\"width: 1594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190042 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/block-pattern-in-code-editor.png\" alt=\"La composition de bloc dans l'\u00e9diteur de code.\" width=\"1594\" height=\"1258\"><figcaption id=\"caption-attachment-190042\" class=\"wp-caption-text\">La composition de bloc dans l&rsquo;\u00e9diteur de code.<\/figcaption><\/figure>\n<p>Enregistrez la composition et cr\u00e9ez un nouvel article. Ajoutez la composition \u00e0 votre contenu et d\u00e9finissez une valeur pour le champ personnalis\u00e9. Vous devriez voir cette valeur s&rsquo;appliquer automatiquement \u00e0 votre composition.<\/p>\n<figure id=\"attachment_190044\" aria-describedby=\"caption-attachment-190044\" style=\"width: 2120px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-190044 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2025\/01\/bound-blocks-in-a-synced-block-pattern.png\" alt=\"Un titre li\u00e9 dans une composition synchronis\u00e9e\" width=\"2120\" height=\"1226\"><figcaption id=\"caption-attachment-190044\" class=\"wp-caption-text\">Un titre li\u00e9 dans une composition synchronis\u00e9e<\/figcaption><\/figure>\n<p>Maintenant, vous pouvez jouer avec cette extension. Gr\u00e2ce aux champs personnalis\u00e9s et \u00e0 l&rsquo;API Block Bindings, vous pouvez ajouter d&rsquo;autres champs et contr\u00f4les pour remplir automatiquement vos mises en page.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>D\u00e9velopper un bloc personnalis\u00e9 peut s&rsquo;av\u00e9rer difficile. Mais avez-vous besoin de construire un bloc quand vous pouvez faire plus avec une composition de bloc ?<\/p>\n<p>Avec les progr\u00e8s des compositions de blocs et l&rsquo;introduction de puissantes fonctionnalit\u00e9s pour les d\u00e9veloppeurs, telles que l&rsquo;API Block Bindings, il n&rsquo;est plus n\u00e9cessaire de cr\u00e9er des blocs personnalis\u00e9s pour construire des sites web sophistiqu\u00e9s et fonctionnels. Une simple extension et une composition de bloc peuvent effectivement automatiser une partie importante de votre flux de travail.<\/p>\n<p>Ce tutoriel a montr\u00e9 comment ajouter des fonctionnalit\u00e9s \u00e0 l&rsquo;\u00e9diteur d&rsquo;articles de WordPress gr\u00e2ce \u00e0 une extension. Cependant, ce que nous avons couvert dans cet article ne fait qu&rsquo;effleurer la surface de ce que vous pouvez accomplir avec les fonctions robustes que WordPress offre maintenant.<\/p>\n<p>Avez-vous d\u00e9j\u00e0 explor\u00e9 ces caract\u00e9ristiques et ajout\u00e9 des fonctionnalit\u00e9s \u00e0 l&rsquo;\u00e9diteur de WordPress ? Si oui, n&rsquo;h\u00e9sitez pas \u00e0 partager vos exp\u00e9riences et vos r\u00e9flexions dans la section des commentaires ci-dessous.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Au fil des ans, nous avons explor\u00e9 Gutenberg sous de nombreux angles. Nous avons diss\u00e9qu\u00e9 les fonctionnalit\u00e9s de l&rsquo;\u00e9diteur, les avons compar\u00e9es \u00e0 celles d&rsquo;autres constructeurs &#8230;<\/p>\n","protected":false},"author":36,"featured_media":79073,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1012,1028],"class_list":["post-79072","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-conseils-techniques","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>Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&#039;\u00e9diteur de blocs<\/title>\n<meta name=\"description\" content=\"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l&#039;\u00e9diteur de blocs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&#039;\u00e9diteur de blocs.\" \/>\n<meta property=\"og:description\" content=\"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l&#039;\u00e9diteur de blocs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/plugin-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=\"2025-01-20T08:19:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-20T13:29:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1470\" \/>\n\t<meta property=\"og:image:height\" content=\"735\" \/>\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=\"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l&#039;\u00e9diteur de blocs.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor-1024x512.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=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&rsquo;\u00e9diteur de blocs.\",\"datePublished\":\"2025-01-20T08:19:45+00:00\",\"dateModified\":\"2025-01-20T13:29:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\"},\"wordCount\":2679,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\",\"name\":\"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l'\u00e9diteur de blocs\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png\",\"datePublished\":\"2025-01-20T08:19:45+00:00\",\"dateModified\":\"2025-01-20T13:29:12+00:00\",\"description\":\"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l'\u00e9diteur de blocs.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"D\u00e9veloppement WordPress\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/developpement-wordpress\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&#8217;\u00e9diteur de blocs.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.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:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\",\"name\":\"Carlo Daniele\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.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:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l'\u00e9diteur de blocs","description":"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l'\u00e9diteur de blocs.","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:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l'\u00e9diteur de blocs.","og_description":"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l'\u00e9diteur de blocs.","og_url":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2025-01-20T08:19:45+00:00","article_modified_time":"2025-01-20T13:29:12+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l'\u00e9diteur de blocs.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor-1024x512.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&rsquo;\u00e9diteur de blocs.","datePublished":"2025-01-20T08:19:45+00:00","dateModified":"2025-01-20T13:29:12+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/"},"wordCount":2679,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png","inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/","url":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/","name":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l'\u00e9diteur de blocs","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png","datePublished":"2025-01-20T08:19:45+00:00","dateModified":"2025-01-20T13:29:12+00:00","description":"Apprenez \u00e0 cr\u00e9er plus facilement des mises en page complexes en construisant une extension Gutenberg pour am\u00e9liorer les fonctionnalit\u00e9s de l'\u00e9diteur de blocs.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2025\/01\/how-to-build-a-gutenberg-plugin-to-add-functionality-to-the-block-editor.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/plugin-gutenberg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"D\u00e9veloppement WordPress","item":"https:\/\/kinsta.com\/fr\/sujets\/developpement-wordpress\/"},{"@type":"ListItem","position":3,"name":"Comment construire un plugin Gutenberg pour ajouter des fonctionnalit\u00e9s \u00e0 l&#8217;\u00e9diteur de blocs."}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.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:\/\/kinsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63","name":"Carlo Daniele","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.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:\/\/kinsta.com\/fr\/blog\/author\/carlodaniele\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/79072","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=79072"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/79072\/revisions"}],"predecessor-version":[{"id":79084,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/79072\/revisions\/79084"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/translations\/es"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/79072\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/79073"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=79072"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=79072"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=79072"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}