Cierto día, uno de mis clientes se enfrentó a un problema puntual en Google Search Console que podría estar afectando la visibilidad y el rendimiento de su tienda en línea. El error reportado fue el siguiente: Falta el campo «priceCurrency» (en «offers.priceSpecification»). Este tipo de mensajes pueden generar confusión, sobre todo si no estás familiarizado con los detalles técnicos que Google espera para interpretar correctamente la información sobre los productos en un sitio web.
El sitio en cuestión está construido en WordPress y utiliza WooCommerce para gestionar la tienda virtual. Además, cuenta con los plugins Yoast SEO y Yoast WooCommerce, los cuales son herramientas populares para optimizar el SEO y mejorar el rendimiento de los productos dentro de la tienda. A pesar de tener estos plugins bien configurados, el error persistía, y al analizarlo más a fondo, descubrí que la causa del inconveniente radicaba en una de las fichas de productos, más específicamente, en los metadatos relacionados con los precios.
Cuando Google rastrea un sitio web, especialmente para tiendas en línea, se espera que los datos estructurados estén bien implementados para garantizar que los productos sean interpretados correctamente en los resultados de búsqueda, y que funciones como los rich snippets (fragmentos enriquecidos) puedan mostrarse de forma efectiva. En este caso, la falta del campo «priceCurrency» dentro de la especificación del precio de los productos era el motivo del error.
Este tipo de errores puede impactar negativamente en el rendimiento de búsqueda, ya que Google no puede asociar correctamente la moneda del producto, lo que afecta tanto la visibilidad como la precisión de la información que se muestra en los resultados. La correcta implementación de los datos estructurados es crucial para garantizar que los productos sean fácilmente identificados, lo que podría influir en el tráfico web y las conversiones de la tienda.

Con el error mencionado

{
"@context": "https://schema.org",
"@graph": [{
"@type": "Product",
"@id": "https://unatienda.com/libro/argumentos-para-la-defensa-legal-de-los-hombres-victimas-de-la-ley-348/#product",
"name": "Argumentos para la defensa legal de los hombres víctimas de la ley 348",
"url": "https://unatienda.com/libro/argumentos-para-la-defensa-legal-de-los-hombres-victimas-de-la-ley-348/",
"description": "A lo largo de sus páginas, descubrirás:\r\n\r\n \tUn examen detallado de la normativa vigente: La obra analiza a fondo las disposiciones más relevantes de la Ley 348, ofreciendo una perspectiva crítica sobre su interpretación y aplicación.\r\n \tEstudios de caso reveladores: Los ejemplos prácticos incluidos no solo ilustran los desafíos que enfrentan los acusados, sino que también proponen soluciones claras y efectivas para abogados en ejercicio.\r\n \tEstrategias de defensa bien fundamentadas: A través de este libro, el lector accederá a herramientas argumentativas que permiten abordar cada etapa del proceso penal con mayor solidez y profesionalismo.\r\n \tPropuestas para una legislación más inclusiva: Más allá de la crítica, los autores presentan caminos hacia la construcción de un marco jurídico más equitativo, siempre en favor de la justicia.",
"image": {
"@id": "https://unatienda.com/libro/argumentos-para-la-defensa-legal-de-los-hombres-victimas-de-la-ley-348/#primaryimage"
},
"offers": [{
"@type": "Offer",
"priceSpecification": {
"0": {
"@type": "UnitPriceSpecification",
"price": "290.00",
"priceCurrency": "BOB",
"valueAddedTaxIncluded": false,
"validThrough": "2026-12-31"
},
"@type": "PriceSpecification",
"price": "290.00"
},
"availability": "http://schema.org/InStock",
"url": "https://unatienda.com/libro/argumentos-para-la-defensa-legal-de-los-hombres-victimas-de-la-ley-348/",
"seller": {
"@id": "https://unatienda.com/#organization"
},
"@id": "https://unatienda.com/#/schema/offer/28932-0"
}],
"mainEntityOfPage": {
"@id": "https://unatienda.com/libro/argumentos-para-la-defensa-legal-de-los-hombres-victimas-de-la-ley-348/"
},
"brand": {
"@type": "Brand",
"name": "Alicia Cerezo Sarabia"
}
}]
} // JSON Document
Obviamente el error se encontraba justo en:
"priceSpecification":{"0":{"@type":"UnitPriceSpecification","price":"290.00","priceCurrency":"BOB","valueAddedTaxIncluded":false,"validThrough":"2026-12-31"},
Para resolverlo, agregué una función en el archivo functions.php del tema de WordPress. Esta solución fue necesaria porque la implementación de los datos estructurados para los productos de WooCommerce no estaba completada con el campo «priceCurrency», lo que causaba el error en Google Search Console. Al modificar el archivo functions.php, pude inyectar el campo faltante en el marcado JSON-LD de los productos, asegurándome de que el precio y la moneda fueran correctamente definidos.
La función que añadí al archivo functions.php fue diseñada para que, cada vez que se mostrara un producto en la tienda, se generara dinámicamente el campo «priceCurrency» dentro de los metadatos JSON-LD del producto, tomando en cuenta la moneda establecida en WooCommerce. Esto garantizó que no solo se solucionara el error en Google Search Console, sino que también se optimizaran los datos estructurados, mejorando así la interpretación del producto por parte de los motores de búsqueda.
function corregir_schema_json_ld($data) {
if (isset($data['@type']) && $data['@type'] === 'Product') {
if (isset($data['offers']) && is_array($data['offers'])) {
foreach ($data['offers'] as &$oferta) {
if (is_array($oferta)) {
// Asegurar que priceCurrency esté presente directamente en offers
if (!isset($oferta['priceCurrency']) && isset($oferta['price'])) {
$oferta['priceCurrency'] = 'BOB';
}
// Corregir priceSpecification si está mal estructurado
if (!isset($oferta['priceSpecification']) || !is_array($oferta['priceSpecification'])) {
$oferta['priceSpecification'] = [
"@type" => "UnitPriceSpecification",
"price" => $oferta['price'] ?? "0.00",
"priceCurrency" => $oferta['priceCurrency'] ?? "BOB",
"valueAddedTaxIncluded" => false,
"validThrough" => "2026-12-31"
];
} else {
// Verificar si priceSpecification tiene una estructura incorrecta
if (isset($oferta['priceSpecification'][0]) && is_array($oferta['priceSpecification'][0])) {
$oferta['priceSpecification'] = $oferta['priceSpecification'][0]; // Eliminar índice numérico
}
// Asegurar que priceCurrency esté dentro de priceSpecification
if (!isset($oferta['priceSpecification']['priceCurrency'])) {
$oferta['priceSpecification']['priceCurrency'] = $oferta['priceCurrency'] ?? "BOB";
}
}
}
}
}
// Corregir imagen
if (isset($data['image']) && is_array($data['image'])) {
$data['image'] = reset($data['image']);
}
// Limpiar la descripción de etiquetas HTML
if (isset($data['description']) && is_string($data['description'])) {
$data['description'] = strip_tags($data['description']);
}
}
return $data;
}
add_filter('wpseo_json_ld_output', 'corregir_schema_json_ld', 10, 1);
add_filter('woocommerce_structured_data_product', 'corregir_schema_json_ld', 10, 1);
Tras aplicar los cambios y probar en Google Search console todo mejoró, se resolvió el problema.
