Este es un resumen de mi charla que he realizado en WordCamp Chiclana 2020, que desde aquí agradezco su confianza para contar conmigo como ponente.
Tabla de contenidos
¿Qué son los Schemas?
- Conjunto de etiquetas para describir nuestro contenido.
- Ofrece semántica enriquecida para los buscadores.
- Ayuda a entender y clasificar la información.
- Podrá aparecer destacado en el buscador.
Tipos de Schemas
En la página de Schema.org, ofrece la jerarquía total de todos los esquemas creados, siendo los de primer nivel los siguientes:
- Action. Acción realizada por un agente directo o indirecto sobre un objeto directo.
- CreativeWork. El tipo más genérico para especificar un trabajo creativo, que incluye libros, películas, fotografías, programas de software, etc.
- Event. Un evento que ocurre en un determinado tiempo y localización, tal como un concierto, clase o festival. La información de las entradas se puede realizar utilizando la propiedad ofertas. Los eventos repetitivos deberán estructurarse como objetos de eventos separados.
- Intangible. Una clase útil que sirve de paraguas para cosas intangibles como cantidades, valores estructurados, etc.
- MedicalEntity. El tipo genérico de la entidad relacionada con la salud y la práctica de la medicina.
- Organization. Una organización como un colegio, ONG, corporación, club, etc.
- Person. Una persona (viva, muerta, «no muerta», o ficticia).
- Place. Entidades que están de alguna manera fijas, con un sitio fijo.
- Product. Un producto o servicio ofertado. Por ejemplo: un par de zapatos, una entrada de concierto, alquiler de coches, un corte de pelo, o un episodio de una serie en streaming online.
Nos ofrece un total de 1022 esquemas diferentes, por lo que podemos darnos cuenta de la versatilidad para utilizar dichos esquemas.
Ejemplo Schema para Recetas
add_action( 'wp_head', 'cmk_add_schema_pages', 20 );
/**
* Shows Schema depeding of post type in header with LD JSON
*
* @return void
*/
function cmk_add_schema_pages() {
$post_id = get_the_ID();
$cook_time = get_post_meta( $post_id, 'rec_tiempo', true );
$prep_time = get_post_meta( $post_id, 'rec_tiempo', true );
$ingredients = get_post_meta( $post_id, 'rec_ingredient', false );
$recipe_inst = wp_strip_all_tags( get_post_meta( $post_id, 'rec_preparacion', true ) );
$recipe_yield = get_post_meta( $post_id, 'rec_personas', true );
if ( is_singular( 'receta' ) ) {
$sch = '
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Recipe",
"author": "David Perez",
"cookTime": "PT' . $cook_time . 'M",
"datePublished": "2009-05-08",
"description": " ' . get_the_excerpt() . '",
"image": "' . get_the_post_thumbnail_url() . '",
"recipeIngredient": [';
if ( is_array( $ingredients ) ) {
foreach ( $ingredients[0] as $ingredient ) {
$sch .= '" ' . $ingredient . '",';
}
}
$sch .= '],
"prepTime": "' . $prep_time . '",
"recipeInstructions": "' . $recipe_inst . '",
"recipeYield": "' . $recipe_yield . ' persons",
"suitableForDiet": "http://schema.org/LowFatDiet"
}
</script>';
echo $sch;
} // Recipe schema
}
Ejemplo Esquema Organización
add_action( 'wp_head', 'cmk_add_schema_home_page', 20 );
/**
* Shows Schema depeding of post type home_page in header with LD JSON
*
* @return void
*/
function cmk_add_schema_home_page() {
if ( is_front_page() || is_home() ) {
$sch = '
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Organization",
"address": {
"@type": "PostalAddress",
"addressLocality": "Granada, España",
"postalCode": "18006",
"streetAddress": "Calle Jose Luis Pérez Pujadas, 6 Edificio Forum Oficina B29"
},
"email": "info@closemarketing.es",
"url": "https://www.closemarketing.es/",
"description": "Agencia de Marketing Online, Diseñamos Web en WordPress para Granada y Málaga.",
"taxID": "ESB19618909",
"employee": [
{
"@type": "Person",
"name": "David Pérez"
},
{
"@type": "Person",
"name": "Sacra Jáimez"
}
],
"member": [
{
"@type": "Organization",
"name": "AJE Granada"
},
{
"@type": "Organization",
"name": "WordPress Granada"
}
],
"name": "Closemarketing",
"telephone": "+34858958383"
}
</script>';
echo $sch;
} // home_page schema
}
Ejemplo Esquema Cursos
add_action( 'wp_head', 'cmk_add_schema_courses', 20 );
/**
* Shows Schema depeding of post type in header with LD JSON
*
* @return void
*/
function cmk_add_schema_courses() {
if ( is_singular( 'formacion' ) ) {
$post_id = get_the_ID();
$price_raw = get_post_meta( $post_id, '_listing_price', true );
$time_raw = get_post_meta( $post_id, 'for_dura', true );
$time = substr_replace( $time_raw, '', -1 );
if ( date( m ) > 6 ) {
$year_start = date( 'Y' );
$year_end = date( 'Y' ) + 1;
} else {
$year_start = date( 'Y' ) - 1;
$year_end = date( 'Y' );
}
$start_date = $year_start . '-09-01';
$end_date = $year_end . '-06-20';
$sch = '<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@id": "./",
"@type": "Course",
"name": "' . get_the_title( $post_id ) . '",
"description": "' . get_the_excerpt( $post_id ) . '",
"hasCourseInstance": [
{
"@type": "CourseInstance",
"name": "' . get_the_title( $post_id ) . '",
"location": {
"@type": "Place",
"address": {
"@type": "PostalAddress",
"addressLocality": "Granada",
"addressRegion": "ESP"
}
},
"description": "' . get_the_excerpt( $post_id ) . '",
"startDate": "' . $start_date . '",
"startDate": "' . $end_date . '",
"timeRequired": "' . $time . '",
"about": "' . get_post_meta( $post_id, 'for_ncursos', true ) . '"
}
]
}
</script>';
echo $sch;
} // Course schema
}
David, que no tuvimos ocasión de preguntarte ayer. ¿Por qué el logo de magento? 😀
Buenas! Ese logo es también el de Schema.org. Lo encontré navegando por Internet. La verdad, no sé porqué se parecen tanto..
Aquí tienes un ejemplo…:
https://jaaadesign.nl/en/blog/schema-org/
Buen día.
Gusto en saludar, tenemos una página web para ofertar cursos presenciales, queremos incluir las siguientes propiedades a»image», «url», «las 5 estrellitas de valorización» y «cantidades de horas del curso».
Abajo dejo el código base, a ese código queremos incorporar las propiedades descritas anteriormente, el código será agregado con el plugin: Insert Headers and Footers
Los cursos fueron creados con el plugin Woocommerce dado que son de pago.
Nos puedes colaborar con el código que incluyan las propiedades y si nos recomiendas otras propiedades, bienvenidas serán,
CÓDIGO:
{
«@context»: «https://schema.org»,
«@type»: «Course»,
«name»: «Técnicas de masaje Hindú Champi»,
«description»: «Esta ocupación ha sido diseñada para adquirir los conocimientos fundamentales de la actividad de Técnicas de masaje Hindú Champi.»,
«provider»: {
«@type»: «Organization»,
«name»: «Ickurd Capacitaciones»,
«sameAs»: «https://www.ickurd.cl/inscripciones/masoterapia/tecnicas-de-masaje-hindu-champi/»,
«telephone»: «+569 8143 5170»
}
}
Tu código de ejemplo para curso no funciono, solamente copie el script y lo pegue en footer.php y nos dio mucho errores al consultar en https://search.google.com/structured-data/testing-tool?utm_campaign=devsite&utm_medium=jsonld&utm_source=job-posting#
NUESTRO CÓDIGO ENTERO:
{
«@context»: «https://schema.org»,
«@type»: «Course»,
«name»: «Técnicas de masaje Hindú Champi»,
«description»: «Esta ocupación ha sido diseñada para adquirir los conocimientos fundamentales de la actividad de Técnicas de masaje Hindú Champi.»,
«provider»: {
«@type»: «Organization»,
«name»: «Ickurd Capacitaciones»,
«sameAs»: «https://www.ickurd.cl/inscripciones/masoterapia/tecnicas-de-masaje-hindu-champi/»,
«telephone»: «+569 8143 5170»
}
}
Buenas Eduardo, ¿Qué tipo de problemas os dio? El código al copiar y pegar, ten cuidado con las comillas.
Tampoco te lo recomiendo en el footer.php, sino más bien en mu-plugins/functions.php para que prevalezca independientemente del tema.
Saludos.
Gracias por tu respuesta.
La carpeta mu-plugins de mi Worpress esta vacía y nunca la hemos utilizado , pensamos que estos tipos de códigos se agregaban dentro del tema hijo en el archivo **.php
Nuestro servicio es Capacitaciones, Cursos o Talleres.
Comprendimos la lógica de construir los códigos (en la generalidad, no tan puntual) de forma manual a través de campos personalizados explicado en: https://digitalmarketcol.com/blog/como-agregar-datos-estructurados-a-wordpress-manualmente/
Creamos un campo personalizado llamado Schemamarkup tal como en la explicación, y copiamos el siguiente código en la caja valor:
{
«@context»: «https://schema.org»,
«@type»: «Course»,
«name»: «Técnicas de masaje Hindú Champi «,
«description»: «Esta ocupación ha sido diseñada para adquirir los conocimientos fundamentales de la actividad de Técnicas de masaje Hindú Champi. «,
«provider»: {
«@type»: «Organization»,
«name»: «Ickurd Capacitaciones»,
«sameAs»: «https://www.ickurd.cl/inscripciones/masoterapia/tecnicas-de-masaje-hindu-champi/»,
«telephone»: «+569 8143 5170»
},
«image»: {
«@type»: «ImageObject»,
«contentLocation»: «Región Metropolitana»,
«contentUrl»: » https://www.ickurd.cl/wp-content/uploads/2020/05/Técnicas-de-masaje-Hindú-champi.png «,
«name»: «Técnicas de masaje Hindú Champi»
},
«aggregateRating»:{
«@type»:»AggregateRating»,
«ratingValue»:»4″,
«ratingCount»:»1004″,
«bestRating»:»5″
}
}
}
Revisamos el código shema.org en https://search.google.com/structured-data/testing-tool?hl=es#
y todo bien, reconoce «@type»: «Course».
Luego en el archivo header.php antes de la etiqueta de cierre copiamos:
$schemamarkup = get_post_meta(get_the_ID(), ‘schemamarkup’, true);
if(!empty($schemamarkup)) {
echo $schemamarkup;
}
Luego nos fuimos a probar la URL de la página del producto donde aplicamos el campo personalizado: https://search.google.com/structured-data/testing-tool?hl=es#, el resultado de la URL indica @type Product, y no «@type»: «Course», es ahí en donde nos perdemos.
Los producto fueron realizados a través del plugin woocommerce, no se si este plugin ya trae shema.org o no?
Luego de esto dejamos los archivo como ants, eliminamos el campo personalizado Schemamarkup y el codigo del archivo header.php:
$schemamarkup = get_post_meta(get_the_ID(), ‘schemamarkup’, true);
if(!empty($schemamarkup)) {
echo $schemamarkup;
}
Probamos nuevamente la URL en https://search.google.com/structured-data/testing-tool?hl=es#, y nos arrojo el mismo resultado que la vez anterior, nos muestra @type Product, aunque ya eliminamos todo pero igual lo sigue mostrando.
Finalmente scaneamos la web en https://www.woorank.com/es/ y no reconoce ningún shema.org
Nuestra web https://www.ickurd.cl
La capacitación donde aplicamos el campo personalizado es en:
https://www.ickurd.cl/inscripciones/masoterapia/tecnicas-de-masaje-hindu-champi/
Esto es lo que realizamos, ahora lo dejamos como antes, desahicimos todo, pero cuando consulto la URL del curso en https://search.google.com/structured-data/testing-tool?hl=es# me indica que si hay shema.org pero de Prodcut, pero cuando realizo el scan, no me aparece que tenga shema.org.
Gracias de antemanos.