Inicio / Blog / Cómo optimizar el bloque Embed de WordPress con atributos HTML

Cómo optimizar el bloque Embed de WordPress con atributos HTML

Luis Ruiz

Escrito por Luis Ruiz el Actualizado el

El bloque Embed de WordPress es una herramienta muy útil para insertar contenido multimedia en tus páginas y entradas. Sin embargo, en ocasiones puede resultar necesario optimizar su comportamiento para mejorar su apariencia, o rendimiento.

En este artículo, te mostraremos cómo añadir atributos HTML a los diferentes elementos del bloque Embed para que puedas personalizarlo según tus necesidades.

Este artículo surgió a raíz de insertar la url de uno de los plugin que he desarrollado en WordPress para la comunidad.

Para la inserción de la url utilicé el bloque embed-block y queda una card bastante chula, pero necesitaba mejorar un par de elementos del bloque.

Resultado al insertar la url del plugin en el bloque Embed

A continuación vamos a ver como añadir atributos a los diferentes elementos HTML del bloque Embed.

Modificar los enlaces del bloque

El enlace que tiene el bloque no tiene los atributos «target=_blank» y «rel=noreferer noopener nofollow» que son necesarios para que el usuario, y los bots de rastreo, no se vayan de la página. También añadiremos un poco más de privacidad y seguridad.

Aquí podéis ver la estructura HTML del bloque que se genera.

Enlace dentro del HTML del bloque Embed
Enlace dentro del HTML del bloque Embed

Añadir atributos Target y Rel al enlace del bloque

Para modificar el bloque usaremos el Hook render_block. Este filtro de WordPress permite modificar el contenido de un bloque antes de que se renderice en el frontend.

La modificación solo la queremos aplicar en el bloque «wp-block-emded» y no en todas las url que se inserten. Solo las queremos en las que sean para los plugin del repositorio. Si nos fijamos en la captura anterior, vemos que en el elemento «figure» tiene dos estilos, con lo que podemos identificarlos «is-provider-plugin-directory» y «wp-block-embed-plugin-directory».

El código para añadir los atributos sería el siguiente:

function bk_embed_block($block_content, $block) {
  if ( $block['blockName'] !== 'core/embed' || strpos($block_content, 'wp-block-embed-plugin-directory') === false ) {
     return $block_content;
  }
	
  $block_content = str_replace( '<a', '<a target="_blank" rel="noreferer noopener nofollow"', $block_content );
  return $block_content;
}
add_filter('render_block', 'bk_embed_block', 10, 2);

Con este código, lo único que modificamos son los bloques del tipo «core/embed», y que contengan la cadena «wp-block-embed-plugin-directory».

Si cumple la condición, añadimos los atributos a los enlaces dentro de ese bloque para abrirlos en una nueva ventana, y establecer ciertos atributos de privacidad y seguridad.

Si has eliminado el script wp-embed, o tienes algún problema de JavaScript, en lugar de mostrar la card se verá un simple enlace.

Modificar el iframe del bloque

Si tengo la necesitas de usar un iframe en la página que no se va a mostrar, inmediatamente tengo que añadirle un lazyload. La carga innecesaria de elementos hacen que la página cargue más lenta, y consuma recursos que no necesitamos si el usuario no lo va a ver.

Atributos en el iFrame dentro del HTML del bloque Embed
Atributos en el iFrame dentro del HTML del bloque Embed

Añadir lazyload al iframe de bloque Embed

Ahora toca añadir el atributo lazyload al iframe, pero viendo el código anterior resulta sencillo. Sería añadiendo esta simple línea.

$block_content = str_replace('<iframe', '<iframe loading="lazy"', $block_content);

Inicialmente, pensé utilizar la API de HTML que incluye WordPress a partir de la versión 6.2, pero no merecía el esfuerzo.

El problema de ese código, es que al añadirle el lazyload deja de aplicarse el script wp-embed, y te muestra un simple link en la página en lugar de la card.

Solucionar el problema del Lazyload en el iframe del bloque

Mirando otra vez en el código, vemos que el script «wp-embed» lo que hace es añadir un estilo «display:none» al enlace, y al iframe el atributo style con su contenido.

Lo insertaremos manualmente, y así podremos también eliminar la petición al script «wp-embed» si no lo usamos, mejorando así la velocidad de carga de la página.

El código a añadir sería:

$block_content = str_replace('<iframe', '<iframe loading="lazy"', $block_content);
$block_content = preg_replace('/style=".*?"/', '', $block_content);
$block_content = str_replace('<a', '<a target="_blank" rel="noreferer noopener nofollow" style="display:none;"', $block_content);

En la primera línea añadimos en el iframe el lazyload. En la segunda eliminamos en el iframe el atributo style y su contenido. Y finalmente, en la tercera añadimos los atributos de antes y el CSS con el «display:none».

Ahora vamos a mejorar el código usando expresiones regulares para simplificarlo, y por si en un futuro queremos añadir nuevos atributos.

$patterns = array(
    '/<iframe/', 
    '/style=".*?"/', 
    '/<a/'
);
$replacements = array(
    '<iframe loading="lazy"', 
    '', 
    '<a target="_blank" rel="noreferer noopener nofollow" style="display:none;"'
);
$block_content = preg_replace($patterns, $replacements, $block_content);

Código final para modificar el bloque Embed

Aquí dejo el código final, y recordad que si no utilizáis el script «wp-embed» podéis eliminar la petición con la función wp_deregister_script. Si os interesa la optimización, os dejo un artículo de como mejorar la carga de vuestro WordPress.

function bk_embed_block($block_content, $block) {
    if ($block['blockName'] !== 'core/embed' || strpos($block_content, 'wp-block-embed-plugin-directory') === false) {
        return $block_content;
    }
    $patterns = array(
        '/<iframe/', 
        '/style=".*?"/', 
        '/<a/'
    );
    $replacements = array(
        '<iframe loading="lazy"', 
        '', 
        '<a target="_blank" rel="noreferer noopener nofollow" style="display:none;"'
    );
    
    $block_content = preg_replace($patterns, $replacements, $block_content);

    return $block_content;
}
add_filter('render_block', 'bk_embed_block', 10, 2);

Espero que este artículo os sirva de ayuda, o por lo menos satisfaga vuestra curiosidad para «jugar» con los bloques de WordPress.

Desarrollo

Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.

Cookies estrictamente necesarias

Las cookies estrictamente necesarias tiene que activarse siempre para que podamos guardar tus preferencias de ajustes de cookies.

Cookies de terceros

Esta web utiliza Google Analytics para recopilar información anónima tal como el número de visitantes del sitio, o las páginas más populares.

Dejar esta cookie activa nos permite mejorar nuestra web.