Hola @manuelhub y a todos,
Entiendo perfectamente la frustración. El problema con PrestaShop es que, aunque tiene una estructura de datos robusta, no está diseñada para generar un feed de Google Merchant Center 'out of the box'. La función Product::getProducts que utilizas es una buena base para listados generales, pero no para un feed tan específico y exigente como el de Google.
Los campos como GTIN, MPN, condition, google_product_category, brand, shipping_weight, y el manejo correcto de las combinaciones (con sus propias imágenes, precios y códigos) requieren una lógica de consulta y formateo muy específica que no se resuelve fácilmente con métodos estándar.
Tu snippet es una buena aproximación inicial, pero para obtener todos los detalles necesarios, tendrías que hacer uniones (JOIN) con múltiples tablas (ps_product_attribute, ps_product_attribute_lang, ps_product_attribute_combination, ps_feature_product, ps_specific_price, etc.) y gestionar un volumen de datos considerable, lo que puede ser ineficiente si no se optimiza bien. Además, la lógica para determinar la disponibilidad o el estado requiere a menudo comprobaciones adicionales.
Si bien se podría intentar extender tu controlador con más consultas a la base de datos, la complejidad crece exponencialmente. Para una solución más robusta y mantenible, especialmente en PrestaShop 8.2.7, mi recomendación es utilizar un módulo preparado para feed del centro mercantil. Estos módulos están diseñados para:
- Manejar todas las uniones de tablas necesarias para obtener los datos de producto y combinación.
- Formatear los datos según las especificaciones de Google Merchant Center, incluyendo campos obligatorios y opcionales.
- Permitir la personalización de campos o el mapeo de atributos personalizados.
- Actualizarse con los cambios de las APIs de Google y las versiones de PrestaShop, evitando que tu feed se rompa.
Si quisieras intentar una mejora mínima en tu código para obtener más campos, aquí tienes un ejemplo de cómo podrías empezar a consultar más detalles, aunque sigue siendo muy simplificado:
// Dentro de tu bucle 'foreach ($products as $product)'
// modules/mycustomgmcfeed/controllers/front/feed.php
$detailedProduct = new Product($product['id_product'], false, (int)Context::getContext()->language->id);
$feedItems[] = [
'id' => $detailedProduct->id,
'title' => $detailedProduct->name,
'description' => $detailedProduct->description_short,
'price' => Product::getPriceStatic($detailedProduct->id, true, null, 6, null, false, true, 1),
'link' => Context::getContext()->link->getProductLink($detailedProduct->id),
'ean' => $detailedProduct->ean13 ? $detailedProduct->ean13 : $detailedProduct->upc, // Priorizar EAN13
Este pequeño cambio de cargar el objeto Product te da acceso directo a más propiedades como ean13 o upc, pero para las combinaciones y los campos personalizados sigue siendo un reto enorme. Un módulo es la opción más segura y escalable a largo plazo.