Automatización de procesos en PrestaShop con scripts PHP y cron jobs
Bienvenido al mundo de la automatización de procesos en PrestaShop. Si gestionas una tienda online con un catálogo en crecimiento, sabes que tareas como la actualización de precios, la sincronización de stock o la limpieza de pedidos caducados pueden consumir horas cada semana. La solución no es contratar más personal, sino delegar en la máquina. En este artículo te voy a explicar cómo combinar scripts PHP con cron jobs para lograr una automatización PrestaShop sólida, eficiente y sin intervención manual.
¿Por qué automatizar con scripts PHP y cron jobs?
PrestaShop ya incluye un sistema de tareas programadas (cron jobs) a través de su módulo nativo CronJobs, pero su alcance es limitado. Para necesidades reales de negocio —como una gestión inventario en tiempo real, la importación masiva de productos desde un ERP o el envío de alertas de stock bajo— necesitas escribir tu propia lógica en PHP.
Un script PHP personalizado se ejecuta directamente en el núcleo de PrestaShop, accediendo a la base de datos, a las clases de objetos (Product, StockAvailable, Order, etc.) y a los hooks del sistema. Al combinarlo con un cron job, consigues que ese script se ejecute de forma periódica: cada hora, cada día a las 3 AM, o cada 5 minutos si es necesario.
[INFO] No confundas los cron jobs de PrestaShop con los cron jobs del sistema. Los primeros se gestionan desde el back office y usan el módulo oficial. Los segundos se definen en el servidor (crontab) y son mucho más potentes. Para automatización seria, siempre recomiendo crontab del sistema.
Preparando el entorno: requisitos técnicos
Antes de escribir una sola línea de código, asegúrate de que tu servidor cumple estos requisitos:
- PHP 7.4 o superior (PrestaShop 1.7 / 8.x recomienda PHP 8.0+).
- Acceso SSH al servidor para editar el crontab.
- Permisos de escritura en la carpeta
/moduleso/overridesi vas a crear un módulo personalizado. - CLI de PHP disponible (php-cli).
- Conocimiento básico de la estructura de PrestaShop:
_PS_ROOT_DIR_,Context::getContext(),Db::getInstance().
Estructura básica de un script PHP para PrestaShop
Un script PHP autónomo que se ejecuta desde la línea de comandos debe cargar el núcleo de PrestaShop para poder usar sus clases. Aquí tienes la plantilla mínima:
<?php
// script_automatizacion.php
// Ruta absoluta a la raíz de PrestaShop
define('_PS_ROOT_DIR_', dirname(__FILE__));
require_once _PS_ROOT_DIR_ . '/config/config.inc.php';
require_once _PS_ROOT_DIR_ . '/init.php';
// Forzar contexto de tienda por defecto (id_shop = 1)
Context::getContext()->shop = new Shop(1);
Shop::setContext(Shop::CONTEXT_SHOP, 1);
// A partir de aquí puedes usar todas las clases de PrestaShop
// Ejemplo: obtener todos los productos activos
$products = Product::getProducts(Context::getContext()->language->id, 0, 0, 'id_product', 'ASC', true);
foreach ($products as $productData) {
$product = new Product($productData['id_product']);
// Tu lógica aquí
}
[WARNING] Nunca ejecutes un script PHP con
require_oncesin haber definido correctamente_PS_ROOT_DIR_. Si el script está en una subcarpeta, ajusta la ruta. Un error típico es que el script no encuentreconfig/config.inc.phpy falle en silencio.
Automatización de la gestión de inventario
La gestión inventario es, con diferencia, el proceso que más se beneficia de la automatización. Imagina que recibes un feed CSV de tu proveedor cada hora con el stock actualizado. En lugar de importarlo manualmente, creas un script PHP que:
- Descarga el archivo CSV desde un servidor FTP o URL.
- Lo parsea y extrae
referenciaycantidad. - Busca el producto por referencia en PrestaShop.
- Actualiza
StockAvailablepara el producto y combinaciones.
Script de ejemplo: actualización masiva de stock desde CSV
<?php
// actualizar_stock.php
define('_PS_ROOT_DIR_', dirname(__FILE__));
require_once _PS_ROOT_DIR_ . '/config/config.inc.php';
require_once _PS_ROOT_DIR_ . '/init.php';
Context::getContext()->shop = new Shop(1);
Shop::setContext(Shop::CONTEXT_SHOP, 1);
$csvUrl = 'https://ejemplo.com/stock_actualizado.csv';
$csvContent = file_get_contents($csvUrl);
if ($csvContent === false) {
die('Error al descargar el CSV');
}
$lines = explode("\n", $csvContent);
array_shift($lines); // quitar cabecera
foreach ($lines as $line) {
if (empty(trim($line))) continue;
list($reference, $quantity) = str_getcsv($line, ';');
$productId = Product::getIdByReference($reference);
if (!$productId) {
echo "Producto con referencia $reference no encontrado.\n";
continue;
}
// Actualizar stock principal
StockAvailable::setQuantity($productId, 0, (int)$quantity);
echo "Stock actualizado para $reference: $quantity unidades.\n";
}
echo "Proceso completado.";
Este script lo puedes ejecutar manualmente con php actualizar_stock.php o programarlo con un cron job.
[TIP] Para tiendas con combinaciones (tallas, colores), necesitas obtener el
id_product_attributecorrecto. UsaStockAvailable::getStockAvailableIdByProductId()y actualiza cada combinación por separado.
Programando la ejecución con cron jobs
Un cron job es una instrucción que le dice al sistema operativo que ejecute un comando en un momento determinado. La sintaxis básica es:
minuto hora día-del-mes mes día-de-la-semana comando
Ejemplos prácticos
Actualizar stock cada hora en punto:
0 * * * * php /ruta/absoluta/a/actualizar_stock.php >> /var/log/prestashop_stock.log 2>&1
Limpiar pedidos caducados (estado "Pendiente" > 7 días) cada noche a las 3 AM:
0 3 * * * php /ruta/absoluta/a/limpiar_pedidos.php >> /var/log/prestashop_cleanup.log 2>&1
Enviar informe semanal de ventas cada lunes a las 8 AM:
0 8 * * 1 php /ruta/absoluta/a/informe_semanal.php | mail -s "Informe semanal" admin@tutienda.com
[WARNING] Siempre redirige la salida estándar y de error a un archivo de log (
>> archivo.log 2>&1). Si no lo haces, el cron job fallará en silencio y no sabrás por qué. Además, usa rutas absolutas para el intérprete PHP y los scripts.
Cómo editar el crontab
Accede por SSH a tu servidor y ejecuta:
crontab -e
Se abrirá un editor (normalmente nano o vi). Añade tus líneas al final y guarda. Para verificar que se ha instalado correctamente:
crontab -l
Automatización PrestaShop más allá del stock
La gestión inventario es solo el principio. Con scripts PHP y cron jobs puedes automatizar casi cualquier proceso:
- Sincronización de precios desde un ERP o API externa.
- Generación y envío de facturas en lote.
- Exportación de pedidos a un sistema de contabilidad.
- Limpieza de carritos abandonados y envío de emails recordatorios.
- Actualización de imágenes de producto desde un CDN.
- Reindexación nocturna del motor de búsqueda (search index).
- Copia de seguridad de la base de datos antes de cada actualización.
Buenas prácticas y consideraciones de seguridad
La automatización con scripts PHP conlleva riesgos si no se implementa correctamente. Sigue estas reglas:
1. Aísla los scripts del acceso web
Nunca coloques tus scripts en la raíz pública de PrestaShop. Crea una carpeta fuera del public_html (por ejemplo, /home/usuario/scripts/) o dentro de /modules/tu_modulo/ pero protegida con .htaccess.
2. Usa logs detallados
Incluye en cada script un sistema de logging que registre fecha, hora, acción realizada y errores. Puedes usar error_log() o escribir en un archivo personalizado.
function logMsg($msg) {
file_put_contents(_PS_ROOT_DIR_ . '/var/logs/automatizacion.log', date('Y-m-d H:i:s') . ' - ' . $msg . "\n", FILE_APPEND);
}
3. Manejo de excepciones
Envuelve todo el bloque principal en un try-catch para evitar que un error fatal mate el script sin dejar rastro.
try {
// lógica principal
} catch (Exception $e) {
logMsg('ERROR: ' . $e->getMessage());
}
4. Prueba en un entorno de staging
Antes de lanzar un cron job en producción, ejecuta el script manualmente en un clon de tu tienda. Un error en la actualización de stock puede dejar tu tienda con datos incorrectos.
5. Control de concurrencia
Si tu cron job se ejecuta cada 5 minutos y el script tarda 10 minutos en completarse, se solaparán dos instancias. Usa un archivo de bloqueo (lock file) para evitarlo:
$lockFile = _PS_ROOT_DIR_ . '/var/locks/actualizar_stock.lock';
if (file_exists($lockFile)) {
$age = time() - filemtime($lockFile);
if ($age < 3600) { // si el lock tiene menos de 1 hora, salir
die('Ya hay una instancia ejecutándose.');
}
}
touch($lockFile);
// ... lógica ...
unlink($lockFile);
Ejemplo completo: limpieza de pedidos en estado "Pago pendiente"
Voy a mostrarte un script completo que puedes usar directamente (ajustando el ID del estado de pedido según tu tienda).
<?php
// limpiar_pedidos_pendientes.php
define('_PS_ROOT_DIR_', dirname(__FILE__));
require_once _PS_ROOT_DIR_ . '/config/config.inc.php';
require_once _PS_ROOT_DIR_ . '/init.php';
Context::getContext()->shop = new Shop(1);
Shop::setContext(Shop::CONTEXT_SHOP, 1);
define('ESTADO_PENDIENTE', 3); // ID del estado "Pago pendiente" en tu PrestaShop
define('DIAS_MAXIMOS', 7);
$logFile = _PS_ROOT_DIR_ . '/var/logs/limpieza_pedidos.log';
try {
$fechaLimite = date('Y-m-d H:i:s', strtotime("-" . DIAS_MAXIMOS . " days"));
$pedidos = Order::getOrdersByStatus(ESTADO_PENDIENTE);
$contador = 0;
foreach ($pedidos as $pedidoData) {
$pedido = new Order($pedidoData['id_order']);
if (strtotime($pedido->date_add) < strtotime($fechaLimite)) {
// Cambiar estado a "Cancelado" (ID 6 normalmente)
$pedido->setCurrentState(6);
$contador++;
file_put_contents($logFile, date('Y-m-d H:i:s') . " - Pedido {$pedido->id} cancelado.\n", FILE_APPEND);
}
}
file_put_contents($logFile, date('Y-m-d H:i:s') . " - Proceso completado. $contador pedidos cancelados.\n", FILE_APPEND);
echo "OK: $contador pedidos procesados.";
} catch (Exception $e) {
file_put_contents($logFile, date('Y-m-d H:i:s') . " - ERROR: " . $e->getMessage() . "\n", FILE_APPEND);
echo "ERROR: " . $e->getMessage();
}
Monitorización y mantenimiento
Una vez que tengas varios cron jobs funcionando, necesitas monitorizarlos. Algunas herramientas y técnicas:
- Revisa los logs periódicamente con
tail -f /var/log/prestashop_stock.log. - Configura alertas por email si un script falla. Puedes usar
mail()dentro del bloque catch. - Usa servicios externos como Healthchecks.io o Cronitor.io para que tu script envíe un ping cada vez que se ejecuta. Si no reciben el ping, te avisan.
- Programa un cron maestro que verifique que los demás scripts se han ejecutado en las últimas 24 horas.
Conclusión
La automatización PrestaShop mediante scripts PHP y cron jobs es una habilidad que separa a los administradores de tiendas eficientes del resto. Te permite liberar tiempo, reducir errores humanos y escalar operaciones sin aumentar la carga de trabajo manual. La gestión inventario es el caso de uso más inmediato, pero una vez que dominas la técnica, puedes automatizar casi cualquier proceso repetitivo de tu ecommerce.
Empieza con un script pequeño, pruébalo a fondo, programa un cron job y monitoriza los resultados. En pocas semanas, tu tienda funcionará como un reloj suizo, mientras tú te dedicas a lo que realmente importa: hacer crecer el negocio.
[INFO] Si prefieres no ensuciar la raíz de PrestaShop con scripts sueltos, crea un módulo personalizado que incluya los comandos de consola. PrestaShop 8.x soporta comandos Symfony, lo que permite integrar la automatización directamente en la arquitectura del sistema. Pero eso es material para otro artículo.
