Pasar al contenido principal
×

¿Cómo eliminar etiquetas duplicadas hreflang en Drupal 8?

Cuando se utiliza Metatag para personalizar las etiquetas hreflang en Drupal 8, se genera una duplicidad de tags en el encabezado de la página que genera estructuras poco apropiadas para los motores de búsqueda. A continuación una solución efectiva que le ayudará a resolver esta necesidad de SEO.

Texto por Techi | Comentando el post de raphaeltbm

Drupal 8 añade a través de las funcionalidades de traducción incluidas en el core las etiquetas hreflang que corresponden con cada contenido, taxonomía o url que presenta al usuario.

Esta implementación es insuficiente para lograr una buena flexibilidad en la definición granular de etiquetas como la que se requiere en una adecuada gestión de SEO onsite, por lo que se suele ampliar la instalación utilizando los módulos Metatag y Metatag: hreflang.

Sin embargo, cuando se definen las etiquetas según la documentación estándar de Metatag, éstas etiquetas personalizadas no sobrescriben las etiquetas hreflang del core, sino que por el contrario las duplica en dos áreas separadas dentro de la etiqueta <head>.

El resultado no es óptimo en términos de la estructura requerida por los motores de búsqueda y en consecuencia se vuelve imperativo buscar la manera de eliminar las etiquetas duplicadas.

Después de múltiples aproximaciones, la entrada de raphaeltbm ofrece un parche de DamienMcKenna que se puede incluir como un preproceso en el archivo .theme del tema utilizado por el sitio para generar el efecto deseado de eliminar de la salida HTML las etiquetas hreflang que hayan sido sobrescritas por reglas generales o específicas a través del módulo Metatag.

A continuación, dejamos una copia del parche para quienes se hayan tomado un tiempo buscando una solución así y no la hayan encontrado aún.

function metatag_hreflang_page_attachments_alter(array &$attachments) {
  // Only bother doing anything if both the "html_head" and "html_head_link"
  // structures are present in the output.
  if (!empty($attachments['#attached']['html_head'])) {
    if (!empty($attachments['#attached']['html_head_link'])) {
      // Get all defined hreflang_per_language values from html_head.
      $hreflang_per_language = [];
      foreach ($attachments['#attached']['html_head'] as $element) {
        // Check for Metatag's identifier "hreflang_per_language".
        if (!empty($element[1])) {
          if (strpos($element[1], 'hreflang_per_language') !== false) {
            $hreflang_per_language[] = $element[0]['#attributes']['hreflang'];
          }
        }
      }

      // Remove default links coming from content_translation if already defined
      // by Metatag.
      foreach ($attachments['#attached']['html_head_link'] as $key => $element) {
        if (isset($element[0]['hreflang']) && in_array($element[0]['hreflang'],                    $hreflang_per_language)) {
          unset($attachments['#attached']['html_head_link'][$key]);
        }
      }
    }
  }
}

En nuestro caso esta solución ha sido probada y puesta en producción en versiones Drupal 8.9.x.



Nota: Este texto es una rescritura parcial en idioma español de las soluciones originales de sus autores y en ningún momento pretende presentar como propio el código referenciado.