Marcado Schema para estrellas en productos

Juan Antonio Munoz Castro - emoji con bus

Primero LOS RIESGOS de poner valoraciones en el marcado schema

Si bien esta práctica no es nada que se pueda catalogar de innovadora o de implementación muy técnica, llegado el momento Google te puede dar un toque de atención y penalizarte.

Esto tampoco es ninguna novedad, Google va evolucionando e incluso cosas que hoy son White hat “mañana” pueden ser penalizables. Con esto lo que intento decirte es que el que no arriesga no gana y, frecuentemente, cuando estas luchando en las SERPs por palabras clave potentes este truco que te voy a mostrar es un “juego de niños” comparado con lo que te puedes encontrar en algunas webs.

¡Ya conoces los riesgos! ¿Tienes ganas de cacharrear con los resultados de Google?

👇 👇 👇 👇 👇

Voy a ponerte algo nervioso/a 😝 Empezaremos por el final...

¿Como metemos el código Schema de Review?

risas-black-hat

No me voy a extender mucho en este punto. Si tienes dudas sobre como introducir cualquier tipo de código en tu WordPress de forma correcta, aqui te dejo mi post sobre como introducir tanto PHP como cualquier otro código de varias formas en WordPress.

Lo que si quiero matizar en este punto es el Hook de WordPress que vamos a usar para implementar nuestro código schema de review. Debido a un “regalito” que os voy a dejar al final del post, para introducir este código vamos a usar el hook “wp_footer()” para que lo introduzca al final del post.

¡Ahora si! Aqui te dejo el código para las Reviews y su explicación 😉

See the Pen Código Schema base para datos estructurados de Review by Juan Antonio Muñoz Castro (@colchonero82) on CodePen.dark

El código que os he adjuntado es el que he añadido en este mismo post. si quieres ver el resultado busca en google “Juan Antonio Muñoz Castro, schema reviews” o pincha aquí.

Ahora paso a explica un poco por encima los datos que hemos introducido y que son susceptibles de cambios:

  • Name -> Aqui habria que poner el nombre del producto, pero como estamos intentando “hacer trampas” para que nos salgan las estrellitas en los resultados de google, aquí podemos poner el titulo del post. Al final del post, cuando expliquemos como automatizar este código en nuestra web os mostraré como añadir aquí el titulo del post de forma automática.

  • Image -> Esta seria la URL a una imagen del producto, en nuestro caso podemos poner enlace a la imagen destacada del post. En nuestra automatización veremos como meter la URL del la imagen destacada.

  • Description -> Equivaldría a la descripción del producto. En la automatización cogeremos el extracto o excerpt.

  • Brand -> Aquí habría que meter la marca pero para nuestro caso vamos a coger el titulo de la web.

  • SKU -> La referencia del producto. Para nuestro ejemplo vamos a generar una cadena aleatoria que nos sirva de referencia asociada al producto.
     
  • ratingValue -> Aquí ponemos el valor que tendrá la valoración media que se mostrará en Google. En el código que generemos podremos un valor entre 4.7 y 4.9.
     
  • ratingCount -> Nº de valoraciones recibidas en el producto (post para nuestro caso jejejej). Para nuestro código vamos a poner un valor aleatorio entre 600 y 1500 valoraciones.
     
  • reviewCount -> Este marcado schema acepta reviews y en este campo se añade el número de reviews que ha recibido el post. Pondremos un número más bajo de lo que he puesto en el código de ejemplo, un número entre 5 y 50 por ejemplo.

😎 ¿Automatizamos nuestros código para que se genere el solito? 😎


<?php
echo '
    <script type="application/ld+json">
    {
        "@context": "https://schema.org/",
        "@type": "Product", 
        "name": "'.get_the_title().'",      /* sacamos el titulo del post actual */
        "image": "'.wp_get_attachment_url(get_post_thumbnail_id(get_the_ID())).'",      /* sacamos la url de la imagen destacada del post actual */
        "description": "'.get_the_excerpt(get_the_ID()).'",         /* obtenemos el extracto del post */
        "brand": "'.get_bloginfo( 'name' ).'",      /* Mostramos el título del sitio */
        "sku": "'.substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10).'",      /* generamos un código alfanumérico aleatorio */
        "aggregateRating": { 
            "@type": "AggregateRating", 
            "ratingValue": "'.(4+(rand(60,90)/100)).'",         /* sacamos un número aleatorio entre 4.6 y 4.9 */
            "ratingCount": "'.rand(800,1500).'",                /* sacamos un número aleatorio entre 800 y 1500 */
            "reviewCount": "'.rand(100,600).'"                  /* sacamos un número aleatorio entre 100 y 600 */
        } 
    }
    </script>
    ';
?>

Aunque el código esta comentado voy a explicar un poco lo que hace cada línea de código que genera contenido dinámico en función del contenido del post.

  • Fila 8 “name” -> con la función get_the_title() obtenemos el título del post actual y lo introducimos en el código schema.
  • Fila 9 “image” -> igual que el punto anterior pero en esta ocasión lo que extraemos es la url de la imagen destacada del post.
  • Fila 10 “description” -> en esta opción extraemos para mostrar en el apartado description el extracto del post actual.
  • Fila 11 “brand” -> obtenemos y mostramos el titulo del sitio web.
  • Fila 12 “sku” -> este punto lo solventamos generando un código alfanumérico aleatorio de 10 dígitos.
  • Filas 15, 16 y 17 “ratings value y count” -> Para cada una de las opciones generamos un valor numérico aleatorio dentro de unos márgenes que nos interesen.

¡YA SABES COMO GENERAR UN CÓDIGO PHP QUE TE MUESTRE DE FORMA DINÁMICA EL CÓDIGO SCHEMA DE REVIEW PARA TUS POST!

OK-juan-antonio-munoz-castro

Vamos a terminar añadiendo nuestro código en el footer de la web

para poder introducir nuestro código en todos los post vamos a utilizar le Hook wp_footer(), como ya indicamos en el comienzo del post.

Se podría hacer un ShortCode y mostrarlo donde nosotros quisiéramos pero como el objetivo final de este post es automatizarlo optamos por la opción de este hook.


<?php
function JM_FUN_schema_Hook(){

    /* limitamos el códgio schema a las entradas del blog */
    if (get_post_type(get_the_ID())=="post"){

        /* vamos a meter nuestro código en una variable */
        $JM_codigo='
        <script type="application/ld+json">
        {
            "@context": "https://schema.org/",
            "@type": "Product", 
            "name": "'.get_the_title().'",      /* sacamos el titulo del post actual */
            "image": "'.wp_get_attachment_url(get_post_thumbnail_id(get_the_ID())).'",      /* sacamos la url de la imagen destacada del post actual */
            "description": "'.get_the_excerpt(get_the_ID()).'",         /* obtenemos el extracto del post */
            "brand": "'.get_bloginfo( 'name' ).'",      /* Mostramos el título del sitio */
            "sku": "'.substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10).'",      /* generamos un código alfanumérico aleatorio */
            "aggregateRating": { 
                "@type": "AggregateRating", 
                "ratingValue": "'.(4+(rand(60,90)/100)).'",         /* sacamos un número aleatorio entre 4.6 y 4.9 */
                "ratingCount": "'.rand(800,1500).'",                /* sacamos un número aleatorio entre 800 y 1500 */
                "reviewCount": "'.rand(100,600).'"                  /* sacamos un número aleatorio entre 100 y 600 */
            } 
        }
        </script>
        <div style="width: 100%; height: 30px; text-align: center; background-color: #000; color: #ccc;">Esta web utiliza código generado por <a href="https://juanmcastro.es" style="color: #c99e49;">Juan Antonio Muñoz Castro</a>.</div>
        ';

        /* devolvermos el código del hook */
        echo $JM_codigo;
    }
    
}add_action('wp_footer','JM_FUN_schema_Hook');
?>

¡ Ya sabes generar e implementar correctamente tu código !

😋 Si te ha gustado el post compártelo para que llegue a más personas 😋

¡ Se me olvidaban los Bonus finales ! jejejej

BONUS 1: Vamos a disimular un poco nuestro código por si viene un revisor manual de Google

Si añadimos el siguiente código en nuestro funcions.php (o cualquier otra forma de las que explico en mi post sobre introducir código php en WordPress) nos introducirá justo después del contenido de todos nuestros post un “shortcode” suelto.

¿Qué ganamos con esto? sencillo, ese shortcode se quedaría colgado en caso de haber desinstalado de “mala manera” el plugin yet another star rating y un revisor puede pensar pensar que nuestro código no es una mala práctica sino que se trata de un error.


<?php
function JM_FUN_fake_star($content) {

    $JM_regalito = '[yasr_visitor_votes size="medium"]';

    if (get_post_type(get_the_ID())=="post"){
        $content = $content.$JM_regalito;
    }
    
    return $content;
}add_filter('the_content', 'JM_FUN_fake_star');
?>
🚨 🚨 🚨 🚨 🚨 🚨
👇 👇 👇 👇 👇 👇 👇 👇 👇
Juan-Antonio-Munoz-Castro---Alerta
🚨 🚨 🚨 🚨 🚨 🚨
👇 👇 👇 👇 👇 👇 👇 👇 👇

BONUS 2: Vamos a evitar problemas con el contenido dinámico pero descontrolado!

¡¡¡¡¡ Atent@ !!!!! en el código que te muestro justo debajo veras que cada vez que se actualiza la página se generan unos valores aleatorios diferentes!

{ "@context": "https://schema.org/",
"@type": "Product",
"name": "Marcado Schema para estrellas en productos", /* sacamos el titulo del post actual */
"image": "https://juanmcastro.es/wp-content/uploads/2020/04/codigo-schema-product-review.jpg", /* sacamos la url de la imagen destacada del post actual */
"description": "Plugin para generar automáticamente en todos los post un marcado schema de review.", /* obtenemos el extracto del post */
"brand": "Juan Antonio Muñoz Castro", /* Mostramos el título del sitio */
"sku": "tcyTXndxRL", /* generamos un código alfanumérico aleatorio */
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.81", /* sacamos un número aleatorio entre 4.6 y 4.9 */
"ratingCount": "1167", /* sacamos un número aleatorio entre 800 y 1500 */
"reviewCount": "204" /* sacamos un número aleatorio entre 100 y 600 */
}
}

Esto puede hacer que cada vez que pase la araña de Google se encuentre un resultado diferente en nuestro schema llegando a ser incongruente y generando una penalización de libro!

Para solucionar este contratiempo habría que almacenar los valores de nuestro schema en un campo personalizado para que tengamos el control total de lo que se muestra en nuestro código schema dinámico.

Para ello vamos a añadir un pequeño ajuste al código principal:


<?php
function JM_FUN_schema_Hook(){

    /* limitamos el códgio schema a las entradas del blog */
    if (get_post_type(get_the_ID())=="post"){

        /* vamos a meter nuestro código en una variable */
        $JM_codigo='
        <script type="application/ld+json">
        {
            "@context": "https://schema.org/",
            "@type": "Product", 
            "name": "'.get_the_title().'",      /* sacamos el titulo del post actual */
            "image": "'.wp_get_attachment_url(get_post_thumbnail_id(get_the_ID())).'",      /* sacamos la url de la imagen destacada del post actual */
            "description": "'.get_the_excerpt(get_the_ID()).'",         /* obtenemos el extracto del post */
            "brand": "'.get_bloginfo( 'name' ).'",      /* Mostramos el título del sitio */
            "sku": "'.substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10).'",      /* generamos un código alfanumérico aleatorio */
            "aggregateRating": { 
                "@type": "AggregateRating", 
                "ratingValue": "'.(4+(rand(60,90)/100)).'",         /* sacamos un número aleatorio entre 4.6 y 4.9 */
                "ratingCount": "'.rand(800,1500).'",                /* sacamos un número aleatorio entre 800 y 1500 */
                "reviewCount": "'.rand(100,600).'"                  /* sacamos un número aleatorio entre 100 y 600 */
            } 
        }
        </script>
        <div style="width: 100%; height: 30px; text-align: center; background-color: #000; color: #ccc;">Esta web utiliza código generado por <a href="https://juanmcastro.es" style="color: #c99e49;">Juan Antonio Muñoz Castro</a>.</div>
        ';
        
        $JM_schema=get_post_meta( get_the_ID(), 'JM_schema', true);

        if ($JM_schema==""){

            add_post_meta(get_the_ID(), 'JM_schema',  $JM_codigo, true);
        }
        /* devolvermos el código del hook */
        echo get_post_meta( get_the_ID(), 'JM_schema', true);
    }
    
}add_action('wp_footer','JM_FUN_schema_Hook');
?>

Mediante las nuevas líneas de código añadidas verificamos si hay contenido en el custom field “JM_schema” y, en caso de estar vacío, almacenamos un código schema autogenerado en dicho campo personalizado.

Si posteriormente necesitamos modificarlo o borrarlo bastará con mostrar los campos personalizados en las entradas de WordPress y borrar o editar el campo con identificador “JM_schema”. Para que lo veas más claro adjunto imagen de dicho campo personalizado:

BONUS 3: ¿No quieres complicaciones? Te dejo todo en un plugin!

Imagino que algunas personas les costará seguir este tutorial por lo que para ellos he montado todo en un plugin. Para usarlo bastará con subirlo a tu WordPress, activarlo y listo! el solito hará el resto!

¿Necesitas ayuda? ¿Tienes dudas? ¡No dudes en escribirme, estaré encantado de ayudarte!

contacto@juanmcastro.es

2 comentarios en “Marcado Schema para estrellas en productos”

  1. Hola como estas? buen material campeon, te pregunto algo, donde dice, cuando pase la araña de google y…. penalizacion de libro.. a que te referis? a bannearte o eliminarte completamente de los resultados de busqueda? … yo quiero colocar el codigo, tengo un sitio web sobre canales de tv, y a cada canal le quiero agregar la valoracion respectivamente… No es php, no es wordspress, solo HTML … gracias un abrazo grande y espero una respuesta!!

    1. Muy buenas Marcos!

      Con lo de penalización me refiero a que si hoy pasa google y tienes 100 reseñas, mañana tienes 50, pasado 120 y al otro 20 pues….. muy normal no es jejejeje Por eso, al generar el código unos valores aleatorios, lo almacenamos en un custom post type y de esta forma no se vuelve a generar el código.

      En tu caso puedes meterlo en HTML donde te venga bien, te adjunto el código para que lo puedas copiar y rellenar para cada URL de tu web:

      <script type="application/ld+json">
      {
      "@context": "https://schema.org/&quot;,
      "@type": "Product",
      "name": "", /* sacamos el titulo del post actual */
      "image": "", /* sacamos la url de la imagen destacada del post actual */
      "description": "", /* obtenemos el extracto del post */
      "brand": "", /* Mostramos el título del sitio */
      "sku": "", /* generamos un código alfanumérico aleatorio */
      "aggregateRating": {
      "@type": "AggregateRating",
      "ratingValue": "", /* sacamos un número aleatorio entre 4.6 y 4.9 */
      "ratingCount": "", /* sacamos un número aleatorio entre 800 y 1500 */
      "reviewCount": "" /* sacamos un número aleatorio entre 100 y 600 */
      }
      }
      </script>

      Espero haberte sido de ayuda!
      Un saludo y gracias por valorar positivamente el post!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable Juan Antonio Muñoz Castro .
  • Finalidad Moderar los comentarios. Responder las consultas.
  • Legitimación Tu consentimiento.
  • Destinatarios SERED.
  • Derechos Acceder, rectificar y suprimir los datos.
  • Información Adicional Puedes consultar la información detallada en la Política de Privacidad.

Ir arriba
Esta web utiliza cookies, puedes ver aquí la Política de Cookies