Hola @albertolab10, entiendo perfectamente el problema que describes. @inmadigital tiene razón en que el Order::getProducts() debería ser consistente, pero en versiones de PrestaShop 1.7.x, y especialmente en ciertos puntos del ciclo de vida del pedido, el objeto Order que recibimos en el $params de un hook a veces no está completamente cargado con todos sus datos desde la base de datos.
Esto puede hacer que getProducts() devuelva false o un array incompleto en situaciones donde debería devolver los productos correctos, llevando a que el PscCacheInvalidator reciba un array vacío y, por tanto, no invalide la caché.
La solución más robusta es asegurar que el objeto Order esté completamente hidratado antes de intentar obtener sus productos. Puedes modificar tu fragmento de código de la siguiente manera:
if (empty($params['order']) || !($params['order'] instanceof Order)) {
return;
}
// Re-cargar el objeto Order para asegurar que todos los datos estén disponibles
$order = new Order((int)$params['order']->id);
$products = $order->getProducts();
// Aseguramos que siempre se pase un array, incluso si getProducts devuelve false/null
PscCacheInvalidator::fromOrderProducts(is_array($products) ? $products : []);
Al re-instanciar $order con new Order((int)$params['order']->id), garantizamos que se carguen todos los datos del pedido desde la base de datos, lo que hace que getProducts() sea mucho más fiable en este contexto. El (int) es importante para asegurar que el ID sea un entero.