Índice
2. Tablas implicadas en el proceso
- 3.1 Clonar ps_category
- 3.2 Clonar ps_category_lang
- 3.3 Clonar ps_category_shop
4. Clonar productos de la categoría
- 4.1 Obtener productos asociados
- 4.2 Clonar cada producto (básico)
- 4.3 Clonar ps_product_lang
- 4.4 Clonar ps_product_shop
- 4.5 Clonar ps_stock_available
- 4.6 Relacionar el producto clonado con la nueva categoría
Resumen
Clonar una categoría completa junto a todos sus productos en PrestaShop puede ser una operación valiosa para tiendas que gestionan catálogos por temporada, idiomas o estrategias comerciales. Este artículo explica paso a paso cómo hacerlo mediante consultas SQL, cuidando la integridad relacional y ofreciendo alternativas comparativas con métodos tradicionales.
- Introducción
En tiendas PrestaShop con cientos de productos y categorías, replicar una categoría entera puede ahorrar tiempo en vez de hacerlo desde el back-office. Por ejemplo, si quieres crear una versión «verano 2025» de una categoría «verano 2024», lo puedes automatizar con SQL.
Clonaremos:
- La categoría en sí (estructura, nombre, metadatos)
- Todos los productos asociados a esa categoría
- Tablas implicadas en el proceso
Tabla | Descripción |
ps_category | Datos principales de la categoría |
ps_category_lang | Nombre y metadatos por idioma |
ps_category_shop | Relación con tiendas (multitienda) |
ps_category_product | Relación de productos con categorías |
ps_product | Producto principal |
ps_product_lang | Texto, nombre, descripción por idioma |
ps_product_shop | Datos por tienda |
ps_stock_available | Stock del producto |
- Clonar una categoría
3.1 Clonar ps_category
INSERT INTO ps_category (id_parent, level_depth, active, date_add, date_upd, position)
SELECT id_parent, level_depth, active, NOW(), NOW(), position
FROM ps_category
WHERE id_category = 12; -- ID de la categoría original
Obtener el nuevo id_category generado:
SELECT MAX(id_category) FROM ps_category;
Supongamos que el nuevo ID es 123.
3.2 Clonar ps_category_lang
INSERT INTO ps_category_lang (id_category, id_shop, id_lang, name, description, link_rewrite)
SELECT 123, id_shop, id_lang, CONCAT(name, ' (Clon)'), description, CONCAT(link_rewrite, '-clon')
FROM ps_category_lang
WHERE id_category = 12;
3.3 Clonar ps_category_shop
INSERT INTO ps_category_shop (id_category, id_shop, position)
SELECT 123, id_shop, position FROM ps_category_shop WHERE id_category = 12;
- Clonar productos de la categoría
4.1 Obtener productos asociados
SELECT id_product FROM ps_category_product WHERE id_category = 12;
Iteramos sobre esos IDs para duplicarlos.
4.2 Clonar cada producto (básico)
INSERT INTO ps_product (reference, price, active, id_category_default, date_add, date_upd)
SELECT CONCAT(reference, '-CLON'), price, active, 123, NOW(), NOW()
FROM ps_product WHERE id_product = 50; -- Ejemplo con ID 50
Obtener nuevo id_product:
SELECT MAX(id_product) FROM ps_product;
Supongamos que es 210.
4.3 Clonar ps_product_lang
INSERT INTO ps_product_lang (id_product, id_lang, id_shop, name, description, link_rewrite) SELECT 210, id_lang, id_shop, CONCAT(name, ' (Clon)'), description, CONCAT(link_rewrite, '-clon') FROM ps_product_lang WHERE id_product = 50;
4.4 Clonar ps_product_shop
INSERT INTO ps_product_shop (id_product, id_shop, price, active) SELECT 210, id_shop, price, active FROM ps_product_shop WHERE id_product = 50;
4.5 Clonar ps_stock_available
INSERT INTO ps_stock_available (id_product, id_product_attribute, id_shop, quantity) SELECT 210, 0, id_shop, quantity FROM ps_stock_available WHERE id_product = 50 AND id_product_attribute = 0;
4.6 Relacionar el producto clonado con la nueva categoría
INSERT INTO ps_category_product (id_category, id_product, position) VALUES (123, 210, 1);
Repetir esto para cada producto. Puedes automatizarlo con un script PHP o un procedimiento almacenado.
- Comparativa con otros métodos
Método | Ventajas | Inconvenientes |
SQL directo | Rápido, control total | Riesgo si no se manejan claves bien |
Back-office | Seguro, con validación | No permite clonar productos masivos |
Módulos externos | Interfaz amigable | Coste adicional, menor flexibilidad |
- Buenas prácticas
- Haz backup antes de comenzar
- Usa transacciones para rollback en caso de error
- Valida que los IDs generados coinciden correctamente
- No olvides regenerar friendly URLs si usas SEO
Conclusión
Clonar categorías y sus productos en PrestaShop mediante SQL permite ahorrar tiempo y escalar operaciones, especialmente en tiendas con catálogos amplios o frecuentes cambios estacionales. Aunque requiere cuidado con los IDs y las dependencias, una buena estructura y un enfoque paso a paso lo convierten en un recurso muy poderoso para desarrolladores y técnicos. Automatizar este tipo de tareas puede ser clave en entornos de alto volumen o multitienda.
RESUMEN TÉCNICO (TL;DR):
- Clonar categorías requiere copiar entradas en ps_category, ps_category_lang y ps_category_shop
- Para copiar productos, se duplican registros de ps_product y sus relaciones
- Es necesario reasignar el id_category_default y establecer nuevas relaciones con ps_category_product
- Puede automatizarse con SQL puro o PHP
CÓDIGO DESTACADO (APÉNDICE):
- Obtener productos de una categoría:
SELECT id_product FROM ps_category_product WHERE id_category = 12;
- Clonar un producto:
INSERT INTO ps_product (reference, price, id_category_default, date_add, date_upd) SELECT CONCAT(reference, '-CLON'), price, 123, NOW(), NOW() FROM ps_product WHERE id_product = 50;
- Asignar producto clonado a nueva categoría:
INSERT INTO ps_category_product (id_category, id_product, position) VALUES (123, 210, 1);