PrestaShop no es solo una carpeta llena de archivos. Es una aplicación con dos arquitecturas conviviendo —Symfony y el código legado—, una base de datos relacional, módulos, temas y un sistema de hooks. Saber dónde vive cada pieza te ahorra horas cuando toca mantener, depurar, actualizar o proteger una tienda.
Esta guía está pensada para PrestaShop 8 y 9, las versiones actuales. Si vienes de una instalación estándar, todo lo que verás aquí te resultará familiar.
Resumen rápido
- PrestaShop 8 y 9 combinan el núcleo moderno de Symfony (
src/,app/) con el código legado (classes/,controllers/). - Los puntos de extensión reales son
modules/,themes/y, con cuidado,override/. - La base de datos usa el prefijo
ps_por defecto y separa datos por idioma (_lang) y por tienda (_shop). - No se editan
vendor/,classes/,controllers/niconfig/sin una razón muy justificada y una copia de seguridad. - Después de tocar un módulo, un tema o una plantilla, limpia la caché antes de dar por hecho que algo no funciona.
1. Arquitectura general: Symfony, legado y MVC
En PrestaShop 8 y 9, la aplicación convive con dos mundos. Por un lado está el núcleo moderno, construido sobre Symfony, que gestiona cada vez más partes del back office y de la lógica de negocio. Por otro, sigue presente el código legado que durante años ha dado forma al front office, a los modelos de datos y a los controladores clásicos.
Entender esta convivencia es la clave para no perderte: no todo está en el mismo sitio, y no todo se modifica de la misma forma.
| Capa | Dónde vive | Para qué sirve |
|---|---|---|
| Núcleo moderno | src/, app/, templates/ | Lógica Symfony, bundle de PrestaShop, entidades Doctrine y plantillas Twig. |
| Núcleo legado | classes/, controllers/ | Modelos ObjectModel, utilidades, controladores clásicos de front y back. |
| Extensiones | modules/, themes/, override/ | Funcionalidad añadida, diseño y sobrescrituras de clases. |
| Configuración | app/config/, config/ | Parámetros, servicios, rutas y arranque de la aplicación. |
| Dependencias | vendor/ | Symfony, Doctrine, Guzzle y otras librerías instaladas con Composer. |
| Datos y archivos | MySQL, img/, download/, upload/ | Catálogo, pedidos, imágenes, descargables y archivos subidos. |
El patrón MVC sigue presente, pero repartido entre ambos mundos: los modelos pueden ser clases ObjectModel legacy o entidades Doctrine; las vistas pueden ser plantillas Smarty del tema o plantillas Twig de Symfony; y los controladores pueden ser clases legacy, controladores de módulo o controladores Symfony.
Versión: esta guía se centra en PrestaShop 8 y 9, las versiones actuales. Si tu tienda no está en ninguna de ellas, lo prioritario es planificar la migración.
2. Estructura de carpetas
Esta es la estructura típica de una instalación de PrestaShop. Algunas carpetas solo aparecen en el código fuente o en distribuciones de desarrollo, no en el ZIP de producción.
prestashop/
├── admin/ # Back office (se renombra al instalar)
├── app/ # Configuración, kernel y recursos Symfony
├── bin/ # Consola: bin/console
├── cache/ # Caché legacy (compatibilidad)
├── classes/ # Clases legacy: ObjectModel, Db, Helper...
├── config/ # Arranque y configuración
├── controllers/ # Controladores legacy (front y admin)
├── docs/ # Documentación (según distribución)
├── download/ # Productos descargables
├── img/ # Imágenes de catálogo, CMS, etc.
├── install/ # Instalador (eliminar o bloquear tras instalar)
├── js/ # JavaScript del núcleo
├── localization/ # Datos de localización
├── mails/ # Plantillas de correo
├── modules/ # Módulos
├── override/ # Sobrescrituras de clases
├── pdf/ # Plantillas de PDF
├── src/ # Núcleo moderno: Core, Adapter, PrestaShopBundle
├── templates/ # Plantillas Twig de los bundles Symfony
├── themes/ # Temas
├── translations/ # Traducciones
├── upload/ # Archivos subidos
├── var/ # Caché, logs y sesiones
├── vendor/ # Dependencias de Composer
├── webservice/ # Endpoint de la API
├── index.php # Punto de entrada del front
└── composer.json
En el código fuente también verás tests/, tests-legacy/, tools/ y travis-scripts/. Son carpetas de desarrollo y no forman parte del paquete de producción.
Importante: elimina o bloquea la carpeta install/ después de instalar. Renombra la carpeta de administración y no publiques su nombre. Y no edites vendor/ ni config/ salvo que sepas exactamente lo que estás haciendo.
3. admin/: el back office
La carpeta admin/ es la entrada al panel de administración. En una instalación desde ZIP, PrestaShop la renombra automáticamente para dificultar los ataques automatizados; en el código fuente aparece como admin-dev/. Dentro conviven el actualizador, las copias de seguridad generadas desde el panel, las exportaciones, el gestor de archivos, las importaciones y las plantillas de los temas del back office.
autoupgrade/: espacio de trabajo del módulo de actualización.backups/: copias de base de datos generadas desde el back office.export/eimport/: archivos de exportación e importación.filemanager/: gestor de archivos del panel.themes/: plantillas del back office, con los temasdefaultynew-theme.
Es una carpeta sensible. Protégela con autenticación adicional, restricción por IP o reglas de firewall, y no la incluyas en el archivo de rastreo de buscadores. PrestaShop no incluye autenticación en dos pasos de serie; si tu tienda es seria, añádela con un módulo de confianza.
Si sospechas que el panel ha sido comprometido, revisa empleados, perfiles, últimas conexiones y actividad reciente. Tienes una guía más detallada en Intrusiones en PrestaShop: análisis técnico y soluciones.
4. modules/: la funcionalidad
Cada módulo vive en su propia carpeta dentro de modules/: modules/mimodulo/. El nombre debe usar minúsculas y números; mejor evitar guiones bajos porque dan problemas con los dominios de traducción. Si quieres eliminar un módulo, lo correcto es desinstalarlo desde el back office, no borrar la carpeta a mano.
mimodulo/
├── config/ # Rutas y servicios
├── controllers/ # Controladores legacy
│ ├── admin/
│ └── front/
├── override/ # Sobrescrituras del módulo (evitar si se puede)
├── src/ # Clases modernas y controladores Symfony
├── translations/ # Traducciones
├── upgrade/ # Scripts de actualización
├── vendor/ # Dependencias del módulo
├── views/ # CSS, JS, imágenes y plantillas
│ ├── css/
│ ├── img/
│ ├── js/
│ └── templates/
├── config.xml # Metadatos del módulo
├── logo.png # Logo visible en el back office
└── mimodulo.php # Clase principal, extiende Module
| Carpeta o archivo | Para qué sirve |
|---|---|
mimodulo.php | Clase principal del módulo. Registra hooks, configuración y lógica de instalación. |
config/ | Rutas y servicios Symfony del módulo. |
controllers/ | Controladores legacy de front y back office. |
src/ | Clases modernas: entidades, formularios, grids y controladores Symfony. |
views/ | Plantillas, CSS, JavaScript e imágenes del módulo. |
translations/ | Traducciones del módulo. |
upgrade/ | Scripts que se ejecutan al actualizar el módulo. |
override/ | Sobrescrituras incluidas por el módulo. Potente y arriesgado. |
vendor/ | Dependencias instaladas con Composer. |
config.xml y logo.png | Metadatos y presentación en el marketplace/back office. |
Los módulos se conectan al núcleo mediante hooks. Algunos ejemplos habituales son hookDisplayHeader (añadir CSS o JavaScript), hookDisplayHome (contenido en la home), hookActionProductUpdate (reaccionar a cambios de producto) o hookDisplayFooter. Si un módulo necesita mostrar algo en una página, lo normal es que lo haga desde un hook, no modificando el tema.
Un módulo es también una puerta de entrada. Instala solo desde fuentes fiables, revisa el proveedor y mantén las actualizaciones al día. Si quieres ver un ejemplo práctico de módulo propio, tenemos una guía sobre cómo crear pop-ups en PrestaShop 8 y 9.
5. themes/: la capa visual
Todo lo que ve el cliente —plantillas, CSS, JavaScript, imágenes— vive en themes/<tema>/. El tema por defecto de PrestaShop 8 es Classic; a partir de ahí puedes instalar temas comerciales o crear un tema hijo.
themes/mitema/
├── _dev/ # Fuentes SCSS, JS e imágenes de desarrollo
├── assets/ # CSS, JS e imágenes compiladas
│ ├── css/
│ ├── img/
│ └── js/
├── config/
│ └── theme.yml # Configuración del tema
├── modules/ # Plantillas propias para módulos concretos
├── plugins/ # Plugins Smarty personalizados
├── templates/ # Plantillas del tema
│ ├── _partials/
│ ├── catalog/
│ ├── checkout/
│ ├── cms/
│ ├── customer/
│ ├── layouts/
│ ├── index.tpl
│ ├── page.tpl
│ └── wrapper.tpl
└── preview.png # Miniatura para el back office
El front clásico usa plantillas Smarty (.tpl); la parte Symfony y el back office usan Twig. Si tu tema es moderno, revisa su documentación porque puede mezclar ambas capas.
La recomendación es crear un tema hijo y sobrescribir solo las plantillas necesarias. Así puedes actualizar el tema padre sin perder cambios. No edites directamente el tema Classic ni un tema comercial: la siguiente actualización borrará tus ajustes.
Si necesitas un diseño a medida, en Solusen trabajamos con diseño de tiendas virtuales con PrestaShop y conocemos bien esta estructura.
6. override/: personalizar sin tocar el núcleo
La carpeta override/ permite sustituir clases del núcleo sin modificar los archivos originales. Es una herramienta potente, pero también una de las principales fuentes de problemas cuando se abusa de ella.
override/
├── classes/
│ └── Cart.php
├── controllers/
│ ├── admin/
│ └── front/
└── modules/
El archivo de sobrescritura debe replicar la ruta y el nombre de la clase original. Por ejemplo, para modificar Cart se crea override/classes/Cart.php con una clase que extiende CartCore:
class Cart extends CartCore
{
public function add()
{
// Lógica propia antes o después
return parent::add();
}
}
Antes de sobrescribir, busca un hook o un módulo. Si dos módulos sobrescriben la misma clase o el mismo método, el resultado depende del orden y puede romper la tienda. Las sobrescrituras también pueden quedar obsoletas tras una actualización del núcleo. En módulos distribuidos o de partner, las sobrescrituras están directamente desaconsejadas o prohibidas.
Si aun así necesitas una, documenta qué modifica, por qué y en qué versión. Después de crear o cambiar una sobrescritura, limpia la caché y comprueba que la clase se carga. Un error típico es Class not found por una ruta incorrecta o por una caché antigua.
7. app/, src/, templates/ y vendor/
Esta es la parte moderna de PrestaShop. Si vienes del PrestaShop clásico, aquí es donde más cambios vas a notar.
app/: contieneAppKernel.php, la configuración de Symfony (config/) y recursos. El archivoapp/config/parameters.phpguarda credenciales de base de datos y el prefijo de tablas; es sensible y no se edita a la ligera.src/: contiene el núcleo moderno, conCore,AdapteryPrestaShopBundle. Las entidades Doctrine suelen estar ensrc/PrestaShopBundle/Entity/.templates/: plantillas Twig de los bundles Symfony.vendor/: dependencias instaladas por Composer. No se modifica nunca; si necesitas un cambio, se hace en el código propio o se actualiza la dependencia.
La consola de Symfony está en bin/console. Algunos comandos útiles en un entorno de pruebas:
php bin/console cache:clear
php bin/console debug:router
php bin/console list
No ejecutes estos comandos en producción sin ventana de mantenimiento y copia de seguridad. Y no edites vendor/ para “parchear” algo: la siguiente actualización lo sobrescribirá.
8. var/, cache/ y config/
La carpeta var/ contiene caché, logs y sesiones. Es escribible por el servidor web y es la que más se toca de forma indirecta: cuando cambias una plantilla, un módulo o una configuración, PrestaShop necesita regenerar la caché.
var/cache/: caché de Symfony y de la aplicación. No la borres a mano si puedes usar el back office o la consola.var/logs/oapp/logs/según la versión: logs de la aplicación. También revisa los logs de PHP y del servidor web.cache/: carpeta heredada de versiones anteriores. Se mantiene por compatibilidad, pero la caché real está envar/.config/: archivos de arranque, definiciones y autoload. No se edita salvo necesidad justificada.
Para limpiar la caché, lo más seguro es usar el back office: Parámetros avanzados → Rendimiento → Vaciar caché. También puedes usar php bin/console cache:clear en un entorno controlado. Si borras carpetas a mano, puedes dejar permisos o archivos en un estado inconsistente.
Regla práctica: si un cambio no se ve, el 90% de las veces es caché. Si además hay un error 500, revisa el log antes de tocar nada más.
Permisos habituales: directorios 755, archivos 644, y escritura solo donde sea necesaria (var/, img/, upload/, download/). Evita 777 y propietarios incorrectos.
9. La base de datos
PrestaShop usa MySQL o MariaDB. El prefijo por defecto es ps_, aunque se puede cambiar durante la instalación. Ese prefijo se guarda en la configuración (app/config/parameters.php en PrestaShop 8 y 9). Si lo cambias después, tienes que actualizar la configuración y revisar módulos y copias de seguridad.
| Grupo | Tablas de ejemplo | Qué contienen |
|---|---|---|
| Catálogo | product, product_lang, product_shop, category, category_lang, manufacturer, supplier | Productos, categorías, marcas y proveedores. |
| Variantes y atributos | product_attribute, product_attribute_lang, attribute, attribute_group | Combinaciones, tallas, colores y grupos de atributos. |
| Precios, impuestos y stock | specific_price, tax, tax_rules_group, stock_available, stock, warehouse | Precios específicos, reglas de impuestos, stock y almacenes. |
| Clientes y pedidos | customer, address, cart, cart_product, orders, order_detail, order_state, order_history | Clientes, direcciones, carritos, pedidos e historial de estados. |
| Configuración y tienda | configuration, lang, shop, shop_url, currency, country, carrier | Configuración clave-valor, idiomas, multitienda, monedas, países y transportistas. |
| Módulos y hooks | module, module_shop, hook, hook_module, hook_module_exception | Módulos instalados, su relación con tiendas y su posición en los hooks. |
| CMS y SEO | cms, cms_lang, cms_category, meta, meta_lang | Páginas de contenido, categorías CMS y metadatos de URLs. |
| Seguridad y administración | employee, profile, access, log, connections, webservice_account | Empleados, perfiles, permisos, registros de actividad y claves de webservice. |
Dos convenciones importantes:
- Tablas
_lang: guardan los campos traducibles. Por ejemplo,productcontiene datos comunes yproduct_langcontiene el nombre y la descripción por idioma (id_lang). - Tablas
_shop: asocian una entidad a una tienda concreta en multitienda. Por ejemplo,product_shopguarda la relación producto-tienda. No todas las tablas tienen variante_shop.
Una consulta de lectura habitual para revisar catálogo y stock sería:
SELECT p.id_product, pl.name, p.price, sa.quantity
FROM ps_product p
JOIN ps_product_lang pl
ON pl.id_product = p.id_product
AND pl.id_lang = 1
LEFT JOIN ps_stock_available sa
ON sa.id_product = p.id_product
LIMIT 20;
Cambia el prefijo ps_ y el id_lang si tu tienda usa otro. Esta consulta es solo de lectura. Para modificar datos, usa las clases de PrestaShop, un módulo o los scripts de actualización; no edites tablas a mano salvo que sea una operación de auditoría controlada.
Nunca hagas cambios directos en la base de datos sin copia de seguridad y sin probar en un entorno de staging. Una consulta mal filtrada puede romper relaciones, pedidos o el catálogo. El esquema de referencia está en install/data/db_structure.sql (o install-dev/ en el código fuente); las entidades gestionadas por Doctrine están en src/PrestaShopBundle/Entity/.
Si necesitas leer el catálogo para exportarlo, tenemos una guía práctica sobre exportar productos de PrestaShop a Meta con un feed PHP.
10. Flujo de una petición
Cuando un cliente entra en la tienda, PrestaShop no carga todas las carpetas a la vez. Sigue un recorrido concreto. Entenderlo ayuda a depurar errores y a saber en qué capa buscar.
Petición del navegador
↓
index.php
↓
config/config.inc.php
↓
Dispatcher legacy / Symfony Kernel
↓
Controlador (legacy, módulo o Symfony)
↓
Hooks de módulos
↓
Plantilla Smarty / Twig
↓
Respuesta HTML
- Front office: entra por
index.php, se carga el bootstrap y se resuelve la ruta. Si es una página legacy, la gestiona un controlador decontrollers/front/o de un módulo. Si es moderna, la gestiona Symfony. - Back office: entra por la carpeta
admin/y se resuelve con controladores legacy o Symfony, con sus plantillas Twig correspondientes. - Hooks: los módulos se enganchan en puntos concretos del flujo. Ahí es donde suele estar la funcionalidad añadida: cabecera, home, ficha de producto, carrito, checkout, footer o eventos de negocio.
Para depurar, activa el modo debug solo en pruebas, revisa el log de la aplicación y el de PHP, y localiza primero el controlador y la plantilla que están respondiendo. Si el error aparece al instalar o actualizar un módulo, el problema suele estar en el propio módulo o en la caché, no en el núcleo.
11. Dónde tocar cada cosa
Esta tabla resume la decisión más importante: qué carpeta usar según lo que quieras cambiar.
| Quiero… | Dónde hacerlo |
|---|---|
| Cambiar el diseño, una plantilla o el CSS | Tema hijo en themes/<tema>/. No edites el tema padre. |
| Añadir una funcionalidad nueva | Módulo propio en modules/, usando hooks. |
| Modificar el comportamiento de una clase del núcleo | Primero busca un hook. Si no existe, override/ como último recurso. |
| Cambiar un email | mails/ o las plantillas del módulo/tema correspondiente. |
| Cambiar una traducción | Back office o archivos de translations/ del tema/módulo. |
| Cambiar una factura o albarán PDF | Plantillas de pdf/. |
| Cambiar una imagen del catálogo | Back office. Los archivos se guardan en img/; no los edites a mano. |
| Cambiar la conexión a base de datos | app/config/parameters.php, con copia de seguridad previa. |
| Limpiar la caché | Back office → Rendimiento, o php bin/console cache:clear. |
| Revisar un error | Logs de var/logs o app/logs, logs de PHP y del servidor web. |
| Actualizar PrestaShop | Módulo 1-Click Upgrade, entorno de pruebas y copia de seguridad. No lo hagas directamente en producción. |
12. Buenas prácticas y errores comunes
La estructura de PrestaShop está pensada para extenderse, no para modificarse a lo bruto. Estas son las reglas que evitan la mayoría de los problemas:
- Usa un tema hijo para los cambios visuales y un módulo propio para la lógica de negocio.
- Prefiere hooks y servicios antes que sobrescrituras de clases.
- No edites
vendor/,classes/,controllers/,src/niconfig/del núcleo. - Haz copia de seguridad de archivos y base de datos antes de cualquier cambio importante.
- Prueba en staging y verifica el proceso de compra después de cada actualización.
- Mantén actualizados el núcleo, los módulos, el tema y PHP.
- Renombra y protege la carpeta de administración; elimina o bloquea
install/. - Limpia la caché después de tocar plantillas, módulos o configuración.
- Revisa los logs antes de desactivar módulos a ciegas.
- Documenta cada sobrescritura y cada módulo propio: quién lo hizo, para qué y en qué versión.
| Síntoma | Causa probable | Solución |
|---|---|---|
| Los cambios no se ven | Caché de PrestaShop, del navegador o de la CDN | Vaciar caché, recompilar plantillas, recargar sin caché. |
Class not found tras un override | Ruta o nombre de clase incorrectos; caché antigua | Revisar la ruta en override/, limpiar caché y comprobar la clase. |
| Error 500 tras editar configuración | Error de sintaxis o credenciales incorrectas | Restaurar la copia, revisar logs y deshacer el último cambio. |
| Un módulo no aparece | Carpeta mal nombrada, permisos o incompatibilidad | Nombre en minúsculas, permisos correctos, revisar logs y versión. |
| Las imágenes no se generan | Permisos en img/ o falta de GD | Revisar permisos y regenerar miniaturas desde el back office. |
| El override no se aplica | Conflicto con otro módulo o caché | Revisar el orden, limpiar caché y comprobar que la clase extiende la correcta. |
| La tienda va lenta tras un cambio | Caché desactivada, módulo pesado o consultas nuevas | Medir, revisar logs y desactivar el módulo sospechoso en staging. |
La seguridad también forma parte de la estructura. Una carpeta de administración expuesta, un módulo abandonado o un install/ accesible pueden arruinar el mejor diseño. Si sospechas de una intrusión, revisa nuestra guía sobre los ataques más habituales en PrestaShop y el servicio de recuperación de páginas hackeadas.
13. Preguntas frecuentes sobre la estructura de PrestaShop
¿Dónde se guardan los módulos en PrestaShop?
En modules/<nombre-del-modulo>/. Cada módulo tiene su propia carpeta con la clase principal, controladores, vistas, traducciones y, si aplica, scripts de actualización. Para eliminarlo correctamente, desinstálalo desde el back office.
¿Dónde se cambia el diseño de la tienda?
En el tema activo, dentro de themes/<tema>/. Lo recomendable es crear un tema hijo y sobrescribir solo las plantillas, CSS o JavaScript necesarios. No edites el tema padre ni el tema Classic directamente.
¿Qué es la carpeta override y cuándo usarla?
Es la carpeta que permite sustituir clases del núcleo sin modificar los archivos originales. Úsala solo cuando no exista un hook o un módulo que resuelva el problema, y documenta el cambio. Las sobrescrituras pueden entrar en conflicto con otros módulos y complicar las actualizaciones.
¿Qué tablas guardan los productos y las combinaciones?
Los datos base están en ps_product, las traducciones en ps_product_lang, la relación con tiendas en ps_product_shop y las combinaciones en ps_product_attribute y ps_product_attribute_lang. Los atributos se organizan en ps_attribute y ps_attribute_group.
¿Puedo cambiar el prefijo ps_ de las tablas?
Sí, se puede definir otro prefijo durante la instalación. Cambiarlo después es arriesgado: hay que actualizar la configuración, revisar módulos y comprobar todas las consultas y copias de seguridad. Si no hay una razón fuerte, déjalo como está.
¿Qué carpeta debo eliminar después de instalar PrestaShop?
La carpeta install/. Elimínala o bloquéala cuando termines la instalación. También conviene renombrar la carpeta de administración y protegerla con autenticación adicional o restricción por IP.
¿Cómo limpio la caché de PrestaShop?
Desde el back office: Parámetros avanzados → Rendimiento → Vaciar caché. En un entorno controlado también puedes usar php bin/console cache:clear. Evita borrar carpetas a mano si puedes usar la vía oficial.
14. Conclusión
Conocer la estructura de PrestaShop no es un ejercicio académico. Es lo que te permite saber dónde tocar sin romper nada, por qué un módulo no se ve, qué tabla guarda cada dato y cómo actuar cuando la tienda se comporta de forma extraña. La regla de oro es sencilla: extiende antes de modificar, prueba antes de publicar y haz copia antes de tocar.
Si tu tienda PrestaShop necesita mantenimiento, una revisión de seguridad o una migración, podemos ayudarte.
¿Necesitas ayuda con tu PrestaShop?
Revisamos la estructura, el mantenimiento, el rendimiento y la seguridad de tu tienda. También te acompañamos en la migración a PrestaShop 8 o 9.
Documentación oficial de PrestaShop:
File structure · Database structure · Module file structure · Theme organization
