{"id":233636,"date":"2023-02-19T20:08:00","date_gmt":"2023-02-19T17:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233636"},"modified":"2022-11-11T00:46:25","modified_gmt":"2022-11-10T21:46:25","slug":"como-acceder-y-analizar-bloques-de-gutenberg-con-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-acceder-y-analizar-bloques-de-gutenberg-con-php\/","title":{"rendered":"C\u00f3mo acceder y analizar bloques de Gutenberg con PHP"},"content":{"rendered":"\n<p>En esta publicaci\u00f3n, veremos c\u00f3mo analizar los bloques de Gutenberg de una publicaci\u00f3n y extraer bloques espec\u00edficos para hacer otra cosa. Veremos las funciones PHP de WordPress para analizar, extraer y representar los bloques elegidos.<\/p>\n<p>Uno de los beneficios del nuevo editor de Gutenberg en WordPress son los datos m\u00e1s estructurados para el contenido de las publicaciones. En los d\u00edas anteriores, todo se almacenaba como HTML y no hab\u00eda forma de extraer partes espec\u00edficas de contenido sin algunas expresiones regulares muy complejas. Pero con Gutenberg, cada pieza de contenido, ya sea un p\u00e1rrafo, un encabezado, una imagen, un video, un bot\u00f3n o una columna que tenga otros bloques dentro, se almacena con informaci\u00f3n que nos dice qu\u00e9 es esa pieza de contenido.<\/p>\n<p>Con las funciones integradas de WordPress, es muy f\u00e1cil obtener todos los bloques en el contenido de una publicaci\u00f3n en una matriz con toda su informaci\u00f3n. Esto abre un mont\u00f3n de funciones \u00fatiles para los desarrolladores de temas. Solo por mencionar algunas ideas:<\/p>\n<ul>\n<li>Genere din\u00e1micamente una tabla de contenido recuperando todos los encabezados (tutorial a continuaci\u00f3n).<\/li>\n<li>Obtenga todos los videos, im\u00e1genes o citas utilizadas en todas las publicaciones para recopilarlas y enumerarlas en otra p\u00e1gina.<\/li>\n<li>Extraiga el primer p\u00e1rrafo de una publicaci\u00f3n y util\u00edcelo como extracto en los archivos (tutorial a continuaci\u00f3n).<\/li>\n<li>Obtenga una descripci\u00f3n general del uso de bloques espec\u00edficos y su posici\u00f3n. Por ejemplo, digamos que tiene un bloque de anuncios personalizado y necesita saber con qu\u00e9 frecuencia se usa en sus publicaciones y qu\u00e9 tan abajo en el contenido aparecen.<\/li>\n<li>Renderice los bloques de una publicaci\u00f3n pero excluya tipos de bloques espec\u00edficos.<\/li>\n<li>Compruebe si el contenido de una publicaci\u00f3n comienza con un video y use ese video en lugar de la imagen destacada en los archivos.<\/li>\n<li>Si usa un bloque personalizado que contiene especificaciones t\u00e9cnicas de los productos, puede crear f\u00e1cilmente una p\u00e1gina que muestre y compare las especificaciones t\u00e9cnicas en las publicaciones de productos.<\/li>\n<li>Re\u00fana din\u00e1micamente todas las im\u00e1genes individuales utilizadas en una publicaci\u00f3n y genere una galer\u00eda de ellas al final o en otro lugar.<\/li>\n<\/ul>\n<p>\u00a1Vamos a saltar directamente a eso!<\/p>\n<h2>Analizar los bloques de una publicaci\u00f3n<\/h2>\n<p>Para analizar bloques usamos la funci\u00f3n de WordPress <code>[parse_blocks](https:\/\/developer.wordpress.org\/reference\/functions\/parse_blocks\/)()<\/code>. Como par\u00e1metro, debe proporcionar una cadena del contenido de una publicaci\u00f3n. Si est\u00e1 dentro de un bucle o tiene acceso a un objeto de publicaci\u00f3n, simplemente proporcione un <code>$post-&gt;post_content<\/code>par\u00e1metro a la funci\u00f3n.<\/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>El retorno de <code>parse_blocks()<\/code>es una matriz donde cada elemento de la matriz es un bloque. Para cada elemento de bloque, tiene informaci\u00f3n como el tipo de bloque (clave &#8216; <code>blockName<\/code>&#8216;), atributos de bloque (clave &#8216; <code>attrs<\/code>&#8216;), bloques internos para bloques anidados como Columnas (clave &#8216; <code>innerBlocks<\/code>&#8216;), y dos elementos para el contenido real del bloque (claves &#8216; <code>innerHTML<\/code>&#8216; y &#8216; <code>innerContent<\/code>&#8216;). El elemento <code>innerHTML<\/code>es una cadena de contenido HTML, mientras que <code>innerContent<\/code>es una matriz de cadenas HTML.<\/p>\n<p>\u00a1Y eso es todo! Recorra la matriz devuelta <code>parse_blocks()<\/code>para hacer lo suyo. Veremos m\u00e1s ejemplos de c\u00f3digo de esto m\u00e1s adelante en esta publicaci\u00f3n.<\/p>\n<h2>Una nota sobre publicaciones cl\u00e1sicas (no Gutenberg)<\/h2>\n<p>Es posible que est\u00e9 trabajando en un sitio de WordPress m\u00e1s antiguo que ha creado publicaciones antes de actualizar a Gutenberg (o que us\u00f3 un complemento de Deshabilitar Gutenberg). En este caso, estas publicaciones no tendr\u00e1n contenido de publicaci\u00f3n estructurado, sino que todo el contenido de la publicaci\u00f3n estar\u00e1 dentro de un bloque de &quot;Editor cl\u00e1sico&quot;.<\/p>\n<p>La matriz devuelta por la funci\u00f3n <code>parse_blocks()<\/code>en este tipo de publicaciones devolver\u00e1 un elemento de matriz de bloques con <code>blockName<\/code>el valor <code>null<\/code>. El contenido HTML completo de la publicaci\u00f3n est\u00e1 dentro de la <code>innerHTML<\/code>cadena de este elemento.<\/p>\n<p>Podemos asumir con seguridad que si el retorno de una publicaci\u00f3n <code>parse_blocks()<\/code>tiene un elemento y <code>blockName<\/code>es <code>null<\/code>, estamos tratando con una publicaci\u00f3n &quot;anterior a Gutenberg&quot;. De lo contrario <code>blockName<\/code>, siempre se completar\u00e1. Esta es una buena verificaci\u00f3n para tener en cuenta al escribir c\u00f3digo para analizar bloques de publicaciones y desea manejar contenido antiguo de WordPress.<\/p>\n<h2>Renderizar un bloque<\/h2>\n<p>WordPress tambi\u00e9n ofrece una funci\u00f3n para renderizar un bloque espec\u00edfico con <code>[render_block](https:\/\/developer.wordpress.org\/reference\/functions\/render_block\/)()<\/code>. Como par\u00e1metro, debe proporcionar una matriz para un bloque, como una de las devueltas <code>parse_blocks()<\/code>anteriormente. La funci\u00f3n devuelve una cadena de HTML renderizado que simplemente puede repetir directamente.<\/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>El c\u00f3digo anterior representar\u00e1 todos los bloques de la publicaci\u00f3n, como lo har\u00eda normalmente al representar el contenido de la publicaci\u00f3n. La parte divertida viene cuando comenzamos a agregar c\u00f3digo para excluir o incluir bloques espec\u00edficos que nos interesan.<\/p>\n<p>Por ejemplo, el siguiente c\u00f3digo solo imprimir\u00e1 los bloques de p\u00e1rrafo de la publicaci\u00f3n:<\/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>Y esto generar\u00e1 todos los bloques, pero excluir\u00e1 todos los bloques de shortcode:<\/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>Nombres de bloques<\/h2>\n<p>Al analizar los bloques de una publicaci\u00f3n, lo m\u00e1s probable es que necesite verificar el tipo de bloque. Son bastante simples de adivinar. Por ejemplo, un bloque de p\u00e1rrafo es, bueno, lo adivinaste, <code>paragraph<\/code>. Sin embargo, tenga en cuenta que todos los bloques de Gutenberg en WordPress tienen un prefijo de espacio de nombres. Para los bloques principales de WordPress (predeterminados), todos tienen el prefijo &quot; <code>core\/<\/code>&quot;. La excepci\u00f3n son los bloques Embed que tienen el prefijo &quot; <code>core-embed\/<\/code>&quot;. Entonces, por ejemplo, un bloque de p\u00e1rrafo tendr\u00e1 el nombre de bloque <code>core\/paragraph<\/code>.<\/p>\n<p>Para evitar adivinanzas, aqu\u00ed hay una descripci\u00f3n general de los bloques predeterminados proporcionados por WordPress (al momento de escribir esto):<\/p>\n<h3>Bloques comunes<\/h3>\n<ul>\n<li>P\u00e1rrafo:<code>core\/paragraph<\/code><\/li>\n<li>Imagen:<code>core\/image<\/code><\/li>\n<li>B\u00f3veda:<code>core\/heading<\/code><\/li>\n<li>Galer\u00eda:<code>core\/gallery<\/code><\/li>\n<li>Lista:<code>core\/list<\/code><\/li>\n<li>Cotizar:<code>core\/quote<\/code><\/li>\n<li>Audio:<code>core\/audio<\/code><\/li>\n<li>Cubrir:<code>core\/cover<\/code><\/li>\n<li>Expediente:<code>core\/file<\/code><\/li>\n<li>Video:<code>core\/video<\/code><\/li>\n<\/ul>\n<h3>Formateo<\/h3>\n<ul>\n<li>Preformateado:<code>core\/preformatted<\/code><\/li>\n<li>C\u00f3digo:<code>core\/code<\/code><\/li>\n<li>Cl\u00e1sico: <code>core\/freeform<\/code><br \/>\n(pero para publicaciones que no sean de Gutenberg ser\u00e1 <code>null<\/code>, consulte la nota sobre publicaciones que no son de Gutenberg)<\/li>\n<li>HTML personalizado:<code>core\/html<\/code><\/li>\n<li>Cita:<code>core\/pullquote<\/code><\/li>\n<li>Mesa:<code>core\/table<\/code><\/li>\n<li>Verso:<code>core\/verse<\/code><\/li>\n<\/ul>\n<h3>Dise\u00f1o<\/h3>\n<ul>\n<li>Bot\u00f3n:<code>core\/button<\/code><\/li>\n<li>Columnas:<code>core\/columns<\/code><\/li>\n<li>M\u00e1s:<code>core\/more<\/code><\/li>\n<li>Salto de p\u00e1gina:<code>core\/nextpage<\/code><\/li>\n<li>Separador:<code>core\/separator<\/code><\/li>\n<li>Espaciador:<code>core\/spacer<\/code><\/li>\n<li>Medios y texto:<code>core\/media-text<\/code><\/li>\n<\/ul>\n<h3>Widgets<\/h3>\n<ul>\n<li>C\u00f3digo corto:<code>core\/shortcode<\/code><\/li>\n<li>Archivo:<code>core\/archives<\/code><\/li>\n<li>Categor\u00edas:<code>core\/categories<\/code><\/li>\n<li>\u00daltimos comentarios:<code>core\/latest-omments<\/code><\/li>\n<li>\u00daltimas publicaciones:<code>core\/latest-posts<\/code><\/li>\n<\/ul>\n<h3>incrustaciones<\/h3>\n<ul>\n<li>\n<p>Empotrar:<code>core\/embed<\/code><\/p>\n<\/li>\n<li>\n<p>Gorjeo:<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>Nube de sonido:<code>core-embed\/soundcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Spotify:<code>core-embed\/spotify<\/code><\/p>\n<\/li>\n<li>\n<p>Flickr:<code>core-embed\/flickr<\/code><\/p>\n<\/li>\n<li>\n<p>Vimeo:<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>Nube:<code>core-embed\/cloudup<\/code><\/p>\n<\/li>\n<li>\n<p>se\u00f1al de multitud:<code>core-embed\/crowdsignal<\/code><\/p>\n<\/li>\n<li>\n<p>Movimiento diario:<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:<code>core-embed\/imgur<\/code><\/p>\n<\/li>\n<li>\n<p>Tema:<code>core-embed\/issuu<\/code><\/p>\n<\/li>\n<li>\n<p>Pedal de arranque:<code>core-embed\/kickstarter<\/code><\/p>\n<\/li>\n<li>\n<p>Meetup.com:<code>core-embed\/meetup-com<\/code><\/p>\n<\/li>\n<li>\n<p>Nube mixta:<code>core-embed\/mixcloud<\/code><\/p>\n<\/li>\n<li>\n<p>Reddit:<code>core-embed\/reddit<\/code><\/p>\n<\/li>\n<li>\n<p>Naci\u00f3n de reverberaci\u00f3n:<code>core-embed\/reverbnation<\/code><\/p>\n<\/li>\n<li>\n<p>Captura de pantalla:<code>core-embed\/screencast<\/code><\/p>\n<\/li>\n<li>\n<p>Scribd:<code>core-embed\/scribd<\/code><\/p>\n<\/li>\n<li>\n<p>Compartir diapositivas:<code>core-embed\/slideshare<\/code><\/p>\n<\/li>\n<li>\n<p>PresumidoMug:<code>core-embed\/smugmug<\/code><\/p>\n<\/li>\n<li>\n<p>Plataforma de altavoces:<code>core-embed\/speaker<\/code><\/p>\n<\/li>\n<li>\n<p>TED:<code>core-embed\/ted<\/code><\/p>\n<\/li>\n<li>\n<p>Tumblr:<code>core-embed\/tumblr<\/code><\/p>\n<\/li>\n<li>\n<p>VideoPrensa:<code>core-embed\/videopress<\/code><\/p>\n<\/li>\n<li>\n<p>wordpress.tv:<code>core-embed\/wordpress-tv<\/code><\/p>\n<\/li>\n<li>\n<p>Amazon Kindle:<code>core-embed\/amazon-kindle<\/code><\/p>\n<\/li>\n<\/ul>\n<h2>Ejemplo de c\u00f3digo: Obtener el primer p\u00e1rrafo de una publicaci\u00f3n como extracto<\/h2>\n<p>Una publicaci\u00f3n bien escrita debe comenzar con un p\u00e1rrafo que presente de qu\u00e9 se trata la publicaci\u00f3n y tiente a las personas a seguir leyendo. \u00a1Estos son perfectos para usar como extractos en lugar de confiar en la funci\u00f3n de extracto autom\u00e1tico en WordPress!<\/p>\n<p>Esta es una funci\u00f3n que puede agregar a su tema y <code>functions.php<\/code>que devolver\u00e1 el primer p\u00e1rrafo de una publicaci\u00f3n. Si no se proporcion\u00f3 ninguna publicaci\u00f3n, se referir\u00e1 al objeto de publicaci\u00f3n global. Tambi\u00e9n acomoda publicaciones que no son de Gutenberg al devolver el extracto real de WordPress para ellas.<\/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>Despu\u00e9s de la <code>parse_blocks()<\/code>llamada de la funci\u00f3n, verificamos si la publicaci\u00f3n tiene o no datos de bloque no v\u00e1lidos (la publicaci\u00f3n se cre\u00f3 antes de Gutenberg) y devolvemos el extracto de la publicaci\u00f3n si ese es el caso. De lo contrario, recorremos los bloques de la publicaci\u00f3n, buscamos el bloque del primer p\u00e1rrafo y devolvemos su archivo <code>innerHTML<\/code>. Al final devolvemos una cadena con (esto es opcional) un <code>&lt;div&gt;<\/code>alrededor.<\/p>\n<p>Para usar esta funci\u00f3n, todo lo que necesita hacer es llamar:<\/p>\n<pre><code>echo awp_get_excerpt();<\/code><\/pre>\n<p>Suponiendo que la llamada a la funci\u00f3n se coloca en alg\u00fan lugar donde haya un <code>$post<\/code>objeto global, por ejemplo, dentro de un bucle. Si desea especificar una publicaci\u00f3n, proporcione el objeto de la publicaci\u00f3n como par\u00e1metro para la llamada a la funci\u00f3n:<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_get_excerpt($post);<\/code><\/pre>\n<h2>Ejemplo: crear una tabla de contenido a partir de los encabezados de una publicaci\u00f3n<\/h2>\n<p>Puede generar de forma autom\u00e1tica y din\u00e1mica una tabla de contenido basada en los bloques de encabezado de una publicaci\u00f3n. El proceso es bastante simple; analice los bloques de la publicaci\u00f3n y encuentre todos los bloques de tipo <code>core\/heading<\/code>. Pero podemos dar un paso m\u00e1s e incorporar niveles; por ejemplo, poner <code>h3<\/code>como subt\u00edtulo debajo <code>h2<\/code>y as\u00ed sucesivamente.<\/p>\n<p>Un bloque de encabezado contiene informaci\u00f3n sobre su nivel en el elemento de la matriz de atributos (clave &#8216; <code>attrs<\/code>&#8216;). Dentro de la <code>attrs<\/code>matriz ser\u00eda un elemento de la matriz con la clave &#8216; <code>level<\/code>&#8216; y un n\u00famero entero que significa el nivel. A <code>h3<\/code>tendr\u00eda &#8216; <code>level<\/code>&#8216; valor de <code>3<\/code>, a <code>h4<\/code>tendr\u00eda &#8216; <code>level<\/code>&#8216; de <code>4<\/code>, y as\u00ed sucesivamente.<\/p>\n<p>Sin embargo, tenga en cuenta que <code>attrs<\/code>los bloques de encabezado pueden estar vac\u00edos. Esto sucede cuando el autor no ha cambiado el tipo de encabezado de los valores predeterminados en la configuraci\u00f3n del bloque. Para dar la vuelta a esto tenemos que hacer algunas suposiciones. Como ser\u00e1n los encabezados predeterminados <code>h2<\/code>(a menos que haya cambiado esto en su tema). Entonces podemos asumir que si un bloque de encabezado no tiene un atributo de nivel, es un <code>h2<\/code>. De lo contrario, obtenemos la informaci\u00f3n de nivel de los atributos.<\/p>\n<p>Si realmente est\u00e1 preparado para el desaf\u00edo, lo invito a mejorar el c\u00f3digo a continuaci\u00f3n. El problema de generar una lista estructurada adecuada <code>ol<\/code>es que no podemos controlar c\u00f3mo el autor estructura sus t\u00edtulos. Es muy posible que se vuelvan locos y comiencen con un <code>h4<\/code>encabezado y salten directamente al <code>h2<\/code>encabezado que sigue. Y de repente se mezclan una <code>h1<\/code>en el medio. Por lo tanto, mi soluci\u00f3n implica generar una <code>ol<\/code>lista plana y proporcionar la informaci\u00f3n de nivel en las clases del elemento de la lista. Luego, con un poco de CSS inteligente, puede sangrar los elementos de la lista en consecuencia con un poco de relleno izquierdo.<\/p>\n<h3>El c\u00f3digo<\/h3>\n<p>Aqu\u00ed est\u00e1 la funci\u00f3n de tabla de contenido:<\/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 funci\u00f3n comienza con el manejo de la publicaci\u00f3n y el an\u00e1lisis de sus bloques. En l\u00ednea <code>#9<\/code>nos adaptamos a publicaciones que no son de Gutenberg. La funci\u00f3n contin\u00faa recorriendo todos los bloques y cada vez que encuentra un bloque de encabezado, se agrega a nuestra <code>$headings<\/code>matriz. Usamos <code>[wp_strip_all_tags](https:\/\/developer.wordpress.org\/reference\/functions\/wp_strip_all_tags\/)()<\/code>para quitar las etiquetas HTML de los t\u00edtulos. Tambi\u00e9n agregamos la informaci\u00f3n de nivel a nuestra matriz, donde el valor predeterminado es <code>2<\/code>si los atributos est\u00e1n vac\u00edos.<\/p>\n<p>Despu\u00e9s del ciclo del bloque, la <code>$headings<\/code>matriz debe contener todos los encabezados de la publicaci\u00f3n, en orden. Entonces podemos simplemente generar una cadena HTML y mostrar su contenido. Como mencion\u00e9, genero un nombre de clase en cada elemento con informaci\u00f3n sobre el nivel del encabezado para que podamos crear la ilusi\u00f3n de una lista estructurada con CSS.<\/p>\n<p>Al igual que con la funci\u00f3n de extracto anterior, podemos llamar a esta funci\u00f3n cuando estamos dentro del ciclo de la siguiente manera:<\/p>\n<pre><code>echo awp_table_of_contents();<\/code><\/pre>\n<p>O si estamos fuera del circuito o queremos concretar un post;<\/p>\n<pre><code>$post_id = 1;\n$post = get_post($post_id);\necho awp_table_of_contents($post);<\/code><\/pre>\n<p>Esto generar\u00e1 una lista con un aspecto similar a este:<\/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=\"C\u00f3mo acceder y analizar bloques de Gutenberg con PHP\" ><\/a><\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Como hemos visto con el contenido de publicaci\u00f3n enriquecido estructurado que es posible gracias a Gutenberg, podemos encontrar y extraer muy f\u00e1cilmente partes espec\u00edficas del contenido de las publicaciones. Consulte la lista de ejemplos que mencion\u00e9 al comienzo de la publicaci\u00f3n. No hay l\u00edmites para lo que usted, como desarrollador de temas, puede hacer. Solo depende de lo que necesite su tema o sitio de WordPress (o lo que simplemente ser\u00eda genial).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una mirada detallada a c\u00f3mo analizar los bloques de una publicaci\u00f3n utilizando las funciones PHP de WordPress para analizar, filtrar y representar bloques espec\u00edficos.<\/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":[892,892,810,716,716,935,935,1110,810,840,840,861,861],"tags":[1172],"class_list":["post-233636","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-gutenberg-2","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233636","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233636"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233636\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/152587"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}