Hola @carlacart71, entiendo perfectamente el problema que describes. Es una situación que puede ocurrir en PrestaShop 1.7.0.4 si el objeto Order en el momento del hook ActionValidateOrder no ha cargado completamente todos los detalles de los productos, o si hay algún tipo de producto que getProducts() está omitiendo.
Para asegurar una invalidación de caché robusta, debemos garantizar que se obtienen todos los productos del pedido directamente de los detalles del pedido, en caso de que el método getProducts() devuelva un array vacío. La mejor manera de hacerlo es recurrir a la tabla ps_order_detail.
Aquí te propongo una modificación para el fragmento de código en prestaspeedcache/prestaspeedcache.php:
function hookActionValidateOrder($params)
{
if (empty($params['order']) || !($params['order'] instanceof Order)) {
return;
}
$products = $params['order']->getProducts();
if (empty($products) && $params['order']->id) {
// Fallback: Obtener productos directamente desde los detalles del pedido
$products = Db::getInstance()->executeS('SELECT od.id_product, od.id_product_attribute FROM `'._DB_PREFIX_.'order_detail` od WHERE od.id_order = '.(int)$params['order']->id);
}
Explicación del cambio:
- Mantengo la llamada original a
$params['order']->getProducts() como primera opción.
- Añado una condición
if (empty($products) && $params['order']->id): Si $products está vacío y tenemos un id_order válido, significa que necesitamos una alternativa.
- Dentro de esa condición, realizo una consulta directa a la base de datos (
ps_order_detail) para obtener id_product y id_product_attribute de todos los elementos asociados al id_order actual. Esto garantiza que no se omita ningún producto.
- Finalmente, se pasa el array
$products (ya sea el original o el obtenido por fallback) a PscCacheInvalidator::fromOrderProducts.
Esto debería solucionar el problema de la invalidación de caché para esos productos específicos.