Miguel Rodríguez hace desarrollo de software efectivo.

Soluciones para implementar Microdatos + Schema.org en Drupal

Este tutorial fue probado solamente en Drupal 7
Drupal es uno de los mejores CMS disponible ahora, tiene grandes capacidades por defecto, y si carece de algo, puedes mejorar sus capacidades con un montón de módulos disponibles, que van desde las APIs a temas, sin embargo, a pesar de que Drupal ha sido mejorado atrozmente, todavía hay algunas cosas que faltan, una de esas cosas que mejorar tiene que ver con el módulo RDFa, este módulo se utiliza para definir datos legibles por la máquina (con frecuencia llamados fragmentos enriquecidos) pero tiene algunos problemas con temas HTML5, por desgracia, no hay reemplazo para este módulo, y no hay módulos que pueden solucionar este problema por completo, pero hay otras maneras simples para definir los fragmentos enriquecidos, ¿has oído hablar de Microdata (Microdatos) y Schema.org?, Microdata es una nueva especificación promovida con HTML5.
 
Hay dos maneras de utilizar Microdata + Schema.org para definir los fragmentos enriquecidos así como eliminar el módulo RDFa, la primera es usando el módulo Microdata (Drupal), tiene una forma de implementar Schema.org a los tipos de contenido y campos, sin embargo, todavía no es compatible con algunos tipos de datos y podría ser inestable todavía (mejor pruébalo tú mismo), el segundo es añadir/modificar las plantillas con el fin de establecer los fragmentos enriquecidos por ti mismo, puede ser más trabajo, pero tendrá más control, además, puedes hacer incluso más cosas como establecer datos ocultos, utilizar información ya mostrada y mucho más, además, no se supone que cambies o definas los fragmentos enriquecidos todo el tiempo, así que por qué no hacerlo por tematización.
 

Primera alternativa: Microdata (módulo)

 
Hay un módulo para Drupal que puede implementar Microdata a los tipos de contenido y sus campos, sin embargo, todavía no es compatible con algunos tipos de datos, a pesar de esto, es una buena manera de definir los fragmentos enriquecidos con microdatos. Es un poco rudimentario, trabaja directamente con los tipos de contenido, así que si necesitas definir algo más, me temo que no se puede hacer con este módulo, los tipos de datos se especifican directamente en una entrada de texto (sin caja de selección o de cualquier otra cosa) que no está validada, por lo que es posible que necesite algún conocimiento acerca de Microdata y Schema.org, a pesar de sus limitaciones, es bastante simple de usar (al menos para mí), sólo tienes que especificar el tipo de dato para un tipo de contenido determinado, especifique los ítems para cada campo y ya está.
 
Drupal - Microdata (módulo)
Una forma sencilla de implementar Microdatos + Schema.org es utilizando un módulo como Microdata (módulo)
Atribución: 
 

Segunda alternativa: Reemplazo de plantillas

 
A pesar de que Microdata (módulo) parece ser bastante interesante, aún podría ser algo inestable, no personalizable y no se puede definir los datos ocultos con él, sin embargo, si se reemplaza algunas plantillas puedes hacer todo eso y más, además, ¿cuántas veces es necesario definir los fragmentos enriquecidos?, yo diría que sólo una vez, pero incluso si alguien tiene que hacerlo más de una vez, sería tan sólo un par de veces, no se supone que debas cambiar los fragmentos enriquecidos todos los días.
 
Vamos a definir algunos fragmentos enriquecidos comunes por reemplazo de plantillas, esto ayudaría a saber exactamente cómo implementar Microdata/Schema.org utilizando este método, vamos a definir algunos fragmentos enriquecidos, tales como: WebSite, BlogPosting, Autor y ArticleBody.
 
A fin de definir los fragmentos enriquecidos con Schema.org, algunas plantillas clave deben reemplazarse, tales como la plantilla HTML (html.tpl.php), algunos tipos de contenido (node.tpl.php), y algunos campos (field.tpl. php, especialmente el campo del cuerpo), además, vamos a definir una función para definir cada imagen con Schema.org.
 

Un resumen a los archivos de tema

 
Antes de hacer nada, tenemos que comprobar todos los fragmentos enriquecidos que podemos definir de acuerdo con las plantillas que se pueden reemplazar, así conoceremos las plantillas que tenemos que reemplazar exactamente, esto es una visión general de las plantillas más elementales que podemos crear.
Theme files overview
Atribución: 
Básicamente, tenemos que tener una lista de todos los fragmentos enriquecidos que se desean definir a fin de encontrar donde los datos se muestran en la plantilla y definirlos apropiadamente, para ello debes tener conocimiento acerca de la estructura de Drupal y cómo tematizarlo, por lo general las etiquetas HTML y Body (el cuerpo) se definen junto con el contenido de la página en el archivo html.tpl.php, el contenido de la página el cual incluye muchas regiones como el contenido en sí, la cabecera, el pie de página y las barras laterales, se define en el archivo page.tpl.phpel archivo node.tpl.php imprime el contenido de cada nodo los cuales pueden incluir sus respectivos campos, este contenido es el contenido real de Drupal, los campos se definen en el archivo field.tpl.php (aunque no está en la imagen de arriba existe y es importante, al menos para mí), incluyendo el campo del cuerpo el cual tiene el contenido principal del nodo, este tipo de cosas tienen que ser conocidas a fin de definir los datos deseados.
Microdatos y Schema.org permiten definir cualquier dato dentro de un elemento HTML a través de un conjunto de atributos, hay tipo de datos bastante básicos como "Fecha" o "Número" los cuales existen sólo para almacenar datos simples como números, fechas o trozos de texto, hay tipos de datos globales tales como "Sitio Web" y "WebSiteElement" (y todos sus derivados) que se utilizan para representar las entidades generales que encierran los datos que no tiene que estar asociado como suyos. Hay tipos de datos más específicos como "Persona", "Organización" y "Lugares" que incluyen varios ítems con datos muy detallados, una vez que sepas qué datos se deben definir y donde se encuentran, sólo tienes que añadir los atributos apropiados.
 

Una vista general a Microdata y Schema.org

 
Schema.org es un nuevo conjunto de tipos de datos para Microdata, Microdata es una nueva especificación que permite definir datos legibles por la máquina en documentos HTML, está especialmente optimizado para HTML5, y es bastante fácil de usar. Parafraseando el uso de Microdata / Schema.org, Microdata trabaja básicamente con tres atributos, "itemscope", "ItemType" y "itemprop", el atributo "itemtype" define el tipo de dato de un ítem dado (los elementos HTML con atributos de Microdata van a ser llamados ítems de ahora en adelante), la dirección URL del tipo de datos se supone que se establece aquí, todos los tipos de datos de Schema.org se puede encontrar en la sección "The type hierarchy" de su documentación, curiosamente, todas las direcciones URL de cada tipo de dato que figuran en dicha página son las URL real a ser establecidas en ese atributo. La mayoría de los ítems con un tipo de datos definido contienen un conjunto de ítems hijos, no sólo datos simples, por ejemplo, los ítems con tipo de dato "person" (persona) pueden contener nombre, correo electrónico, teléfono y mucho más, en estos casos el atributo "itemscope" debe establecerse, el atributo "itemscope" indica los ítems que tienen ítems hijos, es muy probable que el atributo "itemscope" se establezca junto con el atributo "itemtype". Cada ítem hijo debe tener un atributo "itemprop" a fin de indicar qué ítem está representando, por ejemplo, el ítem que represente el nombre de otro ítem debe tener el atributo "itemprop" con el valor "name" (nombre) a fin de indicar que es un hijo específico de un ítem padre, si el ítem hijo tiene un tipo de dato, debe tener un atributo "itemtype" (y un atributo "itemscope" si tiene ítems hijos también), tenga en cuenta a los ítems con un atributo "itemscope", deben tener por lo menos un ítem hijo si no, no será reconocido, algunos tipos de datos requerirán ítems específicos como el ítem "nombre" (por ejemplo: el tipo de dato "Person" [persona]), se recomienda que se defina el ítem "name" (nombre) cuando sea posible.
  1. <!-- un ítem de tipo de dato persona sin ningún ítem padre -->
  2. <div id="element" class="element" itemscope itemtype="http://schema.org/Person">
  3.  
  4. ...
  5.  
  6. <!-- un párrafo con dos ítems hijos (name and jobTitle) encerrados por etiquetas "span" cuyo padre es el ítem de tipo de dato persona -->
  7. <p>Hello I am <span itemprop="name">Miguel Rodriguez</span>, a freelance <span itemprop="jobTitle">Developer</span>.</p>
  8.  
  9. ...
  10.  
  11. <!-- un ítem de tipo de dato organización, representa el dato 'worksFor' (trabaja para) del ítem de tipo de dato persona -->
  12. <div itemprop="worksFor" itemscope itemtype="http://schema.org/Organization">
  13.  
  14. <!-- un ítem hijo, es el dato 'name' (nombre) del ítem de tipo de dato organización -->
  15. <div itemprop="name">Independent Contractor</div>
  16.  
  17. </div>
  18.  
  19. </div>
Este es un ejemplo del uso de Schema.org, existe un ítem con un  tipo de dato "persona" que contiene tres hijos, el ítem "name", "JobTitle" y "worksFor", todos estos ítems hijos están indicados por el atributo "itemprop", el ítem "worksFor" tiene un tipo de dato "Organization" (Organización) que también contiene un ítem "nombre". No escribir la URL completa del tipo de dato es un error común (por ejemplo: hay que escribir "http://schema.org/Person" no sólo "schema.org / Person"), también debes asegurarte de validar los fragmentos enriquecidos con un validador en línea, tales como la herramienta de prueba de datos estructurados de Google.
 

La plantilla HTML: html.tpl.php

 
En la plantilla HTML puede encontrar las etiquetas HTML & Body y los elementos HTML que encierran el contenido de la página, aunque no hay nada más, esta plantilla es perfecta para establecer un ítem de tipo de dato "WebSite" (sitio web), así como cualquier otro ítem de tipo de datos globales para encerrar el contenido, lo siguiente es la posible estructura de la plantilla HTML.
  1. <!DOCTYPE html>
  2.  
  3. <html ... >
  4.  
  5. <head ... >
  6.  
  7. <?php print $head; ?>
  8. <title><?php print $head_title; ?></title>
  9.  
  10. ....
  11.  
  12. <?php print $styles; ?>
  13. <?php print $scripts; ?>
  14.  
  15. ....
  16.  
  17. </head>
  18. <!-- Puedes colocar un tipo de dato en la etiqueta "Body" -->
  19. <body ... itemscope itemtype="http://schema.org/WebPage" >
  20.  
  21. ...
  22.  
  23. <?php print $page_top; ?>
  24.  
  25. ...
  26.  
  27. <!-- o puedes hacer un contenedor -->
  28. <div class="wrapper" ... [itemprop=" ... "] itemscope itemtype="http://schema.org/WebPage" >
  29.  
  30. <?php print $page; ?>
  31.  
  32. <meta itemprop="name" content="WebPage Name">
  33. </div>
  34.  
  35. ...
  36.  
  37. <?php print $page_bottom; ?>
  38.  
  39. ...
  40.  
  41. </body>
  42. </html>
Digamos que esta es la estructura del archivo html.tpl.php (el archivo html.tpl.php nunca se verá igual, sea que estés usando un tema construido a partir de cero o un subtema), como se mencionó anteriormente, este plantilla es perfecta para colocar ítems de tipo de datos globales para incluir todo el contenido.
 

La plantilla de la página: page.tpl.php

 
Algunos elementos de sitio web tales como el encabezado, el pie de página y barras laterales están definidas en la plantilla de la página, el contenido está definido aquí también (en realidad, es sólo un contenedor pero el contenido está dentro de todos modos), en esta plantilla puedes definir todo esos elementos como el "WPHeader", "WPFooter" y "WPSideBar" respectivamente, esto sería un ejemplo de una plantilla de página (recordemos que todas las plantillas pueden cambiar dependiendo del tema base que estás utilizando, si estás utilizando un tema base por supuesto).
  1. ...
  2.  
  3. <div id="page">
  4.  
  5. ...
  6.  
  7. <div id="header" ... itemscope itemtype="http://schema.org/WPHeader">
  8. ...
  9. <meta itemprop="name description" content="Header">
  10. </div>
  11.  
  12. ...
  13.  
  14. <div id="content" ... >
  15. ...
  16. <?php print render($page['content']); ?><!-- tu contenido va aquí -->
  17. ...
  18. </div>
  19.  
  20. ...
  21.  
  22. <div id="sidebar-first" ... itemscope itemtype="http://schema.org/WPSideBar">
  23. ...
  24. <meta itemprop="name description" content="Left Sidebar">
  25. </div>
  26.  
  27. ...
  28.  
  29. <div id="sidebar-second" ... itemscope itemtype="http://schema.org/WPSideBar">
  30. ...
  31. <meta itemprop="name description" content="Right Sidebar">
  32. </div>
  33.  
  34. ...
  35.  
  36. <div id="footer" itemscope itemtype="http://schema.org/WPFooter">
  37. ...
  38. <meta itemprop="name description" content="Footer">
  39. </div>
  40.  
  41. ...
  42.  
  43. </div>

La plantilla del nodo: node.tpl.php

 
Todo el contenido de Drupal se muestra como nodos, incluyendo cualquier tipo de contenido, datos como el título (si hay alguno), el autor, la imagen de autor y fecha de creación se pueden encontrar en esta plantilla, en función del contenido, puedes reemplazar la plantilla de nodo para definir cualquier ítem "BlogPosting" o "Article", aunque también puedes definirlo en la plantilla de la página, se recomienda definirlo en la plantilla de nodo.
No todos los datos se muestran, existen algunos datos que debes definir mediante el uso de las variables que la plantilla proporciona sin mostrarlos, con el fin de hacer esto, los datos deben definirse en elementos meta HTML, estos metas deben ser colocado dentro de un elemento que va a representar el "autor" del ítem "BlogPosting" o "Article", según el  tipo de dato "Article" (el tipo de dato "BlogPosting" hereda todas sus propiedades) el ítem hijo "author" (autor) debe ser de tipo de dato "Person" (persona), por lo tanto un ítem de tipo de dato "Person" (persona) va a ser creado encerrando la imagen del usuario (eso relacionaría la imagen con el autor de forma automática, por favor consulte la sección "agregando las imágenes" más abajo) y toda la información oculta va a ser definida después de ella (este artículo no cubre como obtener los datos del autor).
  1. <div id="node-<?php print $node->nid; ?>" ... itemscope itemtype="http://schema.org/BlogPosting" ... >
  2.  
  3. ...
  4.  
  5. <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
  6.  
  7. ...
  8.  
  9. <div itemprop="author" itemscope itemtype="http://schema.org/Person">
  10.  
  11. <?php print $user_picture; ?>
  12.  
  13. <div class="submitted">
  14. <?php print $submitted; ?>
  15. </div>
  16.  
  17. <meta itemprop="name" content="nombre del autor">
  18. <meta itemprop="url" content="URL del autor">
  19. <meta itemprop="email" content="Email del autor">
  20.  
  21. </div>
  22.  
  23. ...
  24.  
  25. <div class="content clearfix"<?php print $content_attributes; ?>>
  26.  
  27. ...
  28.  
  29. <?php print render($content); ?>
  30.  
  31. ...
  32.  
  33. </div>
  34.  
  35. ...
  36.  
  37. <meta itemprop="name" content="<?php print $title; ?>">
  38. <meta itemprop="dateCreated" content="<?php print $date; ?>">
  39.  
  40. </div>
Aunque puede establecer un tipo de datos a todos los nodos, establecer tipos de datos específicos a los nodos de acuerdo con el tipo de contenido es recomendado, puedes reemplazar la plantilla para tipos de contenido específicos al nombrar el archivo de plantilla así:
  1. node--[tipo de contenido].tpl.php
Para obtener más información, visite la página de documentación de Drupal acerca de template (theme hook) suggestions.
 

La plantilla de los campos: field.tpl.php

 
Cada campo individual en Drupal se pueden personalizar con esta plantilla, hay algunos campos que vienen por defecto, como el campo del cuerpo, por lo general, el contenido esencial se presenta en este campo, esto hace que sea perfecto para definir ítems como el "ArticleBody" o otro ítem que venga en el interior del ítem "Article" (artículo).
  1. <div itemprop="articleBody" class="<?php print $classes; ?>"<?php print $attributes; ?>>
  2.  
  3. ...
  4.  
  5. <?php if (!$label_hidden): ?>
  6. <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
  7. <?php endif; ?>
  8.  
  9. ...
  10.  
  11. <div class="field-items"<?php print $content_attributes; ?>>
  12.  
  13. <?php foreach ($items as $delta => $item): ?>
  14. <div class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>><?php print render($item); ?></div>
  15. <?php endforeach; ?>
  16.  
  17. </div>
  18.  
  19. ...
  20. </div>
La misma situación ocurre con los campos, aunque se puede definir un ítem para todos los campos, establecer un ítem específico a los campos de acuerdo con el tipo de contenido se recomienda, puedes reemplazar la plantilla para tipos de contenido específicos así:
  1. field--[field name]--[content type].tpl.php
para mas información visita template (theme hook) suggestions.
 

Definiendo más información

 
No toda la información se puede añadir con sólo plantillas, hay algunas otras cosas que hacer a fin de añadir el resto de la información tal como las imágenes y los anuncios, por ejemplo, alguna información puede estar contenida en los bloques, alguna otra información , como las imágenes, no pueden acceder así de fácil.
 

Añadiendo las imágenes

 
La información de la página web y sus artículos se han añadido, sin embargo, las imágenes no lo están, deben ser agregadas y asociadas con la página web, como ustedes saben, esto no es algo que se puede hacer simplemente reemplazando una plantilla, a fin de hacer esto debemos añadir una función que va a agregar los atributos de Microdata de forma automática.
  1. function THEME_preprocess_image(&$vars)
  2. {
  3. $vars["attributes"]["itemprop"] = "image";
  4. }
Todas las imágenes estarían asociadas con sus respectivos ítems principales de forma automática, por lo que si hay una imagen en el interior del ítem "WebPage", esa imagen se asociará con él, si hay una imagen en el interior del ítem "BlogPosting", esa imagen estará asociada con el (no con el ítem "WebPage"), y así sucesivamente.
 

Añadiendo los anuncios

 
También puedes definir los anuncios, a fin de hacerlo, debieron haber sido agregados en un bloque con filtrado "full html" sin ningún editor de texto (WYSIWYG), no deberías modificar los anuncios, pero puedes agregar los anuncios en un contenedor que puedes crear con los atributos apropiados.
  1. <div itemscope itemtype="http://schema.org/WPAdBlock">
  2.  
  3. <script type="text/javascript" ... > ... </script>
  4.  
  5. ...
  6.  
  7. </div>
Al hacer esto, todos los anuncios serán definidos con Microdata + Schema.org, es importante definir tantos datos como sea posible, incluso si significa añadir todos los anuncios.
 

Añadiendo la información en los campos (wysiwyg)

 
Esto es un poco incómodo porque no hay editores de texto que permiten añadir información de Microdata cómodamente, pero todavía es posible siempre y cuando sepas HTML y que puedas insertar entradas HTML completas (full HTML), básicamente, sólo hay que recordar cómo funcionan Microdata y Schema.org, simplemente selecciona un fragmento de información y enciérralo entre etiquetas SPAN, si se trata de un ítem que va a tener más ítems añade un atributo "itemscope", si se trata del hijo de un ítem padre añade un atributo "itemprop" con el nombre del ítem que está representando, si tiene un tipo de dato específico (ya sea requerido por su ítem padre o no) añade un atributo "itemtype" con el tipo de dato adecuado.
 

Beneficios y Limitaciones

 
Ambas posibilidades tienen beneficios y limitaciones que podrías considerar;
 

Usando Microdata (módulo);

Pues bien, usar este módulo sería mejor para la gente que no sabe cómo programar o personas que les gusta las cosas fáciles, se puede definir una gran cantidad de datos sin problemas, además, esto pudiera ser ideal si necesitas añadir/cambiar los datos a menudo con Microdata y Schema.org (esto es hipotético, todavía no sé por qué harías esto), aunque tiene algunas limitaciones sigue siendo una gran alternativa.
 
Beneficios
 
  • es un proceso sencillo.
  • No requiere habilidades para programar (aunque deberías saber cómo funciona Microdata y Schema.org).
  • Muchos tipos de datos pueden ser usados.
 
Limitaciones
 
  • Solo se puede especificar datos entre tipos de contenido y sus campos.
  • Aunque soporta muchos tipos de dato, pudiera haber algunos tipos de datos que no puedan ser usados.
  • No se pueden especificar datos ocultos.
  • Hay muchos datos afuera de los tipos de contenido que no pueden ser definidos.
 

A través de tematización;

En mi opinión personal, esto es más una solución de tematización que una solución de módulo, esto es algo que debe ser planificado y no "sobre la marcha", si usted necesita definir los datos a fondo (todos los ítems que se pueden incluidos los datos ocultos) tal vez hacer esto es la mejor solución.
 
Beneficios
 
  • Los datos pueden ser especificados exhaustivamente.
  • Cualquier tipo de dato puede ser usado.
  • Se pueden definir datos ocultos.
  • Puedes definir otros ítems como la cabecera, el pié de página, las barras laterales, los anuncios y muchas otras cosas.
 
Limitaciones
 
  • Se requiere habilidades para programar.
  • Pudiera ser difícil y complicado.

About me

Acerca del autor
Miguel Rodríguez es un desarrollador freelance de Caracas - Venezuela, es una persona persistente y orientada a metas que trata de hacer el mejor uso de sus recursos, es lo suficientemente positivo, proactivo y motivado como para plantear una meta con intenciones de cumplirla, encuentra más sobre él .