Pasar al contenido principal

¿Cómo resolver meta etiquetas diferenciadas en Drupal multidominio sin necesidad de nuevos módulos?

El módulo Metatag es una pieza fundamental para la gestión de etiquetas en Drupal y en consecuencia, es muy utilizado por la comunidad para mejorar las condiciones de SEO on-site de los proyectos. Sin embargo, existe una deficiencia en su diseño que se hace notoria cuando se gestionan múltiples sitios con diferentes dominios mediante el módulo Domain.

Texto Equipo Pixel

El problema radica en que el front-page de todos los dominios se limita a una única configuración de meta etiquetas, por lo que al final todos los sitios terminan compartiendo la misma información.

Por ejemplo.

Misitio.com y Miotrositio.com utilizarían las mismas etiquetas title o description.

La primera alternativa natural es utilizar tokens tales como el nombre del mismo dominio para lograr pequeñas variaciones en las etiquetas, por ejemplo:

Tienda electrónica | Misitio.com, se diferenciaría mínimamente de Tienda electrónica | Miotrositio.com.

Sin embargo, ésta es una opción limitada y que solo es posible si se tiene el módulo Token disponible.

Una segunda opción permite utilizar variables personalizadas por dominio a través del módulo Token Custom, no obstante, esto requiere de la instalación y mantenimiento de al menos dos nuevos módulos, pues este paquete tiene a su vez una dependencia hacia el módulo Token.

Por consiguiente, una tercera opción más simple de mantener -especialmente en sitios que comparten el mismo theme-, radica en la creación de un hook dentro de éste usando un preproceso de HTML como el que se muestra a continuación:

function MYTHEME_preprocess_html(&$variables) {
 try {
     $variables['is_front'] = \Drupal::service('path.matcher')->isFrontPage();
     $variables['dominio'] = \Drupal::service('domain.negotiator')->getActiveId();
     if($variables['is_front'] == true && $variables['dominio'] == "DOMAIN_MACHINE_NAME") {
         $variables['head_title']['title'] = t(‘TITULO PERSONALIZADO’);
         $description = [
           '#tag' => 'meta',
           '#attributes' => [
             'name' => 'description',
             'content' => t('DESCRIPCIÓN PERSONALIZADA'),
           ],
         ];
         $variables['page']['#attached']['html_head'][] = [$description, 'description'];
     }
 }
 catch (Exception $e) {
   …
 }

El código simplemente asigna una variable de dominio al contexto del theme, la cual permite diferenciar un sitio de otro y en consecuencia establecer etiquetas completamente diferentes para cada uno.

Las etiquetas se pueden extender a nuevos meta datos dentro de la etiqueta HEAD de HTML, aunque en el anterior ejemplo solo se define description y el título.

Como beneficio adicional, la variable “dominio” queda disponible dentro del theme para gestionar modificaciones en el twig, por lo que un snipet como éste puede ser útil también en otros escenarios.

Este snipet es funcional en Drupal 10 y 11.