Cómo crear un módulo en PrestaShop 8 para mostrar productos relacionados en la ficha de producto

Cómo crear un módulo en PrestaShop 8 para mostrar productos relacionados en la ficha de producto
Solucionex
30
Mayo 25

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

  1. Copia la carpeta del módulo en /modules/.

  2. Ve al back-office de PrestaShop.

  3. Instala el módulo desde Módulos > Módulos y servicios.

  4. ¡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.