Nota revisada y reescrita el 18 de octubre de 2026: la versión original tenía errores y datos sin fuente.
Hay muchas tiendas que siguen en PrestaShop 1.6 por un módulo a medida que "no funciona en la nueva". Antes de reescribirlo entero, merece la pena saber qué cambió exactamente en 1.7. Casi todo está en el artículo que publicó el propio equipo de PrestaShop al lanzar esa versión. Si vas a dar el salto ahora, apunta directamente a la versión actual (8 o 9): estos cambios de 1.7 te tocan igual, y después tendrás los de cada versión mayor.
1. Hooks que ya no existen
Una parte de los hooks de 1.6 se eliminó en 1.7. Si tu módulo se engancha a uno de ellos, simplemente deja de mostrarse, sin ningún error. Entre los eliminados:
displayPayment,paymentReturnyorderConfirmation(todo el flujo de pago cambió, ver abajo).displayTopColumn,displayNav,displayProductTabydisplayProductContent.updateQuantity.
Y hay hooks nuevos para el tema por defecto: displayNav1, displayNav2, displayFooterBefore, displayFooterAfter, displayReassurance, displayAfterCarrier, displayExpressCheckout...
Un renombrado que confunde: displayProductButtons pasó a llamarse displayProductAdditionalInfo a partir de 1.7.1. Se mantiene un alias, pero conviene registrar el nombre nuevo.
Revisa el install() del módulo: cada registerHook('...') debe apuntar a un hook que exista en la versión de destino.
2. Plantillas Smarty
- Escape automático. En 1.7, Smarty escapa las cadenas por defecto. Quita los
|escape:'html':'UTF-8'de las plantillas del front (si no, verás&dobles) y añadenofilterdonde imprimas HTML a propósito:{$descripcion nofilter}. - Arrays, no objetos. A las plantillas ya no se les pasan objetos, solo arrays.
{$product->name}pasa a ser{$product.name}, y algunas variables cambiaron de nombre o desaparecieron. - Enlaces.
$linkestá obsoleto. Se usa el helper{url ...}. - Cargar plantillas con la ruta
module:, por ejemplo$this->fetch('module:mimodulo/views/templates/hook/bloque.tpl'), para que el tema pueda sobrescribirlas. - El tema cambió por completo. Las plantillas del tema de 1.6 no sirven. La referencia es el tema Classic.
3. Módulos de pago
Es la parte que más cambia. Los parámetros de hookPaymentReturn y hookDisplayOrderConfirmation ya no traen total_to_pay, currency, currencyObj ni objOrder: todo va en una única clave order.
public function hookPaymentReturn($params)
{
$order = $params['order'];
$currency = new Currency($order->id_currency);
$total = $order->getOrdersTotalPaid();
// ...
}
Además, el checkout de 1.7 muestra las condiciones generales junto a las opciones de pago, con un único botón de pagar. Las opciones de pago se registran con el hook paymentOptions, que devuelve objetos PrestaShop\PrestaShop\Core\Payment\PaymentOption, en lugar de pintar HTML en displayPayment.
4. Pestaña del producto en el back office
Las pestañas que añadía cada módulo en la ficha de producto se sustituyen por una única pestaña para todos los módulos, con hookDisplayAdminProductsExtra. Los parámetros llegan como array en el método del hook (no por la URL), los campos del formulario siguen el formato [NOMBRE_MODULO][NOMBRE_CAMPO], y el contenedor tiene el id module_NOMBRE_MODULO.
5. Overrides
Las páginas del back office que se reescribieron en Symfony (la ficha de producto y la página de módulos) no admiten overrides, y el código con namespace tampoco se puede sobrescribir. Si tu módulo de 1.6 dependía de un override de Product o de AdminProductsController, tendrás que buscar un hook equivalente. La recomendación oficial es extender en lugar de sobrescribir.
Cómo abordarlo
- Lista los hooks que registra el módulo y compáralos con la lista de hooks de la versión de destino.
- Instálalo en una copia de la tienda con la versión nueva y el modo debug activo (
_PS_MODE_DEV_atrueenconfig/defines.inc.php), para ver los avisos en lugar de una página en blanco. - Adapta primero las plantillas, luego los hooks, luego el pago. Prueba un pedido completo con la pasarela en modo test.
- Declara en el constructor las versiones soportadas con
$this->ps_versions_compliancy, para que no se pueda instalar donde no funciona.