En esta entrada te traemos la solución al error: Debe especificarse offers, review o aggregateRating con PrestaShop 1.6 y PrestaShop 1.7 en Search Console el año 2019.

Parece ser que desde Febrero de este año 2019 los de Search Console se han puesto bastante las pilas y han empezado a aparecer errores que antes no detectaba. Uno de estos errores y que casi seguro te has encontrado con él es: Debe especificarse «offers», «review» o «aggregateRating». Si ya lo has resuelto genial, pero si tienes que solucionarlo y estás un poco perdido, te traemos la solución definitiva!

En función de si tu página web está echa con PrestaShop 1.6, con PrestaShop 1.7 o con otras plataformas como Magento o WooCommerce los ficheros a modificar serán distintos aunque la idea es la misma para todas.

La primera cosa que tienes que tener clara es que esta modificación solo se tiene que realizar en los ficheros que muestran productos con sus precios y con la etiqueta:

itemprop=»offers»

El contenedor que contiene esta etiqueta es el que informa a los bots de Google que es donde hay la información relacionada con los precios de los productos, pero para que Google pueda leer bien la información y no nos devuelva ningún error, esta etiqueta tiene que tener rellenadas una serie de atributos (marca (recomendado), GTIN o MPN (recomendado), URL (obligatorio), priceValidUntil (obligatorio)).

Para hacerte una breve idea de los ficheros que tendrás que modificar, son todos aquellos que contengan información sobre los precios de un producto: ficha de producto, accesorios, productos relacionados, listado de productos de una categoría…

Pero no nos enrollamos más, vamos al lío con la solución al error: Debe especificarse offers, review o aggregateRating con PrestaShop 1.6 y PrestaShop 1.7 en Search Console el año 2019.

IMPORTANTE: antes de empezar a aplicar estos cambios es interesante que realizes una copia de seguridad de los ficheros que vas a modificar. Prevenir puede ayudarte a salir de posibles errores.

Solución errores datos estructurados PrestaShop 1.6

Una recomendación antes de empezar a realizar ningún cambio es mirar si el autor de tu plantilla tiene alguna actualización. En caso afirmativo puede ser interesante actualizar el tema para ver si la actualización añade estos cambios.

En caso contrario, los pasos a seguir para la solución al error: Debe especificarse offers, review o aggregateRating son los siguientes:

1- Tienes modificar el fichero «product.tpl» que se encuentra en el directorio «/themes/nombre_tema/» (donde «nombre_tema» es el nombre del tema que estés utilizando).

2- En este fichero tienes que buscar el código:

itemprop=»offers»

Localizando esta parte del código tendrás la posición donde se declara el contenedor que contiene los datos del precio del producto.

3- Antes de la declaración de este contenedor te recomendamos añadir dos propiedades: la marca y el GTIN o MPN.

<meta itemprop="brand" content="{$product->brand}">
<meta itemprop="MPN" content="{$product->ean13}">

4- Ahora tienes que buscar el siguiente código:

{if $product->quantity > 0}

Y a continuación añadir los datos estructurados de la URL y el priceValidUntil:

<meta itemprop="url" content="{$link->getProductLink($product)|escape:'html':'UTF-8'}">

{assign var="dateprice" value="+1 year"|date_format:"%Y-%m-%d"}
{if $product->specificPrice && $product->specificPrice->reduction && $productPriceWithoutReduction > $productPrice && $product->specificPrice->to && $product->specificPrice->to!= '0000-00-00 00:00:00'}<meta itemprop="priceValidUntil" content="{$product->specificPrice.to|date_format:'%Y-%m-%d'}">{else}<meta itemprop="priceValidUntil" content="{$dateprice}">{/if}

Con estos cambios ya tendrás toda la información que Search Console necesita para no lanzar este error y detectar el contenido del contenedor «itemprop=offers» correctamente. Solo te faltará limpiar la cache de tu web e indicar a Search Console que inicie el proceso de validación para que deje de mostrar este error.

El código final quedaría del siguiente modo:

<meta itemprop="brand" content="{$product->brand}">
<meta itemprop="MPN" content="{$product->ean13}">

<p class="our_price_display pull-left" {if $enable_google_rich_snippets}itemprop="offers" itemscope itemtype="https://schema.org/Offer"{/if}>{strip}
{if $enable_google_rich_snippets}{if $product->quantity > 0}<link itemprop="availability" href="https://schema.org/InStock"/>{/if}{/if}
    <meta itemprop="url" content="{$link->getProductLink($product)|escape:'html':'UTF-8'}">
    {assign var="dateprice" value="+1 year"|date_format:"%Y-%m-%d"}
    {if $product->specificPrice && $product->specificPrice->reduction && $productPriceWithoutReduction > $productPrice && $product->specificPrice->to && $product->specificPrice->to!= '0000-00-00 00:00:00'}<meta itemprop="priceValidUntil" content="{$product->specificPrice.to|date_format:'%Y-%m-%d'}">{else}<meta itemprop="priceValidUntil" content="{$dateprice}">{/if}
        {if $priceDisplay >= 0 && $priceDisplay <= 2}
            <span id="our_price_display" {if $enable_google_rich_snippets}itemprop="price"{/if} content="{$productPrice}">{convertPrice price=$productPrice|floatval}</span>
            {if $tax_enabled  && ((isset($display_tax_label) && $display_tax_label == 1) OR !isset($display_tax_label)) && (isset($sttheme.display_tax_label) && $sttheme.display_tax_label)}
                <span class="product_tax_label">{if $priceDisplay == 1}{l s='tax excl.'}{else}{l s='tax incl.'}{/if}</span>
            {/if}
            {if $enable_google_rich_snippets}
                <meta itemprop="priceCurrency" content="{$currency->iso_code}" />
            {/if}
        {/if}
    {/strip}
</p>

Tienes que tener en cuenta que los dos trozos de código comentados que tienes que buscar, cualquier plantilla bien echa tienen que tenerlos. En el caso de no encontrarlos también tendrás que añadirlos.

Solución errores datos estructurados PrestaShop 1.7

Como te comentábamos en el anterior punto, una recomendación antes de empezar a realizar ningún cambio es mirar si el autor de tu plantilla tiene alguna actualización. En caso afirmativo puede ser interesante actualizar el tema para ver si la actualización añade estos cambios.

¿Por qué separamos PrestaShop 1.6 y PrestaShop 1.7? La respuesta es fácil, si has trabajado un poco con las dos versiones sabrás que el directorio de ficheros de PrestaShop 1.7 es totalmente distinto al de la versión 1.6.

Vamos con los pasos a seguir para la solución al error: Debe especificarse offers, review o aggregateRating:

1- En primer lugar tienes que modificar el fichero «product-prices.tpl» que se encuentra en el directorio «/themes/nombre_tema/templates/catalog/_partials/» (donde «nombre_tema» es el nombre del tema que estés utilizando).

2- En este fichero tienes que buscar el código:

itemprop=»offers»

Localizando esta parte del código tendrás la posición donde se declara el contenedor que contiene los datos del precio del producto.

3- Antes de la declaración de este contenedor te recomendamos añadir dos propiedades: la marca y el GTIN o MPN.

<meta itemprop="brand" content="{$product.brand}">
<meta itemprop="MPN" content="{$product.ean13}">

4- Ahora tienes que buscar el siguiente código:

<link itemprop="availability" href="https://schema.org/InStock"/>

Si la plantilla está bien desarrollada encontrarás el anterior código. En caso contrario tendrás que añadirlo y para hacerlo de una forma más correcta y elegante, lo puedes hacer del siguiente modo:

{if isset($product.seo_availability)}
    <link itemprop="availability" href="{$product.seo_availability}"/>
{else}
    <link itemprop="availability" href="https://schema.org/InStock"/>
{/if}

5- A continuación tienen que haber los datos estructurados de la URL y el priceValidUntil. 

Es importante asegurarte antes de añadir ninguno de estos datos estructurados que no estén en el código (en las últimas versiones del PrestaShop 1.7 el dato estructurado «priceValidUntil» ya está incorporado).

<meta itemprop="url" content="{$product.url}" />

{assign var="dateprice" value="+1 year"|date_format:"%Y-%m-%d"}
{if $product.specificPrice && $product.specificPrice.reduction && $productPriceWithoutReduction > $productPrice && $product.specificPrice.to && $product.specificPrice.to != '0000-00-00 00:00:00'}
    <meta itemprop="priceValidUntil" content="{$product.specificPrice.to|date_format:'%Y-%m-%d'}">
{else}
    <meta itemprop="priceValidUntil" content="{$dateprice}">
{/if}

Con estos cambios ya tendrás toda la información que Search Console necesita para no lanzar este error y detectar el contenido del contenedor «itemprop=offers» correctamente. Solo te faltará limpiar la cache de tu web y indicar a Search Console que inicie el proceso de validación para que deje de mostrar este error.

El código final quedaría del siguiente modo:

<meta itemprop="brand" content="{$product.brand}">
<meta itemprop="MPN" content="{$product.ean13}">

<div class="{if $product.has_discount}has-discount{/if}"
                 itemprop="offers"
                 itemscope
                 itemtype="https://schema.org/Offer"
            >

{if isset($product.seo_availability)}
    <link itemprop="availability" href="{$product.seo_availability}"/>
{else}
    <link itemprop="availability" href="https://schema.org/InStock"/>
{/if}

<meta itemprop="priceCurrency" content="{$currency.iso_code}">
<meta itemprop="url" content="{$product.url}" />

<span class="current-price hidden"><span itemprop="price" class="product-price" content="{$product.price_amount}">{$product.price}</span></span>

{assign var="dateprice" value="+1 year"|date_format:"%Y-%m-%d"}
{if $product.specificPrice && $product.specificPrice.reduction && $productPriceWithoutReduction > $productPrice && $product.specificPrice.to && $product.specificPrice.to != '0000-00-00 00:00:00'}
    <meta itemprop="priceValidUntil" content="{$product.specificPrice.to|date_format:'%Y-%m-%d'}">
{else}
    <meta itemprop="priceValidUntil" content="{$dateprice}">
{/if}

</div>

Tienes que tener en cuenta que los dos trozos de código comentados que tienes que buscar, cualquier plantilla bien echa tienen que tenerlos. En el caso de no encontrarlos también tendrás que añadirlos.

Y hasta aquí llega la solución al error: Debe especificarse offers, review o aggregateRating con PrestaShop 1.6 y PrestaShop 1.7 en Search Console el año 2019. Esperamos que te haya servido de ayuda y que ya tengas los datos estructurados de tus productos correctamente para que Google no te pueda penalizar.

Ahora solo te falta indicar que Search Console empiece la validación de estos errores para que en unos días desaparezcan :).

RECUERDA que esta solución te la hemos dado para la ficha de los productos, pero que la tienes que aplicar a la resta de sitios de tu página web que muestren productos y contengan la etiqueta «offers«.