🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Automatización de procesos en PrestaShop con scripts PHP y cron jobs

Actualizado el 4 de enero de 2026

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 /modules o /override si 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_once sin 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 encuentre config/config.inc.php y 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:

  1. Descarga el archivo CSV desde un servidor FTP o URL.
  2. Lo parsea y extrae referencia y cantidad.
  3. Busca el producto por referencia en PrestaShop.
  4. Actualiza StockAvailable para 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_attribute correcto. Usa StockAvailable::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.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel