Hola @raul_store, @miriamdev y @ruben_deco,
Tenéis razón en que es un comportamiento inusual para Order::getProducts() en hookActionValidateOrder en PrestaShop 1.7.6.0. Aunque el objeto Order se pasa en el hook, en escenarios muy específicos o con ciertos módulos de pago que pueden alterar el flujo transaccional, a veces el objeto $params['order'] no está completamente hidratado o los OrderDetails no son accesibles de inmediato a través de él, incluso si el ID del pedido ya existe.
Para asegurar que siempre trabajamos con un objeto Order completamente fresco y cargado desde la base de datos, podemos recargarlo explícitamente usando su ID. Esto fuerza la hidratación completa y debería resolver los casos donde getProducts() devuelve vacío.
Aquí tienes la modificación que deberías aplicar en prestaspeedcache/prestaspeedcache.php:
function hookActionValidateOrder($params)
{
if (empty($params['order']) || !($params['order'] instanceof Order) || empty($params['order']->id)) {
return;
}
$order = new Order((int) $params['order']->id); // Recargamos el objeto Order
$products = $order->getProducts(); // Ahora obtenemos los productos del objeto recargado
PscCacheInvalidator::fromOrderProducts(is_array($products) ? $products : array());
}
Con new Order((int) $params['order']->id); nos aseguramos de que el objeto $order es una instancia completamente nueva y cargada con todos los detalles del pedido desde la base de datos, incluyendo sus productos asociados. Luego, al llamar a $order->getProducts(), obtendremos la lista completa de productos del pedido sin importar el estado transaccional previo.