{"id":82919,"date":"2026-03-31T15:09:16","date_gmt":"2026-03-31T14:09:16","guid":{"rendered":"https:\/\/kinqsta.com\/fr\/?p=82919&#038;preview=true&#038;preview_id=82919"},"modified":"2026-04-02T08:31:23","modified_gmt":"2026-04-02T07:31:23","slug":"blocs-gutenberg-uniquement-php","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/","title":{"rendered":"Comment construire des blocs Gutenberg uniquement en PHP"},"content":{"rendered":"<p>Pendant des ann\u00e9es, la ma\u00eetrise du d\u00e9veloppement de blocs Gutenberg exigeait une connaissance approfondie de technologies telles que React et Node.js, ainsi que des \u00e9tapes de compilation complexes et l&rsquo;utilisation d&rsquo;outils JavaScript.<\/p>\n<p>Cependant, le d\u00e9veloppement WordPress \u00e9volue, et il est d\u00e9sormais possible de cr\u00e9er et de g\u00e9rer des blocs Gutenberg enti\u00e8rement en PHP.<\/p>\n<p>Cela est particuli\u00e8rement avantageux pour les d\u00e9veloppeurs qui pr\u00e9f\u00e8rent \u00e9viter React et le d\u00e9veloppement JavaScript (JS) c\u00f4t\u00e9 serveur. Cela r\u00e9duit la courbe d&rsquo;apprentissage, simplifie l&rsquo;exp\u00e9rience du d\u00e9veloppeur et permet d&rsquo;obtenir de meilleures performances en supprimant la surcharge inutile des scripts front-end.<\/p>\n<p>Dans les sections suivantes, vous apprendrez \u00e0 tirer parti de ces nouvelles fonctionnalit\u00e9s pour cr\u00e9er des blocs Gutenberg exclusivement en PHP. Ce faisant, vous apprendrez \u00e0 cr\u00e9er des sites WordPress plus l\u00e9gers, plus rapides et plus faciles \u00e0 maintenir.<\/p>\n<p>C&rsquo;est plut\u00f4t passionnant, n&rsquo;est-ce pas ? Commen\u00e7ons.<\/p>\n<p><aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Veuillez noter que les blocs exclusivement en PHP mentionn\u00e9s dans cet article sont actuellement en phase exp\u00e9rimentale et sont susceptibles d&rsquo;\u00eatre modifi\u00e9s. <strong>N&rsquo;utilisez pas cette fonctionnalit\u00e9 en production !<\/strong><\/p>\n<\/aside>\n<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Que sont les blocs exclusivement en PHP et pourquoi sont-ils importants ?<\/h2>\n<p>La cr\u00e9ation d\u2019un bloc Gutenberg n\u00e9cessitait traditionnellement des comp\u00e9tences avanc\u00e9es en JavaScript c\u00f4t\u00e9 serveur et en codage React. Cela constituait un obstacle \u00e0 l\u2019adoption de l\u2019\u00e9diteur de blocs par les d\u00e9veloppeurs WordPress de longue date qui ne disposaient peut-\u00eatre pas des connaissances n\u00e9cessaires en <a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-react-js\/\">React<\/a> et <a href=\"https:\/\/kinqsta.com\/fr\/blog\/qu-est-ce-que-node-js\/\">Node.js<\/a>.<\/p>\n<p>Les choses changent d\u00e9sormais. \u00c0 partir de <a href=\"https:\/\/make.wordpress.org\/core\/2025\/10\/08\/whats-new-in-gutenberg-21-8-08-october\/\" target=\"_blank\" rel=\"noopener noreferrer\">Gutenberg 21.8<\/a>, vous pouvez enregistrer des blocs Gutenberg en utilisant uniquement du <a href=\"https:\/\/kinqsta.com\/fr\/blog\/comparaison-php\/\">PHP<\/a>. Cela \u00e9vite la complexit\u00e9 li\u00e9e \u00e0 la mise en place d&rsquo;un environnement Node.js pour ceux qui ne travaillent pas avec du JavaScript c\u00f4t\u00e9 serveur.<\/p>\n<p>Gr\u00e2ce \u00e0 l&rsquo;enregistrement de blocs uniquement en PHP, vous pouvez enregistrer et afficher des blocs \u00e0 la fois dans l&rsquo;\u00e9diteur et en frontend en utilisant le m\u00eame code PHP. Cela encourage les sites utilisant des th\u00e8mes hybrides ou des fonctions PHP traditionnelles et des <a href=\"https:\/\/kinqsta.com\/fr\/blog\/shortcodes-wordpress\/\">codes courts<\/a> \u00e0 adopter et \u00e0 d\u00e9velopper sur l&rsquo;\u00e9diteur de blocs.<\/p>\n<p>Pour ceux qui souhaitent en savoir plus, voici les principales pull requests GitHub consacr\u00e9es aux blocs uniquement en PHP.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/71794\" target=\"_blank\" rel=\"noopener noreferrer\">Autoriser l&rsquo;enregistrement de blocs exclusivement en PHP<\/a> : cette PR impl\u00e9mente l&rsquo;enregistrement automatique des blocs c\u00f4t\u00e9 serveur et renomme le support <code>auto_ssr<\/code> en <code>auto_register<\/code>.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/73556\" target=\"_blank\" rel=\"noopener noreferrer\">Blocs uniquement en PHP : transmettre toutes les m\u00e9tadonn\u00e9es de l&rsquo;enregistrement PHP au client<\/a> : les blocs exclusivement en PHP prenant en charge <code>auto_register<\/code> transmettent d\u00e9sormais toutes les m\u00e9tadonn\u00e9es de l&rsquo;enregistrement PHP au client.<\/li>\n<li><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/74102\">Blocs uniquement PHP : g\u00e9n\u00e9rer des contr\u00f4les d&rsquo;inspection \u00e0 partir des attributs<\/a> : cette PR introduit la g\u00e9n\u00e9ration automatique de l&rsquo;interface utilisateur (contr\u00f4les d&rsquo;inspection) en fonction des attributs d\u00e9clar\u00e9s sur le serveur.<\/li>\n<\/ul>\n<h2>Comment cr\u00e9er votre premier bloc Gutenberg exclusivement en PHP<\/h2>\n<p>Lorsqu&rsquo;un bloc est enregistr\u00e9 uniquement c\u00f4t\u00e9 serveur \u2014 sans fichiers JS \u2014 et que le nouveau drapeau de prise en charge <code>auto_register<\/code> est d\u00e9fini sur <code>true<\/code>, l&rsquo;\u00e9diteur utilise automatiquement le composant <code>ServerSideRender<\/code> pour enregistrer le bloc c\u00f4t\u00e9 client et afficher l&rsquo;aper\u00e7u du bloc. En substance, le contenu du bloc est d\u00e9sormais g\u00e9n\u00e9r\u00e9 directement \u00e0 partir du code PHP, tant dans l&rsquo;\u00e9diteur que sur l&rsquo;interface publique.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>Les exemples pr\u00e9sent\u00e9s dans cet article ne fonctionneront que si vous avez install\u00e9 <a href=\"https:\/\/make.wordpress.org\/core\/2025\/12\/17\/gutenberg-22-3-december-17\/\" target=\"_blank\" rel=\"noopener noreferrer\">Gutenberg 22.3<\/a> sur votre site de d\u00e9veloppement.<\/p>\n<\/aside>\n\n<p>\u00c0 titre d&rsquo;illustration, voici un exemple PHP simple qui enregistre un bloc \u00e0 l&rsquo;aide de la m\u00e9thode PHP-only.<\/p>\n<pre><code class=\"language-php\">\/**\n * Render callback (frontend and editor)\n *\/\nfunction my_php_only_block_render( $attributes ) {\n\treturn '&lt;div&gt;\n\t\t&lt;h3&gt;\ud83d\ude80 PHP-only Block&lt;\/h3&gt;\n\t\t&lt;p&gt;This block was created with only PHP!&lt;\/p&gt;\n\t&lt;\/div&gt;';\n}\n\n\/**\n * Register the block on the 'init' hook.\n *\/\nadd_action( 'init', function() {\n\tregister_block_type( 'my-plugin\/php-only-test-block', array(\n\t\t'title'           =&gt; 'My PHP-only Block',\n\t\t'icon'            =&gt; 'welcome-learn-more',\n\t\t'category'        =&gt; 'text',\n\t\t'render_callback' =&gt; 'my_php_only_block_render',\n\t\t'supports'        =&gt; array(\n\t\t\t\/\/ Automatically registers the block in the Editor JS (previously auto_ssr)\n\t\t\t'auto_register' =&gt; true, \n\t\t),\n\t) );\n});<\/code><\/pre>\n<p>Vous pouvez tester ce code en le copiant-collant dans le fichier principal d&rsquo;une extension personnalis\u00e9e. Apr\u00e8s avoir activ\u00e9 l&rsquo;extension, vous devriez voir le bloc \u00ab Mon bloc uniquement en PHP \u00bb dans l&rsquo;outil d&rsquo;insertion de blocs.<\/p>\n<figure id=\"attachment_206054\" aria-describedby=\"caption-attachment-206054\" style=\"width: 1644px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206054 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/basic-php-only-block.png\" alt=\"Un bloc simple uniquement en PHP\" width=\"1644\" height=\"656\"><figcaption id=\"caption-attachment-206054\" class=\"wp-caption-text\">Un bloc simple uniquement en PHP<\/figcaption><\/figure>\n<p>La <a href=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-dynamiques-gutenberg\/#register-the-block-on-the-server\">fonction <code>register_block_type<\/code><\/a> enregistre un type de bloc sur le serveur. Elle <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/73556\" target=\"_blank\" rel=\"noopener noreferrer\">inclut d\u00e9sormais <\/a><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/73556\" target=\"_blank\" rel=\"noopener noreferrer\">la nouvelle prise en charge <code>auto_register<\/code><\/a>, qui indique \u00e0 Gutenberg de transmettre les m\u00e9tadonn\u00e9es issues de l&rsquo;enregistrement PHP.<\/p>\n<p>La fonction accepte deux arguments :<\/p>\n<ul>\n<li>Le nom du type de bloc, y compris l&rsquo;espace de noms. Dans cet exemple, le nom du bloc est <code>my-plugin\/php-only-test-block<\/code>.<\/li>\n<li>Un tableau d\u2019arguments pour le type de bloc. Dans le code ci-dessus, nous d\u00e9finissons <code>title<\/code>, <code>icon<\/code>, <code>category<\/code>, <code>render_callback<\/code> et <code>supports<\/code>. Encore une fois, pour les types de blocs uniquement en PHP, le tableau <code>supports<\/code> doit inclure <code>'auto_register' =&gt; true<\/code>.<\/li>\n<\/ul>\n<p>En plus de simplifier la cr\u00e9ation de types de blocs personnalis\u00e9s et de faciliter leur int\u00e9gration dans des th\u00e8mes hybrides, les blocs uniquement en PHP peuvent servir de conteneurs pour les fonctions PHP h\u00e9rit\u00e9es et les codes courts. De plus, l\u2019utilisation de blocs uniquement en PHP ouvre la voie \u00e0 de nouvelles possibilit\u00e9s d\u2019int\u00e9grations personnalis\u00e9es et de fonctionnalit\u00e9s c\u00f4t\u00e9 serveur.<\/p>\n<p>Selon <a href=\"https:\/\/github.com\/WordPress\/gutenberg\/issues\/71792\">H\u00e9ctor Priethor<\/a>,<\/p>\n<blockquote><p>Un mod\u00e8le d\u2019enregistrement purement PHP simplifierait les exigences minimales pour le d\u00e9veloppement de blocs, les rendant accessibles \u00e0 un public plus large de d\u00e9veloppeurs, et contribuerait \u00e0 faire \u00e9voluer l\u2019\u00e9cosyst\u00e8me des blocs au-del\u00e0 de l\u2019utilisation avanc\u00e9e de JavaScript.<\/p><\/blockquote>\n<h2>Utilisation d&rsquo;attributs pour cr\u00e9er l&rsquo;interface utilisateur des r\u00e9glages de bloc<\/h2>\n<p><a href=\"https:\/\/github.com\/WordPress\/gutenberg\/pull\/74102\" target=\"_blank\" rel=\"noopener noreferrer\">La PR 74102<\/a> permet la g\u00e9n\u00e9ration automatique de contr\u00f4les d\u2019inspection \u00e0 partir des d\u00e9finitions d\u2019attributs des blocs. Cela permet aux utilisateurs de configurer l\u2019apparence et les fonctionnalit\u00e9s de vos blocs exclusivement en PHP comme n\u2019importe quel bloc Gutenberg enregistr\u00e9 via JavaScript.<\/p>\n<p>Auparavant, vous deviez cr\u00e9er manuellement un fichier <code>edit.js<\/code> dans React et d\u00e9finir divers contr\u00f4les de r\u00e9glages \u00e0 l\u2019aide de composants React.<\/p>\n<p>D\u00e9sormais, Gutenberg lit les d\u00e9finitions d\u2019attributs et g\u00e9n\u00e8re automatiquement les champs de saisie correspondants dans l\u2019\u00e9diteur WordPress.<\/p>\n<p>Le syst\u00e8me mappe les types de donn\u00e9es d\u00e9finis dans le tableau <code>d\u2019attributs<\/code> aux d\u00e9finitions de champs <code>DataForm<\/code>.<\/p>\n<ul>\n<li><code>'type' =&gt; 'string'<\/code> g\u00e9n\u00e8re un champ de texte.<\/li>\n<li><code>'type' =&gt; 'number'<\/code> g\u00e9n\u00e8re un champ num\u00e9rique.<\/li>\n<li><code>'type' =&gt; 'integer'<\/code> g\u00e9n\u00e8re un champ entier.<\/li>\n<li><code>'type' =&gt; 'boolean'<\/code> g\u00e9n\u00e8re une case \u00e0 cocher.<\/li>\n<li><code>'type' =&gt; 'string'<\/code> avec <code>'enum' =&gt; array()<\/code>\u00a0g\u00e9n\u00e8re un champ de s\u00e9lection.<\/li>\n<\/ul>\n<p>Vous vous rendrez compte que vous ne pouvez utiliser que quelques contr\u00f4les. Si vous avez besoin de contr\u00f4les sp\u00e9cifiques, tels que <code>RichText<\/code>, <code>RangeControl<\/code> ou <code>ToggleControl<\/code>, vous devrez tout de m\u00eame opter pour l&rsquo;approche JS\/React.<\/p>\n<p>Cependant, cet ajout pr\u00e9sente des avantages consid\u00e9rables. Les barri\u00e8res \u00e0 l&rsquo;entr\u00e9e sont encore abaiss\u00e9es, et vous n&rsquo;aurez pas besoin d&rsquo;apprendre React, Webpack ou NPM pour cr\u00e9er des blocs personnalis\u00e9s avec de simples options modifiables.<\/p>\n<p>Dans l&rsquo;exemple suivant, nous \u00e9tendons le bloc d&rsquo;exemple pr\u00e9sent\u00e9 dans la section pr\u00e9c\u00e9dente en ajoutant quelques attributs.<\/p>\n<pre><code class=\"language-php\">\/**\n * 1. Define the block's HTML output.\n *\/\nfunction my_php_only_block_render( $attributes ) {\n\t\/\/ Extract attributes\n\t$title   = esc_html( $attributes['blockTitle'] );\n\t$count   = intval( $attributes['itemCount'] );\n\t$enabled = $attributes['isEnabled']; \/\/ Boolean from the ToggleControl\n\t$size    = esc_attr( $attributes['displaySize'] );\n\t\n\t\/\/ Start building the output\n\t$output = sprintf( '&lt;div class=\"my-php-block\" style=\"font-size: %s; border: 1px solid #ccc; padding: 15px;\"&gt;', \n\t\t$size === 'large' ? '20px' : ($size === 'small' ? '12px' : '16px') \n\t);\n\t\n\t$output .= sprintf( '&lt;h3&gt;\ud83d\ude80 %s&lt;\/h3&gt;', $title );\n\t\n\t\/\/ If the toggle is ON, show the list. If OFF, show a fallback message.\n\tif ( $enabled ) {\n\t\t$output .= '&lt;ul&gt;';\n\t\tfor ( $i = 1; $i &lt;= $count; $i++ ) {\n\t\t\t$output .= sprintf( '&lt;li&gt;Item %d&lt;\/li&gt;', $i );\n\t\t}\n\t\t$output .= '&lt;\/ul&gt;';\n\t} else {\n\t\t$output .= '&lt;p&gt;&lt;em&gt;The list is currently disabled.&lt;\/em&gt;&lt;\/p&gt;';\n\t}\n\t\n\t$output .= '&lt;\/div&gt;';\n\treturn $output;\n}\n\n\/**\n * 2. Register the block on 'init'.\n *\/\nadd_action( 'init', function() {\n\tregister_block_type( 'my-plugin\/php-only-test-block', array(\n\t\t'title'           =&gt; 'My PHP-only Block',\n\t\t'icon'            =&gt; 'welcome-learn-more',\n\t\t'category'        =&gt; 'text',\n\t\t'render_callback' =&gt; 'my_php_only_block_render',\n\n\t\t\/\/ Attributes used to generate the Inspector UI\n\t\t'attributes'      =&gt; array(\n\t\t\t'blockTitle'  =&gt; array(\n\t\t\t\t'type'    =&gt; 'string',\n\t\t\t\t'default' =&gt; 'PHP-only Block',\n\t\t\t),\n\t\t\t'itemCount'   =&gt; array(\n\t\t\t\t'type'    =&gt; 'integer',\n\t\t\t\t'default' =&gt; 3,\n\t\t\t),\n\t\t\t'isEnabled'   =&gt; array(\n\t\t\t\t'type'    =&gt; 'boolean',\n\t\t\t\t'default' =&gt; true,\n\t\t\t),\n\t\t\t'displaySize' =&gt; array(\n\t\t\t\t'type'    =&gt; 'string',\n\t\t\t\t'enum'    =&gt; array( 'small', 'medium', 'large' ),\n\t\t\t\t'default' =&gt; 'medium',\n\t\t\t),\n\t\t),\n\n\t\t'supports'        =&gt; array(\n\t\t\t'auto_register' =&gt; true, \n\t\t),\n\t) );\n});<\/code><\/pre>\n<p>Un rapide coup d&rsquo;\u0153il \u00e0 ce code montre \u00e0 quel point il est facile d&rsquo;enregistrer un bloc personnalis\u00e9 avec tous ses r\u00e9glages de configuration \u00e0 l&rsquo;aide de la nouvelle API. Les attributs sont d\u00e9sormais utilis\u00e9s non seulement pour stocker les donn\u00e9es saisies par l&rsquo;utilisateur, mais aussi pour d\u00e9finir le sch\u00e9ma de l&rsquo;interface utilisateur. Le code ci-dessus effectue les op\u00e9rations suivantes :<\/p>\n<ul>\n<li>La fonction <code>register_block_type<\/code> enregistre le type de bloc <code>my-plugin\/php-only-test-block<\/code>.<\/li>\n<li>Le deuxi\u00e8me argument transmis \u00e0 la fonction est un tableau contenant les \u00e9l\u00e9ments suivants : <code>title<\/code>, <code>icon<\/code>, <code>category<\/code>, <code>render_callback<\/code>, <code>attributes<\/code> et <code>supports<\/code>.<\/li>\n<li>Le tableau <code>attributes<\/code> contient les attributs du bloc. Dans l&rsquo;exemple ci-dessus, le tableau comprend les \u00e9l\u00e9ments <code>blockTitle<\/code>, <code>itemCount<\/code>, <code>isEnabled<\/code> et <code>displaySize<\/code>.<\/li>\n<li><code>'auto_register' =&gt; true<\/code>\u00a0active l&rsquo;enregistrement automatique c\u00f4t\u00e9 serveur.<\/li>\n<\/ul>\n<p>Voici ce que fait la fonction de rappel <code>my_php_only_block_render<\/code> :<\/p>\n<ul>\n<li>Tout d&rsquo;abord, la fonction extrait les valeurs des attributs du tableau <code>$attributes<\/code> et les attribue aux variables <code>$title<\/code>, <code>$count<\/code>, <code>$enabled<\/code> et <code>$size<\/code>.<\/li>\n<li>Ensuite, elle g\u00e9n\u00e8re le contenu du bloc.<\/li>\n<\/ul>\n<p>Voici le r\u00e9sultat \u00e0 l&rsquo;\u00e9cran :<\/p>\n<figure id=\"attachment_206110\" aria-describedby=\"caption-attachment-206110\" style=\"width: 2074px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206110 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/php-only-block-settings.png\" alt=\"Un bloc uniquement en PHP avec des r\u00e9glages de bloc\" width=\"2074\" height=\"1102\"><figcaption id=\"caption-attachment-206110\" class=\"wp-caption-text\">Un bloc uniquement en PHP avec des r\u00e9glages de bloc<\/figcaption><\/figure>\n<h2>Un exemple concret de blocs uniquement en PHP<\/h2>\n<p>Bien qu\u2019il existe de nombreux cas de figure o\u00f9 JavaScript reste n\u00e9cessaire, vous pouvez d\u00e9j\u00e0 faire beaucoup avec des blocs exclusivement en PHP, en particulier lorsqu\u2019ils sont utilis\u00e9s avec des propri\u00e9t\u00e9s de bloc.<\/p>\n<p>Dans l\u2019exemple suivant, nous utilisons la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_block_wrapper_attributes\/\" target=\"_blank\" rel=\"noopener noreferrer\">fonction <code>get_block_wrapper_attributes()<\/code><\/a>, qui g\u00e9n\u00e8re une cha\u00eene d\u2019attributs pour le bloc en cours de rendu. Le bloc recevra automatiquement les couleurs, les bordures et les ombres d\u00e9finies par l&rsquo;utilisateur, et appliquera les styles correspondants au conteneur principal. De cette mani\u00e8re, le bloc est personnalisable via les outils natifs de Gutenberg, tout comme un bloc bas\u00e9 sur React.<\/p>\n<p>Pour voir cela en action, cr\u00e9ez un dossier <code>smart-pricing-widget<\/code> sur votre ordinateur. Dans ce dossier, cr\u00e9ez un fichier <code>style.css<\/code> contenant le code CSS suivant :<\/p>\n<pre><code class=\"language-css\">\/* style.css *\/\n.pricing-card {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    text-align: center;\n    box-sizing: border-box;\n}\n\n.pricing-card h3 {\n    margin: 0;\n    font-size: 1.5rem;\n}\n\n.pricing-card .price-value {\n    font-size: 3.5rem;\n    font-weight: 800;\n    margin: 15px 0;\n}\n\n.pricing-card ul {\n    list-style: none;\n    padding: 25px 0;\n    margin: 20px 0;\n    width: 100%;\n    border-top: 1px solid rgba(128,128,128,0.3);\n    display: flex;\n\tflex-direction: column;\n    gap: 12px;\n}\n\n.pricing-card li {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 10px;\n}\n\n.pricing-card .cta-button {\n    margin-top: auto;\n\tpadding: 15px 25px;\n    border-radius: 8px;\n    text-decoration: none;\n    font-weight: bold;\n    transition: opacity 0.2s;\n}\n\n.pricing-card .cta-button:hover {\n    opacity: 0.8;\n}\n\n\/* Variantes de th\u00e8me *\/\n.pricing-card.theme-light { background-color: #ffffff; color: #000000; }\n.pricing-card.theme-light .cta-button { background-color: #21759b; color: #ffffff; }\n\n.pricing-card.theme-dark { couleur de fond : #1a1a1a ; couleur : #ffffff ; }\n.pricing-card.theme-dark .cta-button { couleur de fond : #ffffff ; couleur : #1a1a1a ; }\n\n.pricing-card.theme-blue { background-color: #21759b; color: #ffffff; }\n.pricing-card.theme-blue .cta-button { background-color: #000000; color: #ffffff; }\n\n\/* Classes utilitaires *\/\n.pricing-card .is-full-width {\n    width: 100%;\n    display: block;\n    align-self: stretch;\n}<\/code><\/pre>\n<p>Nous ne commenterons pas ce code, car il s&rsquo;agit d&rsquo;une simple feuille de style pour votre bloc de widget.<\/p>\n<p>Cr\u00e9ez maintenant le fichier principal de votre extension, nommez-le <code>smart-pricing-widget.php<\/code>, puis collez-y le code suivant :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\/**\n * Plugin Name: Smart Pricing Widget\n * Plugin URI:  https:\/\/example.com\/\n * Description: PHP-only Pricing Table block\n * Version:     1.2.0\n * Author:      Your Name\n * Text Domain: smart-pricing-widget\n *\/\n\nif ( ! defined( 'ABSPATH' ) ) exit;\n\n\/**\n * Render callback\n *\/\nfunction render_smart_pricing_block( $attributes ) {\n\t$plan_name = esc_html( $attributes['planName'] );\n\t$price     = intval( $attributes['price'] );\n\t$theme     = $attributes['blockTheme'];\n\t$btn_text  = esc_html( $attributes['buttonText'] );\n\t$btn_size  = $attributes['buttonSize'];\n\n\t$features_raw = $attributes['featuresList'];\n\t$features_array = array_filter( array_map( 'trim', explode( ',', $features_raw ) ) );\n\n\t$wrapper_attributes = wp_kses_data( get_block_wrapper_attributes( array(\n\t\t'class' =&gt; \"pricing-card theme-{$theme}\",\n\t) ) );\n\n\t$output = sprintf( '&lt;div %s&gt;', $wrapper_attributes );\n\t$output .= sprintf( '&lt;h3&gt;%s&lt;\/h3&gt;', $plan_name );\n\t$output .= sprintf( '&lt;div class=\"price-value\"&gt;\u20ac%d&lt;\/div&gt;', $price );\n\n\tif ( ! empty( $features_array ) ) {\n\t\t$output .= '&lt;ul&gt;';\n\t\tforeach ( $features_array as $feature ) {\n\t\t\t$is_checked = strpos( $feature, '+' ) === 0;\n\t\t\t$clean_text = esc_html( ltrim( $feature, '+- ' ) );\n\t\t\t$icon       = $is_checked ? '\u2705' : '\u274c';\n\t\t\t$style      = $is_checked ? '' : 'style=\"opacity: 0.6;\"';\n\t\t\t\n\t\t\t$output .= sprintf( '&lt;li %s&gt;&lt;span&gt;%s&lt;\/span&gt; %s&lt;\/li&gt;', $style, $icon, $clean_text );\n\t\t}\n\t\t$output .= '&lt;\/ul&gt;';\n\t}\n\n\t$btn_class = 'cta-button' . ( $btn_size === 'full' ? ' is-full-width' : '' );\n\t$output .= sprintf( '&lt;a href=\"#\" class=\"%s\"&gt;%s&lt;\/a&gt;', esc_attr( $btn_class ), $btn_text );\n\t$output .= '&lt;\/div&gt;';\n\n\treturn $output;\n}\n\n\/**\n * Register Assets and Block\n *\/\nadd_action( 'init', function() {\n\t\/\/ 1. Register the CSS file\n\twp_register_style(\n\t\t'smart-pricing-style',\n\t\tplugins_url( 'style.css', __FILE__ ),\n\t\tarray(),\n\t\t'1.2.0'\n\t);\n\n\t\/\/ 2. Register the Block\n\tregister_block_type( 'tutorial\/smart-pricing', array(\n\t\t'api_version'     =&gt; 3,\n\t\t'title'           =&gt; 'Pricing Card',\n\t\t'icon'            =&gt; 'cart',\n\t\t'category'        =&gt; 'widgets',\n\t\t'render_callback' =&gt; 'render_smart_pricing_block',\n\t\t\/\/ Link the registered style handle here\n\t\t'style'           =&gt; 'smart-pricing-style',\n\t\t'attributes'      =&gt; array(\n\t\t\t'planName'     =&gt; array( 'type' =&gt; 'string', 'default' =&gt; 'Professional' ),\n\t\t\t'price'        =&gt; array( 'type' =&gt; 'integer', 'default' =&gt; 49 ),\n\t\t\t'buttonText'   =&gt; array( 'type' =&gt; 'string', 'default' =&gt; 'Choose Plan' ),\n\t\t\t'buttonSize'   =&gt; array( 'type' =&gt; 'string', 'enum' =&gt; array( 'auto', 'full' ), 'default' =&gt; 'auto' ),\n\t\t\t'blockTheme'   =&gt; array( 'type' =&gt; 'string', 'enum' =&gt; array( 'light', 'dark', 'blue' ), 'default' =&gt; 'light' ),\n\t\t\t'featuresList' =&gt; array( 'type' =&gt; 'string', 'default' =&gt; \"+ Support, + Updates, - Domain\" ),\n\t\t),\n\t\t'supports'        =&gt; array(\n\t\t\t'auto_register' =&gt; true,\n\t\t\t'color'         =&gt; array( 'background' =&gt; true, 'text' =&gt; true ),\n\t\t\t'spacing'       =&gt; array( 'margin' =&gt; true, 'padding' =&gt; true ),\n\t\t\t'typography'    =&gt; array( 'fontSize' =&gt; true ),\n\t\t\t'shadow'        =&gt; true,\n\t\t\t'__experimentalBorder' =&gt; array( 'color' =&gt; true, 'radius' =&gt; true, 'style' =&gt; true, 'width' =&gt; true ),\n\t\t\t'border'        =&gt; array( 'color' =&gt; true, 'radius' =&gt; true, 'style' =&gt; true, 'width' =&gt; true ),\n\t\t),\n\t) );\n});<\/code><\/pre>\n<p>Ce script comprend deux fonctions. La fonction <code>register_block_type()<\/code> est le moteur de votre plugin. Voici ses principaux \u00e9l\u00e9ments :<\/p>\n<ul>\n<li>Le premier argument est l&rsquo;identifiant du bloc, incluant l&rsquo;espace de noms (<code>tutorial\/smart-pricing<\/code>).<\/li>\n<li>Le deuxi\u00e8me argument est un tableau d&rsquo;arguments. Dans le code ci-dessus, nous avons d\u00e9fini la version de l&rsquo;API, le titre, l&rsquo;ic\u00f4ne, la cat\u00e9gorie, la fonction de rappel de rendu, le style, les attributs et <a href=\"https:\/\/developer.wordpress.org\/block-editor\/reference-guides\/block-api\/block-supports\/\" target=\"_blank\" rel=\"noopener noreferrer\">les supports<\/a>.<\/li>\n<li>Les attributs du tableau g\u00e9n\u00e8rent les contr\u00f4les que les utilisateurs utiliseront pour ajouter du contenu et configurer le bloc. L&rsquo;\u00e9l\u00e9ment <code>type<\/code> sp\u00e9cifie le type de contr\u00f4le \u00e0 ajouter \u00e0 l&rsquo;inspecteur de bloc. Dans cet exemple, il s&rsquo;agit de champs de texte (<code>'type\u2019 =&gt; 'string\u2019<\/code>), d&rsquo;un entier (<code>'type\u2019 =&gt; 'integer\u2019<\/code>) et de deux menus d\u00e9roulants (<code>'type\u2019 =&gt; 'string\u2019, 'enum\u2019 =&gt; array()<\/code>).<\/li>\n<li>Les \u00e9l\u00e9ments du tableau <code>supports<\/code> ajoutent des fonctionnalit\u00e9s qui permettent de personnaliser le style du bloc. Comme nous l\u2019avons mentionn\u00e9 pr\u00e9c\u00e9demment, le seul support requis dans un bloc uniquement PHP est <code>auto_register<\/code>, qui permet la g\u00e9n\u00e9ration automatique de l\u2019interface utilisateur pour les attributs personnalis\u00e9s. Les autres supports d\u00e9clar\u00e9s ci-dessus incluent color, spacing, typography, shadow et border.<\/li>\n<\/ul>\n<p>La fonction de rappel <code>render_smart_pricing_block()<\/code> g\u00e9n\u00e8re le code HTML du bloc. Voici une description d\u00e9taill\u00e9e du fonctionnement de cette fonction :<\/p>\n<ul>\n<li>Elle extrait et nettoie les attributs du bloc, puis ajoute le code CSS qui g\u00e9n\u00e8re l\u2019apparence du bloc dans l\u2019interface publique et l\u2019\u00e9diteur.<\/li>\n<li>Les fonctionnalit\u00e9s \u00e0 afficher dans le bloc (<code>$attributes['featuresList'];<\/code>) sont g\u00e9r\u00e9es s\u00e9par\u00e9ment. Actuellement, il n\u2019est pas possible d\u2019ajouter des contr\u00f4les avanc\u00e9s \u00e0 la colonne lat\u00e9rale des r\u00e9glages du bloc. Pour cr\u00e9er une liste, telle qu\u2019une liste de fonctionnalit\u00e9s, vous ne pouvez utiliser qu\u2019un simple champ de texte. Dans cet exemple, vous devez saisir manuellement les fonctionnalit\u00e9s du produit, s\u00e9par\u00e9es par des virgules.<\/li>\n<li>La variable <code>$wrapper_attributes<\/code> est un conteneur pour les attributs du wrapper fournis par la <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_block_wrapper_attributes\/\">fonction <code>get_block_wrapper_attributes<\/code><\/a>. Cette fonction ne se contente pas d&rsquo;ajouter les classes sp\u00e9cifi\u00e9es dans le code (<code>pricing-card theme-{$theme}<\/code>), mais r\u00e9cup\u00e8re automatiquement toutes les personnalisations de style que l&rsquo;utilisateur d\u00e9finit dans l&rsquo;inspecteur de bloc, y compris les couleurs, les bordures, le remplissage, la marge, l&rsquo;ombre, la typographie et les classes de bloc standard (<code>wp-block-tutorial-smart-pricing<\/code>).<\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_kses_data\/\"><code>wp_kses_data<\/code><\/a> garantit qu\u2019il n\u2019y a pas de balises ou de scripts malveillants (XSS) dans la cha\u00eene.<\/li>\n<li>Le reste du code g\u00e9n\u00e8re le contenu du bloc.<\/li>\n<\/ul>\n<p>Activez l&rsquo;extension et cr\u00e9ez un nouvel article ou une nouvelle page. Ouvrez l&rsquo;\u00e9diteur de blocs et faites d\u00e9filer vers le bas jusqu&rsquo;\u00e0 la section Widgets. Vous devriez y voir votre bloc \u00ab Pricing Card \u00bb, identifi\u00e9 par une ic\u00f4ne de panier.<\/p>\n<figure id=\"attachment_206128\" aria-describedby=\"caption-attachment-206128\" style=\"width: 2034px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206128 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/php-only-block-example.png\" alt=\"Un bloc personnalis\u00e9 uniquement en PHP dans l'\u00e9diteur de blocs\" width=\"2034\" height=\"1322\"><figcaption id=\"caption-attachment-206128\" class=\"wp-caption-text\">Un bloc personnalis\u00e9 uniquement en PHP dans l&rsquo;\u00e9diteur de blocs<\/figcaption><\/figure>\n<p>L&rsquo;image ci-dessus montre le bloc avec le th\u00e8me clair par d\u00e9faut.<\/p>\n<p>Sur l&rsquo;image ci-dessous, vous pouvez voir la version sombre du bloc ainsi que les r\u00e9glages que vous avez d\u00e9finis dans votre extension.<\/p>\n<figure id=\"attachment_206129\" aria-describedby=\"caption-attachment-206129\" style=\"width: 2188px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206129 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/php-only-dark-theme-block-settings.png\" alt=\"Le bloc uniquement en PHP avec ses r\u00e9glages\" width=\"2188\" height=\"1652\"><figcaption id=\"caption-attachment-206129\" class=\"wp-caption-text\">Le bloc uniquement en PHP avec ses r\u00e9glages<\/figcaption><\/figure>\n<p>L&rsquo;image suivante montre les commandes de style que vous avez ajout\u00e9es gr\u00e2ce aux fonctionnalit\u00e9s de prise en charge des blocs.<\/p>\n<figure id=\"attachment_206130\" aria-describedby=\"caption-attachment-206130\" style=\"width: 2104px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206130 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/php-only-customized-dark-theme.png\" alt=\"Le th\u00e8me sombre du bloc uniquement en PHP avec des couleurs personnalis\u00e9es\" width=\"2104\" height=\"1310\"><figcaption id=\"caption-attachment-206130\" class=\"wp-caption-text\">Le th\u00e8me sombre du bloc uniquement en PHP avec des couleurs personnalis\u00e9es<\/figcaption><\/figure>\n<p>Il convient \u00e9galement de noter que les styles ajout\u00e9s par les extensions remplacent les styles du th\u00e8me du bloc. Cela permet une plus grande personnalisation de l&rsquo;apparence du bloc, comme le montre l&rsquo;image suivante :<\/p>\n<figure id=\"attachment_206131\" aria-describedby=\"caption-attachment-206131\" style=\"width: 2406px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206131 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/customized-php-only-blocks.png\" alt=\"Un tableau des prix pour 3 niveaux de service avec trois instances de votre bloc uniquement en PHP\" width=\"2406\" height=\"1362\"><figcaption id=\"caption-attachment-206131\" class=\"wp-caption-text\">Un tableau des prix pour 3 niveaux de service avec trois instances de votre bloc uniquement en PHP<\/figcaption><\/figure>\n<h2>Convertir les codes courts h\u00e9rit\u00e9s en blocs Gutenberg avec du PHP pur<\/h2>\n<p>L&rsquo;une des utilisations les plus directes des blocs PHP est celle de conteneurs de codes courts. Avec Gutenberg, vous pouvez toujours utiliser des codes courts dans votre contenu, mais vous devez ins\u00e9rer manuellement votre code court dans un bloc Code court, ce qui n&rsquo;est pas l&rsquo;exp\u00e9rience la plus agr\u00e9able.<\/p>\n<p>Supposons que vous disposiez du code court suivant :<\/p>\n<pre><code class=\"language-php\">function my_custom_alert_shortcode( $atts ) {\n\t$options = shortcode_atts( array(\n\t\t'type'    =&gt; 'info',\n\t\t'message' =&gt; 'Default alert message',\n\t), $atts );\n\n\t$styles = array(\n\t\t'info'    =&gt; 'background: #d1ecf1; color: #0c5460; border-color: #bee5eb;',\n\t\t'warning' =&gt; 'background: #fff3cd; color: #856404; border-color: #ffeeba;',\n\t\t'error'   =&gt; 'background: #f8d7da; color: #721c24; border-color: #f5c6cb;'\n\t);\n\n\t$style = $styles[ $options['type'] ] ?? $styles['info'];\n\n\treturn sprintf(\n\t\t'&lt;div class=\"sc-alert-box\" style=\"%s padding: 20px; border: 1px solid; border-radius: 6px; margin: 10px 0;\"&gt;\n\t\t\t&lt;strong style=\"text-transform: uppercase;\"&gt;%s:&lt;\/strong&gt; %s\n\t\t&lt;\/div&gt;',\n\t\tesc_attr( $style ),\n\t\tesc_html( $options['type'] ),\n\t\tesc_html( $options['message'] )\n\t);\n}\nadd_shortcode( 'sc_alert', 'my_custom_alert_shortcode' );<\/code><\/pre>\n<p>Ce code g\u00e9n\u00e8re une simple bo\u00eete que vous pouvez ins\u00e9rer dans votre contenu \u00e0 l&rsquo;aide du code court suivant :<\/p>\n<pre><code class=\"language-text\">[sc_alert type=\"alert\" message=\"Bonjour\"]<\/code><\/pre>\n<p>Dans Gutenberg, vous utiliserez un bloc Code court pour ins\u00e9rer la bo\u00eete dans votre contenu, comme le montre l&rsquo;image suivante :<\/p>\n<figure id=\"attachment_206137\" aria-describedby=\"caption-attachment-206137\" style=\"width: 1304px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206137 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/shortcode-block.png\" alt=\"Un bloc Code court\" width=\"1304\" height=\"272\"><figcaption id=\"caption-attachment-206137\" class=\"wp-caption-text\">Un bloc Code court<\/figcaption><\/figure>\n<p>Le sc\u00e9nario change compl\u00e8tement avec les blocs PHP-only. Vous pouvez d\u00e9sormais encapsuler votre shortcode dans un bloc Gutenberg PHP-only et le configurer via les commandes de l&rsquo;interface utilisateur. Voici le code \u00e0 ajouter \u00e0 votre extension :<\/p>\n<pre><code class=\"language-php\">\/**\n * Rendering callback\n *\/\nfunction render_shortcode_alert_wrapper_block( $attributes ) {\n\n\t$type    = esc_attr( $attributes['alertType'] );\n\t$message = esc_attr( $attributes['alertMessage'] );\n\n\t$shortcode_string = sprintf( '[sc_alert type=\"%s\" message=\"%s\"]', $type, $message );\n\n\t$wrapper_attributes = wp_kses_data( get_block_wrapper_attributes( array(\n\t\t'class' =&gt; 'wp-block-shortcode-alert-wrapper',\n\t) ) );\n\n\treturn sprintf(\n\t\t'&lt;div %s&gt;%s&lt;\/div&gt;',\n\t\t$wrapper_attributes,\n\t\tdo_shortcode( $shortcode_string )\n\t);\n}\n\n\/**\n * Register the block type on the server\n *\/\nadd_action( 'init', function() {\n\tregister_block_type( 'tutorial\/alert-wrapper', array(\n\t\t'api_version'     =&gt; 3,\n\t\t'title'           =&gt; 'Alert (Shortcode wrapper)',\n\t\t'icon'            =&gt; 'feedback',\n\t\t'category'        =&gt; 'widgets',\n\t\t'render_callback' =&gt; 'render_shortcode_alert_wrapper_block',\n\t\t\n\t\t'attributes'      =&gt; array(\n\t\t\t'alertType' =&gt; array(\n\t\t\t\t'type'    =&gt; 'string',\n\t\t\t\t'enum'    =&gt; array( 'info', 'warning', 'error' ),\n\t\t\t\t'default' =&gt; 'info',\n\t\t\t),\n\t\t\t'alertMessage' =&gt; array(\n\t\t\t\t'type'    =&gt; 'string',\n\t\t\t\t'default' =&gt; 'Type your alert message here...',\n\t\t\t),\n\t\t),\n\n\t\t'supports'        =&gt; array(\n\t\t\t'auto_register' =&gt; true,\n\t\t\t'spacing'       =&gt; array( 'margin' =&gt; true, 'padding' =&gt; true ),\n\t\t\t'typography'    =&gt; array( 'fontSize' =&gt; true ),\n\t\t),\n\t) );\n});<\/code><\/pre>\n<p>Le code ci-dessus est similaire \u00e0 celui de la section pr\u00e9c\u00e9dente. Ce qui change ici, c&rsquo;est la fonction de rappel de rendu.<\/p>\n<ul>\n<li><code>$shortcode_string<\/code> stocke la cha\u00eene de code court (<code>[sc_alert type=\"%s\" message=\"%s\"]<\/code>).<\/li>\n<li>La fonction renvoie le code HTML du conteneur de bloc et le code court inclus (<code class=\"language-php\">do_shortcode( $shortcode_string )<\/code>).<\/li>\n<\/ul>\n<p>\u00c0 pr\u00e9sent, ouvrez l&rsquo;outil d&rsquo;insertion de blocs et recherchez le bloc \u00ab Shortcode wrapper \u00bb parmi les widgets. Ins\u00e9rez-le dans votre contenu et configurez-le \u00e0 partir de la colonne de r\u00e9glages du bloc. Le bloc appara\u00eetra de mani\u00e8re identique dans l&rsquo;\u00e9diteur et sur l&rsquo;interface publique.<\/p>\n<figure id=\"attachment_206135\" aria-describedby=\"caption-attachment-206135\" style=\"width: 2298px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-206135 size-full\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2026\/02\/php-only-shortcode-example.png\" alt=\"Exemple de code court encapsul\u00e9 dans un bloc PHP-only\" width=\"2298\" height=\"912\"><figcaption id=\"caption-attachment-206135\" class=\"wp-caption-text\">Exemple de code court encapsul\u00e9 dans un bloc PHP-only<\/figcaption><\/figure>\n<h2>Comment le d\u00e9veloppement WordPress \u00e9volue-t-il avec les blocs uniquement en PHP ?<\/h2>\n<p>\u00c0 l&rsquo;heure actuelle, les blocs PHP purs sont en phase exp\u00e9rimentale et leurs capacit\u00e9s restent limit\u00e9es. Gutenberg offre des fonctionnalit\u00e9s plus puissantes, telles que <a href=\"https:\/\/kinqsta.com\/fr\/blog\/construire-compositions-blocs-wordpress\/\">les mod\u00e8les de blocs<\/a> et <a href=\"https:\/\/kinqsta.com\/fr\/blog\/variations-style-bloc-gutenberg\/\">les variantes de blocs<\/a>, qui fournissent toutes les fonctionnalit\u00e9s d&rsquo;\u00e9dition des blocs Gutenberg natifs et des blocs personnalis\u00e9s cr\u00e9\u00e9s en JavaScript. Il existe toutefois des cas de figure o\u00f9 les blocs PHP offrent des opportunit\u00e9s significatives.<\/p>\n<p>Tout d&rsquo;abord, les blocs uniquement en PHP devraient favoriser une adoption plus large de l&rsquo;\u00e9diteur de blocs, en particulier parmi les d\u00e9veloppeurs WordPress moins orient\u00e9s vers le d\u00e9veloppement JavaScript c\u00f4t\u00e9 serveur.<\/p>\n<p>De plus, ils constituent des conteneurs id\u00e9aux pour les fonctions personnalis\u00e9es et les shortcodes, comme le montre l\u2019exemple pr\u00e9sent\u00e9 dans cet article. Ils permettent \u00e9galement une int\u00e9gration ais\u00e9e avec des services externes.<\/p>\n<p>Et nous pouvons raisonnablement nous attendre \u00e0 de futures am\u00e9liorations et ajouts de fonctionnalit\u00e9s, \u00e0 davantage de contr\u00f4les de configuration, ainsi qu\u2019\u00e0 des int\u00e9grations avec les outils Gutenberg existants.<\/p>\n<p>Une chose est s\u00fbre : gr\u00e2ce aux blocs uniquement en PHP, la cr\u00e9ation de blocs Gutenberg est devenue beaucoup plus simple.<\/p>\n<p>Si le d\u00e9veloppement WordPress est votre m\u00e9tier, Kinsta vous\u00a0fournit les <a href=\"https:\/\/kinqsta.com\/fr\/blog\/pile-technologique-agence-wordpress\/\">outils de d\u00e9veloppement dont vous avez besoin<\/a>, vous permettant de vous concentrer sur le d\u00e9veloppement WordPress, sans avoir \u00e0 vous soucier de configurations complexes ni de t\u00e2ches de maintenance fastidieuses : <a href=\"https:\/\/kinqsta.com\/fr\/blog\/developpement-wordpress-distance-ssh-kinsta\/\">SSH<\/a>, <a href=\"https:\/\/kinqsta.com\/fr\/blog\/fonctionnalites-sftp-ssh\/\">SFTP<\/a>, <a href=\"https:\/\/kinqsta.com\/fr\/blog\/configurer-pipeline-ci-cd\/\">int\u00e9gration Git<\/a>, <a href=\"https:\/\/kinqsta.com\/fr\/blog\/mises-a-jour-automatiques-kinsta\/\">mises \u00e0 jour automatiques<\/a>, <a href=\"https:\/\/kinqsta.com\/fr\/hebergement-wordpress\/staging\/\">environnement de staging en un clic<\/a>, <a href=\"https:\/\/kinqsta.com\/fr\/devkinsta\/fonctionnalites\/\">outil de d\u00e9veloppement local<\/a> int\u00e9gr\u00e9, et bien plus encore. Essayez-le par vous-m\u00eame gr\u00e2ce \u00e0 <a href=\"https:\/\/kinqsta.com\/fr\/premier-mois-gratuit\/\">votre premier mois gratuit<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pendant des ann\u00e9es, la ma\u00eetrise du d\u00e9veloppement de blocs Gutenberg exigeait une connaissance approfondie de technologies telles que React et Node.js, ainsi que des \u00e9tapes de &#8230;<\/p>\n","protected":false},"author":36,"featured_media":82920,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1028,999],"class_list":["post-82919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-developpement-wordpress","topic-fonction-php"],"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 cr\u00e9er des blocs Gutenberg uniquement en PHP<\/title>\n<meta name=\"description\" content=\"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.\" \/>\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-uniquement-php\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment construire des blocs Gutenberg uniquement en PHP\" \/>\n<meta property=\"og:description\" content=\"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\" \/>\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=\"2026-03-31T14:09:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-02T07:31:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.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=\"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks-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=\"20 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-uniquement-php\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\"},\"author\":{\"name\":\"Carlo Daniele\",\"@id\":\"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63\"},\"headline\":\"Comment construire des blocs Gutenberg uniquement en PHP\",\"datePublished\":\"2026-03-31T14:09:16+00:00\",\"dateModified\":\"2026-04-02T07:31:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\"},\"wordCount\":2741,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png\",\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\",\"url\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\",\"name\":\"Comment cr\u00e9er des blocs Gutenberg uniquement en PHP\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png\",\"datePublished\":\"2026-03-31T14:09:16+00:00\",\"dateModified\":\"2026-04-02T07:31:23+00:00\",\"description\":\"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png\",\"contentUrl\":\"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png\",\"width\":1470,\"height\":735},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#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\":\"Comment construire des blocs Gutenberg uniquement en PHP\"}]},{\"@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":"Comment cr\u00e9er des blocs Gutenberg uniquement en PHP","description":"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.","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-uniquement-php\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment construire des blocs Gutenberg uniquement en PHP","og_description":"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.","og_url":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2026-03-31T14:09:16+00:00","article_modified_time":"2026-04-02T07:31:23+00:00","og_image":[{"width":1470,"height":735,"url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png","type":"image\/png"}],"author":"Carlo Daniele","twitter_card":"summary_large_image","twitter_description":"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.","twitter_image":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks-1024x512.png","twitter_creator":"@carlodaniele","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Carlo Daniele","Dur\u00e9e de lecture estim\u00e9e":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/"},"author":{"name":"Carlo Daniele","@id":"https:\/\/kinqsta.com\/fr\/#\/schema\/person\/962dde02ea6f5df089b5d8d0853bbc63"},"headline":"Comment construire des blocs Gutenberg uniquement en PHP","datePublished":"2026-03-31T14:09:16+00:00","dateModified":"2026-04-02T07:31:23+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/"},"wordCount":2741,"publisher":{"@id":"https:\/\/kinqsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png","inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/","url":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/","name":"Comment cr\u00e9er des blocs Gutenberg uniquement en PHP","isPartOf":{"@id":"https:\/\/kinqsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png","datePublished":"2026-03-31T14:09:16+00:00","dateModified":"2026-04-02T07:31:23+00:00","description":"Oubliez JS, React et les \u00e9tapes de compilation complexes. Ma\u00eetrisez les blocs Gutenberg avec du PHP pur et d\u00e9ployez des blocs personnalis\u00e9s sur WordPress en quelques minutes.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#primaryimage","url":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png","contentUrl":"https:\/\/kinqsta.com\/fr\/wp-content\/uploads\/sites\/4\/2026\/03\/how-to-build-php-only-gutenberg-blocks.png","width":1470,"height":735},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/fr\/blog\/blocs-gutenberg-uniquement-php\/#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":"Comment construire des blocs Gutenberg uniquement en PHP"}]},{"@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\/82919","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=82919"}],"version-history":[{"count":5,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/82919\/revisions"}],"predecessor-version":[{"id":82951,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/posts\/82919\/revisions\/82951"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/it"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/jp"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/translations\/nl"},{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/82919\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media\/82920"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/media?parent=82919"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/tags?post=82919"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/fr\/wp-json\/wp\/v2\/topic?post=82919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}