En PrestaShop, mostrar productos relacionados puede ayudar a aumentar el valor medio del carrito y mejorar la experiencia del usuario. Aunque existen módulos de pago que lo hacen, hoy vamos a enseñarte cómo crear un módulo gratuito desde cero que muestre productos relacionados automáticamente en la página de producto usando los hooks y clases nativas de PrestaShop 8.
🛠️ ¿Qué vamos a hacer?
Crear un módulo llamado
relatedproducts
.Usar el hook
displayProductAdditionalInfo
para insertar contenido debajo del botón "Añadir al carrito".Obtener productos relacionados por categoría o accesorios.
Mostrar los productos con miniaturas, nombre y precio usando
ProductLazyArray
.
1. 🗂️ Estructura del módulo
Crea una carpeta con esta estructura dentro de /modules/relatedproducts/
:
relatedproducts/
├── relatedproducts.php
├── views/
│ └── templates/
│ └── hook/
│ └── relatedproducts.tpl
2. 🧾 Código del archivo principal: relatedproducts.php
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class RelatedProducts extends Module
{
public function __construct()
{
$this->name = 'relatedproducts';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Solucionex';
$this->need_instance = 0;
$this->ps_versions_compliancy = ['min' => '8.0.0', 'max' => _PS_VERSION_];
parent::__construct();
$this->displayName = $this->l('Related Products on Product Page');
$this->description = $this->l('Displays related products automatically on the product page.');
}
public function install()
{
return parent::install() &&
$this->registerHook('displayProductAdditionalInfo');
}
public function hookDisplayProductAdditionalInfo($params)
{
if (!isset($params['product'])) {
return '';
}
$product = new Product((int) $params['product']['id_product'], false, $this->context->language->id);
$related_products = $this->getRelatedProducts($product);
$this->context->smarty->assign([
'related_products' => $related_products,
]);
return $this->display(__FILE__, 'views/templates/hook/relatedproducts.tpl');
}
private function getRelatedProducts(Product $product)
{
$category = new Category($product->id_category_default, $this->context->language->id);
$products = $category->getProducts($this->context->language->id, 0, 4, 'date_add', 'DESC');
$related = [];
foreach ($products as $prod) {
if ((int)$prod['id_product'] !== (int)$product->id) {
$related[] = new Product((int)$prod['id_product'], false, $this->context->language->id);
}
}
return $related;
}
}
3. 📄 Código del template: relatedproducts.tpl
{if $related_products|count}
<div class="related-products card mt-4">
<h4 class="card-header">{l s='Related Products' mod='relatedproducts'}</h4>
<div class="card-body row">
{foreach from=$related_products item=related}
{assign var='productLazy' value=$link->getProductLink($related.id)}
<div class="col-md-3 text-center">
<a href="{$productLazy}" class="d-block">
<img src="{$related.cover.bySize.home_default.url}" alt="{$related.name}" class="img-fluid mb-2" />
<p>{$related.name|truncate:35}</p>
<p class="price">{$related.getPrice(true)|convertAndFormatPrice}</p>
</a>
</div>
{/foreach}
</div>
</div>
{/if}
✅ Resultado
Con este módulo instalado, cuando un usuario visite una ficha de producto, verá una sección con productos relacionados de la misma categoría, con imagen, nombre y precio. Puedes mejorar el algoritmo para usar productos con accesorios, ventas cruzadas u otros criterios.
🧠 Mejora Pro
Puedes modificar el método getRelatedProducts()
para usar:
$product->getAccessories($this->context->language->id);
Así mostrarás accesorios configurados manualmente desde el back-office.
🔁 Instalación
Copia la carpeta del módulo en
/modules/
.Ve al back-office de PrestaShop.
Instala el módulo desde Módulos > Módulos y servicios.
¡Listo!
📈 ¿Por qué es útil este módulo?
Mejora la conversión con ventas cruzadas.
Aumenta el tiempo de permanencia en la tienda.
Reduce la tasa de rebote.
Puedes adaptarlo fácilmente para usar otros criterios.