{"id":234241,"date":"2023-02-19T20:45:00","date_gmt":"2023-02-19T17:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234241"},"modified":"2022-11-12T01:45:13","modified_gmt":"2022-11-11T22:45:13","slug":"comment-acceder-et-analyser-les-blocs-gutenberg-avec-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-acceder-et-analyser-les-blocs-gutenberg-avec-php\/","title":{"rendered":"Comment acc\u00e9der et analyser les blocs Gutenberg avec PHP"},"content":{"rendered":"\n<p>Dans cet article, nous verrons comment analyser les blocs Gutenberg d&rsquo;un article et extraire des blocs sp\u00e9cifiques pour cr\u00e9er autre chose. Nous examinerons les fonctions PHP de WordPress pour l&rsquo;analyse, l&rsquo;extraction et le rendu des blocs choisis.<\/p>\n<p>L&rsquo;un des avantages du nouvel \u00e9diteur Gutenberg dans WordPress est des donn\u00e9es plus structur\u00e9es pour le contenu des publications. Autrefois, tout \u00e9tait stock\u00e9 au format HTML et il n&rsquo;y avait aucun moyen d&rsquo;extraire des \u00e9l\u00e9ments de contenu sp\u00e9cifiques sans quelques expressions r\u00e9guli\u00e8res tr\u00e8s complexes. Mais avec Gutenberg, chaque \u00e9l\u00e9ment de contenu, qu&rsquo;il s&rsquo;agisse d&rsquo;un paragraphe, d&rsquo;un titre, d&rsquo;une image, d&rsquo;une vid\u00e9o, d&rsquo;un bouton ou d&rsquo;une colonne contenant d&rsquo;autres blocs, est stock\u00e9 avec des informations qui nous indiquent ce qu&rsquo;est cet \u00e9l\u00e9ment de contenu.<\/p>\n<p>Avec les fonctions WordPress int\u00e9gr\u00e9es, il est tr\u00e8s facile de r\u00e9cup\u00e9rer tous les blocs du contenu d&rsquo;un article dans un tableau avec toutes leurs informations. Cela ouvre de nombreuses fonctionnalit\u00e9s utiles pour les d\u00e9veloppeurs de th\u00e8mes. Juste pour mentionner quelques id\u00e9es :<\/p>\n<ul>\n<li>G\u00e9n\u00e9rez dynamiquement une table des mati\u00e8res en allant chercher toutes les rubriques (tutoriel ci-dessous).<\/li>\n<li>R\u00e9cup\u00e9rez toutes les vid\u00e9os, images ou citations utilis\u00e9es dans tous les messages pour les rassembler et les r\u00e9pertorier toutes sur une autre page.<\/li>\n<li>Extrayez le premier paragraphe d&rsquo;un message et utilisez-le comme extrait dans les archives (tutoriel ci-dessous).<\/li>\n<li>Obtenez un aper\u00e7u de l&rsquo;utilisation de blocs sp\u00e9cifiques et de leur position. Par exemple, supposons que vous ayez un bloc d&rsquo;annonces personnalis\u00e9 et que vous ayez besoin de savoir \u00e0 quelle fr\u00e9quence il est utilis\u00e9 dans vos publications et \u00e0 quelle distance du contenu ils apparaissent.<\/li>\n<li>Affichez les blocs d&rsquo;une publication, mais excluez des types de blocs sp\u00e9cifiques.<\/li>\n<li>V\u00e9rifiez si le contenu d&rsquo;un article commence par une vid\u00e9o et utilisez cette vid\u00e9o au lieu de l&rsquo;image en vedette dans les archives.<\/li>\n<li>Si vous utilisez un bloc personnalis\u00e9 qui contient des sp\u00e9cifications techniques sur les produits, vous pouvez facilement cr\u00e9er une page qui affiche et compare les sp\u00e9cifications techniques entre les publications de produits.<\/li>\n<li>Rassemblez dynamiquement toutes les images uniques utilis\u00e9es dans un article et g\u00e9n\u00e9rez-en une galerie \u00e0 la fin ou ailleurs.<\/li>\n<\/ul>\n<p>Allons droit au but\u00a0!<\/p>\n<h2>Analyser les blocs d&rsquo;un article<\/h2>\n<p>Pour analyser les blocs, nous utilisons la fonction WordPress <code>[parse_blocks](https:\/\/developer.wordpress.org\/reference\/functions\/parse_blocks\/)()<\/code>. En tant que param\u00e8tre, vous devez fournir une cha\u00eene du contenu d&rsquo;un article. Si vous \u00eates dans une boucle ou avez acc\u00e8s \u00e0 un objet de publication, fournissez simplement <code>$post-&gt;post_content<\/code>comme param\u00e8tre \u00e0 la fonction.<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\n$blocks = parse_blocks($post-&gt;post_content);<\/code><\/pre>\n<p>Le retour de <code>parse_blocks()<\/code>est un tableau o\u00f9 chaque \u00e9l\u00e9ment du tableau est un bloc. Pour chaque \u00e9l\u00e9ment de bloc, vous disposez d&rsquo;informations telles que le type de bloc (cl\u00e9 &lsquo; <code>blockName<\/code>&lsquo;), les attributs de bloc (cl\u00e9 &lsquo; <code>attrs<\/code>&lsquo;), les blocs internes pour les blocs imbriqu\u00e9s tels que les colonnes (cl\u00e9 &lsquo; <code>innerBlocks<\/code>&lsquo;) et deux \u00e9l\u00e9ments pour le contenu r\u00e9el du bloc (cl\u00e9s &lsquo; <code>innerHTML<\/code>&lsquo; et &lsquo; <code>innerContent<\/code>&lsquo;). L&rsquo;\u00e9l\u00e9ment <code>innerHTML<\/code>est une cha\u00eene de contenu HTML, alors qu&rsquo;il <code>innerContent<\/code>s&rsquo;agit d&rsquo;un tableau de cha\u00eenes HTML.<\/p>\n<p>Et c&rsquo;est tout! Faites une boucle dans le tableau renvoy\u00e9 \u00e0 partir de <code>parse_blocks()<\/code>pour faire votre travail. Nous examinerons plus d&rsquo;exemples de code plus loin dans cet article.<\/p>\n<h2>Une note sur les messages classiques (non Gutenberg)<\/h2>\n<p>Vous travaillez peut-\u00eatre sur un site WordPress plus ancien qui a cr\u00e9\u00e9 des publications avant la mise \u00e0 niveau vers Gutenberg (ou utilis\u00e9 un plugin D\u00e9sactiver Gutenberg). Dans ce cas, ces publications n&rsquo;auront pas de contenu de publication structur\u00e9, mais l&rsquo;int\u00e9gralit\u00e9 du contenu de la publication se trouvera dans un bloc &quot;\u00c9diteur classique&quot;.<\/p>\n<p>Le tableau renvoy\u00e9 par la fonction <code>parse_blocks()<\/code>renverra sur ce type de messages un \u00e9l\u00e9ment de tableau de bloc avec <code>blockName<\/code>la valeur <code>null<\/code>. Le contenu HTML complet de la publication se trouve dans la <code>innerHTML<\/code>cha\u00eene de cet \u00e9l\u00e9ment.<\/p>\n<p>Nous pouvons supposer en toute s\u00e9curit\u00e9 que si le retour d&rsquo;un article sur <code>parse_blocks()<\/code>a un \u00e9l\u00e9ment et que <code>blockName<\/code>c&rsquo;est <code>null<\/code>, nous avons affaire \u00e0 un article &quot;pr\u00e9-Gutenberg&quot;. Sinon <code>blockName<\/code>, sera toujours peupl\u00e9. C&rsquo;est une bonne v\u00e9rification \u00e0 garder \u00e0 l&rsquo;esprit lorsque vous \u00e9crivez du code pour analyser les blocs de publications et que vous souhaitez g\u00e9rer du contenu WordPress plus ancien.<\/p>\n<h2>Rendre un bloc<\/h2>\n<p>WordPress propose \u00e9galement une fonction pour rendre un bloc sp\u00e9cifique avec <code>[render_block](https:\/\/developer.wordpress.org\/reference\/functions\/render_block\/)()<\/code>. En tant que param\u00e8tre, vous devez fournir un tableau pour un bloc, tout comme l&rsquo;un de ceux renvoy\u00e9s <code>parse_blocks()<\/code>ci-dessus. La fonction renvoie une cha\u00eene de code HTML rendu que vous pouvez simplement r\u00e9percuter directement.<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\n$blocks = parse_blocks($post-&gt;post_content);\nforeach ($blocks as $block) {\n    echo render_block($block);\n}<\/code><\/pre>\n<p>Le code ci-dessus rendra tous les blocs de la publication, comme il le ferait normalement lors du rendu du contenu de la publication. La partie amusante survient lorsque nous commen\u00e7ons \u00e0 ajouter du code pour exclure ou inclure des blocs sp\u00e9cifiques qui nous int\u00e9ressent.<\/p>\n<p>Par exemple, le code ci-dessous n&rsquo;imprimera que les blocs de paragraphes de l&rsquo;article\u00a0:<\/p>\n<pre><code>foreach ($blocks as $block) {\n    if ($block['blockName'] == 'core\/paragraph') {\n        echo render_block($block);\n    }\n}<\/code><\/pre>\n<p>Et cela rendra tous les blocs, mais exclura tous les blocs de shortcode\u00a0:<\/p>\n<pre><code>foreach ($blocks as $block) {\n    if ($block['blockName'] != 'core\/shortcode') {\n        echo render_block($block);\n    }\n}<\/code><\/pre>\n<h2>Bloquer les noms<\/h2>\n<p>Lors de l&rsquo;analyse des blocs d&rsquo;un article, vous devrez probablement v\u00e9rifier le type de bloc. Ils sont assez simples \u00e0 deviner. Par exemple, un bloc Paragraphe est, vous l&rsquo;aurez devin\u00e9, <code>paragraph<\/code>. Cependant, gardez \u00e0 l&rsquo;esprit que tous les blocs Gutenberg dans WordPress sont pr\u00e9c\u00e9d\u00e9s d&rsquo;un espace de noms. Pour les blocs de base WordPress (par d\u00e9faut), ils sont tous pr\u00e9fix\u00e9s par &quot; <code>core\/<\/code>&quot;. L&rsquo;exception sont les blocs Embed qui sont pr\u00e9fix\u00e9s par &quot; <code>core-embed\/<\/code>&quot;. Ainsi, par exemple, un bloc de paragraphe aura le nom du bloc <code>core\/paragraph<\/code>.<\/p>\n<p>Pour \u00e9viter les devinettes, voici un aper\u00e7u des blocs par d\u00e9faut fournis par WordPress (au moment d&rsquo;\u00e9crire ceci) :<\/p>\n<h3>Blocs communs<\/h3>\n<ul>\n<li>Paragraphe:<code>core\/paragraph<\/code><\/li>\n<li>Image:<code>core\/image<\/code><\/li>\n<li>Titre:<code>core\/heading<\/code><\/li>\n<li>Galerie:<code>core\/gallery<\/code><\/li>\n<li>Liste:<code>core\/list<\/code><\/li>\n<li>Devis:<code>core\/quote<\/code><\/li>\n<li>L&rsquo;audio:<code>core\/audio<\/code><\/li>\n<li>Couverture:<code>core\/cover<\/code><\/li>\n<li>Dossier:<code>core\/file<\/code><\/li>\n<li>Vid\u00e9o:<code>core\/video<\/code><\/li>\n<\/ul>\n<h3>Mise en page<\/h3>\n<ul>\n<li>Pr\u00e9format\u00e9\u00a0:<code>core\/preformatted<\/code><\/li>\n<li>Code:<code>core\/code<\/code><\/li>\n<li>Classique\u00a0: <code>core\/freeform<\/code><br \/>\n(mais pour les messages non Gutenberg, ce sera <code>null<\/code>, voir la note sur les messages non Gutenberg)<\/li>\n<li>HTML personnalis\u00e9\u00a0:<code>core\/html<\/code><\/li>\n<li>Pullquote\u00a0:<code>core\/pullquote<\/code><\/li>\n<li>Table:<code>core\/table<\/code><\/li>\n<li>Verset:<code>core\/verse<\/code><\/li>\n<\/ul>\n<h3>Disposition<\/h3>\n<ul>\n<li>Bouton:<code>core\/button<\/code><\/li>\n<li>Colonnes:<code>core\/columns<\/code><\/li>\n<li>Suite:<code>core\/more<\/code><\/li>\n<li>Saut de page:<code>core\/nextpage<\/code><\/li>\n<li>S\u00e9parateur:<code>core\/separator<\/code><\/li>\n<li>Entretoise\u00a0:<code>core\/spacer<\/code><\/li>\n<li>M\u00e9dias et texte\u00a0:<code>core\/media-text<\/code><\/li>\n<\/ul>\n<h3>Widget<\/h3>\n<ul>\n<li>Petit code:<code>core\/shortcode<\/code><\/li>\n<li>Les archives:<code>core\/archives<\/code><\/li>\n<li>Cat\u00e9gories\u00a0:<code>core\/categories<\/code><\/li>\n<li>Derniers Commentaires:<code>core\/latest-omments<\/code><\/li>\n<li>Derniers articles\u00a0:<code>core\/latest-posts<\/code><\/li>\n<\/ul>\n<h3>Int\u00e8gre<\/h3>\n<ul>\n<li>\n<p>Int\u00e9grer\u00a0:<code>core\/embed<\/code><\/p>\n<\/li>\n<li>\n<p>Twitter:<code>core-embed\/twitter<\/code><\/p>\n<\/li>\n<li>\n<p>Youtube:<code>core-embed\/youtube<\/code><\/p>\n<\/li>\n<li>\n<p>Facebook:<code>core-embed\/facebook<\/code><\/p>\n<\/li>\n<li>\n<p>Instagram :<code>core-embed\/instagram<\/code><\/p>\n<\/li>\n<li>\n<p>WordPress :<code>core-embed\/wordpress<\/code><\/p>\n<\/li>\n<li>\n<p>Sound Cloud\u00a0:<code>core-embed\/soundcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Spotify\u00a0:<code>core-embed\/spotify<\/code><\/p>\n<\/li>\n<li>\n<p>Flickr\u00a0:<code>core-embed\/flickr<\/code><\/p>\n<\/li>\n<li>\n<p>Vim\u00e9o\u00a0:<code>core-embed\/vimeo<\/code><\/p>\n<\/li>\n<li>\n<p>Animoto :<code>core-embed\/animoto<\/code><\/p>\n<\/li>\n<li>\n<p>Nuage vers le haut\u00a0:<code>core-embed\/cloudup<\/code><\/p>\n<\/li>\n<li>\n<p>Signal de foule\u00a0:<code>core-embed\/crowdsignal<\/code><\/p>\n<\/li>\n<li>\n<p>Daily motion :<code>core-embed\/dailymotion<\/code><\/p>\n<\/li>\n<li>\n<p>Hulu :<code>core-embed\/hulu<\/code><\/p>\n<\/li>\n<li>\n<p>Imgur\u00a0:<code>core-embed\/imgur<\/code><\/p>\n<\/li>\n<li>\n<p>Publier:<code>core-embed\/issuu<\/code><\/p>\n<\/li>\n<li>\n<p>Lanceur\u00a0:<code>core-embed\/kickstarter<\/code><\/p>\n<\/li>\n<li>\n<p>Meetup.com\u00a0:<code>core-embed\/meetup-com<\/code><\/p>\n<\/li>\n<li>\n<p>Mix cloud\u00a0:<code>core-embed\/mixcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Reddit\u00a0:<code>core-embed\/reddit<\/code><\/p>\n<\/li>\n<li>\n<p>ReverbNation :<code>core-embed\/reverbnation<\/code><\/p>\n<\/li>\n<li>\n<p>Capture d&rsquo;\u00e9cran\u00a0:<code>core-embed\/screencast<\/code><\/p>\n<\/li>\n<li>\n<p>Script :<code>core-embed\/scribd<\/code><\/p>\n<\/li>\n<li>\n<p>Slideshare\u00a0:<code>core-embed\/slideshare<\/code><\/p>\n<\/li>\n<li>\n<p>SmugMug\u00a0:<code>core-embed\/smugmug<\/code><\/p>\n<\/li>\n<li>\n<p>Plate-forme de haut-parleur\u00a0:<code>core-embed\/speaker<\/code><\/p>\n<\/li>\n<li>\n<p>TED\u00a0:<code>core-embed\/ted<\/code><\/p>\n<\/li>\n<li>\n<p>Tumblr\u00a0:<code>core-embed\/tumblr<\/code><\/p>\n<\/li>\n<li>\n<p>Vid\u00e9oPress\u00a0:<code>core-embed\/videopress<\/code><\/p>\n<\/li>\n<li>\n<p>wordpress.tv\u00a0:<code>core-embed\/wordpress-tv<\/code><\/p>\n<\/li>\n<li>\n<p>Kindle d&rsquo;Amazon:<code>core-embed\/amazon-kindle<\/code><\/p>\n<\/li>\n<\/ul>\n<h2>Exemple de code\u00a0: R\u00e9cup\u00e9rer le premier paragraphe d&rsquo;un message sous forme d&rsquo;extrait<\/h2>\n<p>Un article bien r\u00e9dig\u00e9 devrait commencer par un paragraphe qui pr\u00e9sente le sujet de l&rsquo;article et inciter les gens \u00e0 continuer \u00e0 lire. Ceux-ci sont parfaits pour \u00eatre utilis\u00e9s comme extraits au lieu de compter sur la fonction d&rsquo;extrait automatique de WordPress !<\/p>\n<p>Il s&rsquo;agit d&rsquo;une fonction que vous pouvez ajouter \u00e0 votre th\u00e8me et <code>functions.php<\/code>qui renverra le premier paragraphe d&rsquo;un article. Si aucun article n&rsquo;a \u00e9t\u00e9 fourni, il fera r\u00e9f\u00e9rence \u00e0 l&rsquo;objet de publication global. Il accepte \u00e9galement les messages non Gutenberg en renvoyant l&rsquo;extrait WordPress r\u00e9el pour ceux-ci.<\/p>\n<pre><code>function awp_get_excerpt($post=false) {\n    if (!$post) { \n        global $post;\n    }\n    if (!$post) { return ''; }\n    $excerpt = '';\n    $blocks = parse_blocks($post-&gt;post_content);\n    if (count($blocks) == 1 &amp;&amp; $blocks[0]['blockName'] == null) {  \/\/ Non-Gutenberg posts\n        $excerpt = get_the_excerpt($post-&gt;ID);\n    } else {\n        foreach ($blocks as $block) {\n            if ($block['blockName'] == 'core\/paragraph') {\n                $excerpt = strip_tags($block['innerHTML']);\n                break;\n            }\n        }\n    }\n    return \"&lt;div class='excerpt'&gt;$excerpt&lt;\/div&gt;\";\n}<\/code><\/pre>\n<p>Apr\u00e8s l&rsquo; <code>parse_blocks()<\/code>appel de la fonction, nous v\u00e9rifions si la publication contient ou non des donn\u00e9es de bloc invalides (la publication a \u00e9t\u00e9 cr\u00e9\u00e9e avant Gutenberg) et renvoyons un extrait de publication si tel est le cas. Sinon, nous parcourons les blocs de l&rsquo;article, trouvons le premier bloc de paragraphe et renvoyons son <code>innerHTML<\/code>. \u00c0 la toute fin, nous renvoyons une cha\u00eene avec (ceci est facultatif) un <code>&lt;div&gt;<\/code>autour.<\/p>\n<p>Pour utiliser cette fonction, il suffit d&rsquo;appeler :<\/p>\n<pre><code>echo awp_get_excerpt();<\/code><\/pre>\n<p>En supposant que l&rsquo;appel de fonction est plac\u00e9 quelque part, il y a un objet global <code>$post<\/code>, par exemple \u00e0 l&rsquo;int\u00e9rieur d&rsquo;une boucle. Si vous souhaitez sp\u00e9cifier un post, fournissez l&rsquo;objet post comme param\u00e8tre \u00e0 l&rsquo;appel de fonction\u00a0:<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_get_excerpt($post);<\/code><\/pre>\n<h2>Exemple\u00a0: Cr\u00e9er une table des mati\u00e8res \u00e0 partir des titres d&rsquo;un article<\/h2>\n<p>Vous pouvez g\u00e9n\u00e9rer automatiquement et dynamiquement une table des mati\u00e8res bas\u00e9e sur les blocs d&rsquo;en-t\u00eate d&rsquo;un article. Le processus est assez simple; analyser les blocs de la publication et trouver tous les blocs de type <code>core\/heading<\/code>. Mais nous pouvons aller plus loin et incorporer des niveaux ; par exemple mettre <code>h3<\/code>comme sous-titre sous <code>h2<\/code>et ainsi de suite.<\/p>\n<p>Un bloc d&rsquo;en-t\u00eate contient des informations sur son niveau dans l&rsquo;\u00e9l\u00e9ment de tableau d&rsquo;attributs (cl\u00e9 &lsquo; <code>attrs<\/code>&lsquo;). \u00c0 l&rsquo;int\u00e9rieur du <code>attrs<\/code>tableau, ce serait un \u00e9l\u00e9ment de tableau avec la cl\u00e9 &lsquo; <code>level<\/code>&lsquo; et un entier signifiant le niveau. A <code>h3<\/code>aurait &lsquo; <code>level<\/code>&lsquo; la valeur de <code>3<\/code>, a <code>h4<\/code>aurait &lsquo; <code>level<\/code>&lsquo; de <code>4<\/code>, et ainsi de suite.<\/p>\n<p>Cependant, notez que <code>attrs<\/code>pour les en-t\u00eates, les blocs peuvent \u00eatre vides! Cela se produit lorsque l&rsquo;auteur n&rsquo;a pas modifi\u00e9 le type de titre par rapport aux valeurs par d\u00e9faut dans les param\u00e8tres du bloc. Pour contourner cela, nous devons faire quelques hypoth\u00e8ses. Comme les en-t\u00eates par d\u00e9faut seront <code>h2<\/code>(sauf si vous avez chang\u00e9 cela dans votre th\u00e8me). Nous pouvons donc supposer que si un bloc d&rsquo;en-t\u00eate n&rsquo;a pas d&rsquo;attribut de niveau, c&rsquo;est un <code>h2<\/code>. Sinon, nous obtenons les informations de niveau \u00e0 partir des attributs.<\/p>\n<p>Si vous \u00eates vraiment pr\u00eat \u00e0 relever le d\u00e9fi, je vous invite \u00e0 am\u00e9liorer le code ci-dessous. Le probl\u00e8me de la g\u00e9n\u00e9ration d&rsquo;une liste structur\u00e9e appropri\u00e9e <code>ol<\/code>est que nous ne pouvons pas contr\u00f4ler la fa\u00e7on dont l&rsquo;auteur structure ses titres. Ils pourraient tr\u00e8s bien devenir fous et commencer par un <code>h4<\/code>titre et passer directement \u00e0 un <code>h2<\/code>titre juste apr\u00e8s. Et du coup ils m\u00e9langent un <code>h1<\/code>au milieu. Ma solution consiste donc \u00e0 g\u00e9n\u00e9rer une liste plate <code>ol<\/code>et \u00e0 fournir les informations de niveau dans les classes de l&rsquo;\u00e9l\u00e9ment de liste. Ensuite, avec un CSS intelligent, vous pouvez indenter les \u00e9l\u00e9ments de la liste en cons\u00e9quence avec un rembourrage \u00e0 gauche.<\/p>\n<h3>Le code<\/h3>\n<p>Voici la fonction table des mati\u00e8res :<\/p>\n<pre><code>function awp_table_of_contents($post=false) {\n    if (!$post) {\n        global $post;\n    }\n    if (!$post) { return ''; }\n    $headings = [];\n    $blocks = parse_blocks($post-&gt;post_content);\n    if (count($blocks) == 1 &amp;&amp; $blocks[0]['blockName'] == null) {  \/\/ Non-Gutenberg posts\n        return '';\n    } else {\n        foreach ($blocks as $block) {\n            if ($block['blockName'] == 'core\/heading') {\n                $level = (isset($block['attrs']['level']))? $block['attrs']['level']: 2;  \/\/ h2 as default\n                $headings[] = ['title' =&gt; wp_strip_all_tags($block['innerHTML']), 'level' =&gt; $level];\n            }\n        }\n    }\n\u00a0\n    if (empty($headings)) {  \/\/ No headings found in post\n        return '';\n    }\n\u00a0\n    $toc = '&lt;ol class=\"table-of-contents\"&gt;';\n    foreach ($headings as $heading) {\n        $toc .= '&lt;li class=\"heading-level-'. $heading['level']. '\"&gt;'. $heading['title']. '&lt;\/li&gt;';\n    }\n    $toc .= '&lt;\/ol&gt;';\n    return $toc;\n}<\/code><\/pre>\n<p>La fonction commence par g\u00e9rer la publication et analyser ses blocs. En ligne, <code>#9<\/code>nous accueillons les messages non Gutenberg. La fonction continue de parcourir tous les blocs et chaque fois qu&rsquo;elle trouve un bloc d&rsquo;en-t\u00eate, elle est ajout\u00e9e \u00e0 notre <code>$headings<\/code>tableau. Nous utilisons <code>[wp_strip_all_tags](https:\/\/developer.wordpress.org\/reference\/functions\/wp_strip_all_tags\/)()<\/code>pour supprimer les balises HTML des titres. Nous ajoutons \u00e9galement les informations de niveau \u00e0 notre tableau, o\u00f9 la valeur par d\u00e9faut est d\u00e9finie sur <code>2<\/code>si les attributs sont vides.<\/p>\n<p>Apr\u00e8s la boucle de bloc, le <code>$headings<\/code>tableau doit contenir tous les titres du message, dans l&rsquo;ordre. Nous pouvons alors simplement g\u00e9n\u00e9rer une cha\u00eene HTML et afficher son contenu. Comme mentionn\u00e9, je g\u00e9n\u00e8re un nom de classe sur chaque \u00e9l\u00e9ment avec des informations sur le niveau du titre afin que nous puissions cr\u00e9er l&rsquo;illusion d&rsquo;une liste structur\u00e9e avec CSS.<\/p>\n<p>Comme avec la fonction d&rsquo;extrait ci-dessus, nous pouvons appeler cette fonction lorsque nous sommes \u00e0 l&rsquo;int\u00e9rieur de la boucle comme ceci\u00a0:<\/p>\n<pre><code>echo awp_table_of_contents();<\/code><\/pre>\n<p>Ou si nous sommes en dehors de la boucle ou si nous voulons sp\u00e9cifier un message\u00a0;<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_table_of_contents($post);<\/code><\/pre>\n<p>Cela g\u00e9n\u00e9rera une liste ressemblant \u00e0 ceci\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152586-61e4e13930788.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152586-61e4e13930788.png\" alt=\"Comment acc\u00e9der et analyser les blocs Gutenberg avec PHP\" ><\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>Comme nous l&rsquo;avons vu avec le contenu de publication riche et structur\u00e9 rendu possible avec Gutenberg, nous pouvons tr\u00e8s facilement trouver et extraire des parties sp\u00e9cifiques du contenu des publications. Reportez-vous \u00e0 la liste d&rsquo;exemples que j&rsquo;ai mentionn\u00e9s au d\u00e9but de l&rsquo;article. Il n&rsquo;y a pas de limites \u00e0 ce que vous pouvez faire en tant que d\u00e9veloppeur de th\u00e8me. Cela d\u00e9pend simplement de ce dont votre th\u00e8me ou votre site WordPress a besoin (ou de ce qui serait tout simplement cool).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un aper\u00e7u d\u00e9taill\u00e9 de la fa\u00e7on d&rsquo;analyser les blocs d&rsquo;un article \u00e0 l&rsquo;aide des fonctions PHP de WordPress pour l&rsquo;analyse, le filtrage et le rendu de blocs sp\u00e9cifiques.<\/p>\n","protected":false},"author":1,"featured_media":152587,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,893,717,717,936,936,1110,811,811,841,841,862,862],"tags":[1167],"class_list":["post-234241","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-gutenberg-3","category-n-a","category-plugins-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234241"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234241\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/152587"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}