Introduccion

A medida que una tienda PrestaShop crece, la cantidad de pedidos en la base de datos aumenta, lo que puede afectar el rendimiento del sitio y ralentizar las consultas. Para optimizar la base de datos y mejorar la velocidad, es útil eliminar pedidos antiguos o inactivos de manera segura utilizando SQL. En este artículo, te mostraremos cómo hacerlo correctamente, incluyendo ejemplos de consultas, validaciones y estrategias de respaldo.

1. Comprender la Relación de los Pedidos en la Base de Datos

Antes de eliminar pedidos, es importante conocer las tablas relacionadas en PrestaShop:

TablaPropósito
ps_ordersContiene los datos principales del pedido.
ps_order_detailGuarda los productos de cada pedido.
ps_cartRelaciona pedidos con carritos de compra.
ps_customerInformación del cliente que realizó el pedido.
ps_addressDirección de facturación y envío.
ps_order_historyHistorial de cambios en el estado del pedido.
ps_order_invoiceFacturas generadas para los pedidos.

Dado que los pedidos están interconectados con varias tablas, eliminarlos incorrectamente puede generar errores.

2. Realizar un Respaldo Antes de Eliminar Pedidos

Antes de proceder con cualquier eliminación, es fundamental hacer un respaldo de la base de datos para evitar pérdidas irreversibles:

mysqldump -u usuario -p nombre_base_datos > respaldo_pedidos.sql

Si necesitas restaurar los datos:

mysql -u usuario -p nombre_base_datos < respaldo_pedidos.sql

3. Identificar Pedidos Antiguos en PrestaShop

Para verificar cuántos pedidos antiguos hay en la base de datos, podemos ejecutar:

SELECT id_order, reference, date_add FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR;

Esto muestra todos los pedidos realizados hace más de un año. Puedes ajustar el intervalo según tus necesidades.

4. Eliminar Pedidos Antiguos en PrestaShop

4.1. Eliminar los Pedidos de la Tabla ps_orders

Para eliminar pedidos de hace más de un año:

DELETE FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR;

Sin embargo, esto dejaría registros huérfanos en otras tablas. Por lo tanto, debemos eliminar los datos relacionados.

5. Eliminar Pedidos y Todos sus Datos Relacionados

5.1. Eliminar Detalles del Pedido

DELETE FROM ps_order_detail WHERE id_order IN (
SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR
);

5.2. Eliminar Historial de Pedidos

DELETE FROM ps_order_history WHERE id_order IN (
SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR
);

5.3. Eliminar Facturas de Pedidos Antiguos

DELETE FROM ps_order_invoice WHERE id_order IN (
SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR
);

5.4. Eliminar Carritos Asociados a Pedidos Antiguos

DELETE FROM ps_cart WHERE id_cart IN (
SELECT id_cart FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR
);

5.5. Finalmente, Eliminar los Pedidos

DELETE FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR;

6. Optimizar la Base de Datos Después de la Eliminación

Después de eliminar registros, es recomendable optimizar las tablas afectadas para mejorar el rendimiento:

OPTIMIZE TABLE ps_orders, ps_order_detail, ps_order_history, ps_order_invoice, ps_cart;

Esto reorganiza los índices y libera espacio en la base de datos.

7. Comparación de Métodos para Eliminar Pedidos

MétodoVentajasDesventajas
Usar SQL directoRápido, eficiente y sin depender de módulos.Puede ser riesgoso si no se hace correctamente.
Usar un módulo de limpiezaInterfaz gráfica, sin necesidad de SQL.Puede ser costoso o menos eficiente.
Eliminar manualmente en el back-officeSeguro y sin riesgos.Lento y no viable para muchas órdenes.

El método SQL es el más eficiente cuando se maneja un gran volumen de pedidos.


8. Automatizar la Eliminación con un Script PHP

Para automatizar este proceso, podemos crear un script PHP que ejecute las consultas automáticamente:

<?php
require(dirname(__FILE__).'/config/config.inc.php');
Db::getInstance()->execute('DELETE FROM ps_order_detail WHERE id_order IN (SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR)');
Db::getInstance()->execute('DELETE FROM ps_order_history WHERE id_order IN (SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR)');
Db::getInstance()->execute('DELETE FROM ps_order_invoice WHERE id_order IN (SELECT id_order FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR)');
Db::getInstance()->execute('DELETE FROM ps_cart WHERE id_cart IN (SELECT id_cart FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR)');
Db::getInstance()->execute('DELETE FROM ps_orders WHERE date_add < NOW() - INTERVAL 1 YEAR');
Db::getInstance()->execute('OPTIMIZE TABLE ps_orders, ps_order_detail, ps_order_history, ps_order_invoice, ps_cart');
echo "Pedidos antiguos eliminados con éxito.";
?>

Guárdalo como eliminar_pedidos.php y ejecútalo:

php eliminar_pedidos.php

O bien, agrégalo a cron jobs para ejecutarlo periódicamente:

0 3 * * 1 php /ruta/del/script/eliminar_pedidos.php

Esto ejecutará el script cada lunes a las 3 AM.

Conclusión

Eliminar pedidos antiguos en PrestaShop mediante SQL es una estrategia efectiva para optimizar la base de datos y mejorar el rendimiento de la tienda. Siguiendo estas prácticas:

✅ Mantendrás tu base de datos ligera y rápida.

✅ Reducirás la carga en el servidor.

✅ Automatizarás el mantenimiento sin depender de módulos pagos.

Recuerda siempre hacer un respaldo antes de eliminar registros y probar las consultas en un entorno de prueba antes de aplicarlas en producción.

Ir al contenido