Índice
1. Estructura de asignación producto-categoría en PrestaShop
2. Consultar asignaciones actuales
3. Eliminar asignaciones existentes
4. Asignar productos a una nueva categoría masivamente
5. Cambiar la categoría por defecto del producto
6. Validar asignaciones tras la modificación
Introduccion
En tiendas PrestaShop con catálogos grandes, reorganizar la asignación de productos a categorías puede ser una necesidad habitual: cambios de temporada, migraciones, actualizaciones de estructura o simplemente mejoras SEO. Hacerlo manualmente desde el back-office puede ser inviable cuando hablamos de cientos o miles de productos.
Este artículo explora cómo realizar esa tarea de forma masiva y controlada directamente desde MySQL, con ejemplos prácticos, validaciones y automatizaciones.
- Estructura de asignación producto-categoría en PrestaShop
PrestaShop utiliza una tabla específica para relacionar productos con categorías:
Tabla | Descripción |
ps_category_product | Relación entre productos y sus categorías |
Cada fila indica que un producto pertenece a una categoría concreta.
Campos clave:
- id_category
- id_product
- position
Además, en ps_product hay un campo:
- id_category_default → la categoría por defecto del producto (la que se usa en URLs)
- Consultar asignaciones actuales
Productos de una categoría concreta
SELECT p.id_product, p.reference, cp.id_category
FROM ps_product p
JOIN ps_category_product cp ON p.id_product = cp.id_product
WHERE cp.id_category = 5;
Categorías asignadas a un producto
SELECT id_category FROM ps_category_product WHERE id_product = 101;
- Eliminar asignaciones existentes
Eliminar todas las categorías de un producto
DELETE FROM ps_category_product WHERE id_product = 101;
Eliminar productos de una categoría concreta
DELETE FROM ps_category_product WHERE id_category = 5;
Precaución: No eliminar sin respaldo previo si tienes categorías compartidas entre productos.
- Asignar productos a una nueva categoría masivamente
Asignar productos por ID a una categoría
INSERT INTO ps_category_product (id_category, id_product, position)
SELECT 10, id_product, 0 FROM ps_product WHERE id_product BETWEEN 200 AND 250;
Esto asigna 51 productos a la categoría 10.
Asignar productos por proveedor
INSERT INTO ps_category_product (id_category, id_product, position)
SELECT 8, p.id_product, 0
FROM ps_product p
JOIN ps_product_supplier s ON p.id_product = s.id_product
WHERE s.id_supplier = 2;
- Cambiar la categoría por defecto del producto
UPDATE ps_product
SET id_category_default = 10
WHERE id_product BETWEEN 200 AND 250;
Es recomendable que esta categoría también esté en ps_category_product.
- Validar asignaciones tras la modificación
Verificar productos en nueva categoría
SELECT id_product FROM ps_category_product WHERE id_category = 10;
Verificar si coinciden con la categoría por defecto
SELECT id_product, id_category_default
FROM ps_product
WHERE id_category_default = 10;
- Comparativa de métodos
Método | Ventajas | Inconvenientes |
SQL directo | Rápido, flexible, masivo | Riesgo si se ejecuta sin validaciones |
Back-office | Seguro, validado | Muy lento en grandes catálogos |
Módulo externo | Interfaz amigable | Dependencia externa, posible coste |
- Automatización con script PHP
<?php
require(dirname(__FILE__).’/config/config.inc.php’);
require(dirname(__FILE__).’/init.php’);
$sql = ‘INSERT INTO ps_category_product (id_category, id_product, position)
SELECT 15, id_product, 0 FROM ps_product WHERE id_supplier = 2′;
Db::getInstance()->execute($sql);
$sql2 = ‘UPDATE ps_product SET id_category_default = 15 WHERE id_supplier = 2’;
Db::getInstance()->execute($sql2);
echo «Asignación de productos a categoría completada.»;
?>
Apéndice de consultas clave
- Eliminar categorías de un producto:
DELETE FROM ps_category_product WHERE id_product = 101;
- Asignar productos por rango de IDs:
INSERT INTO ps_category_product (id_category, id_product, position) SELECT 10, id_product, 0 FROM ps_product WHERE id_product BETWEEN 200 AND 250;
- Cambiar categoría por defecto:
UPDATE ps_product SET id_category_default = 10 WHERE id_product = 101;
Conclusión
Modificar la asignación de productos a categorías desde MySQL es una acción potente que permite reorganizar el catálogo de forma escalable. Bien aplicado, este enfoque agiliza tareas de limpieza, estacionalidad o migración, sin depender de procesos manuales o interfaces lentas.
Al combinarlo con validaciones, automatización PHP y buenas prácticas, se convierte en una herramienta fundamental para desarrolladores y técnicos que gestionan tiendas PrestaShop de alto tráfico o gran volumen.