Script PHP para la importación de productos y categorías en Prestashop 1.6

Script PHP para importar productos de un fichero CSV a tu tienda Prestashop 1.6, automatizando el proceso de importación de productos desde la linea de comandos.

Script PHP para la importación de productos y categorías en Prestashop 1.6

Si tienes una tienda online, con el software de Prestashop 1.6, quizá te interese importar productos de un fichero CSV sin tener que abrir en tu navegador el Back Office de Prestashop y poder automatizar la importación de los productos con una tarea programada.

Prestashop 1.6 utiliza las bases de datos de MySQL para almacenar los productos y las referencias del producto a sus descripciones en varios idiomas, las categorías o subcategorías a las que pertenece y varias cosas más, por lo que hacer una importación del fichero actuando sobre las tablas MySQL puede ser una tarea muy complicada, además deberíamos encargarnos también de generar las imágenes y miniaturas.

La solución más sencilla es usar las funciones PHP que vienen con Prestashop 1.6

Vamos al meollo directamente:

Con este script llamamos a las funciones propias del importador de ficheros CSV que vienen con Prestashop 1.6 y conseguimos importar productos automáticamente desde la linea de comandos, por lo que ya es muy fácil que lo incorpores a una tarea programada, en linux a traves de cron o crontab, por ejemplo.

Lo primero que debemos hacer es modificar el controlador AdminImportController.php que se encuentra en /directorioTienda/controllers/admin

Haz una copia del controlador original y guardalo antes de meter la zarpa en el fichero, no vaya ha ser que te equivoques y no funcione la importación ni desde el backend 😉

En la linea 1801, puede variar el numero de linea en alguna subversión de Prestashop 1.6, encontrarás esto:

if (isset($product->image) && is_array($product->image) && count($product->image)) {

Justo encima de la linea arriba mencionada añades esta linea:

if (!is_array($product->image) ){ $product->image = explode($this->multiple_value_separator, $product->image);}

Ya tenemos modificado el importador para que las imágenes se importen correctamente, en el fichero CSV puedes indicar la ruta local de la imagen del producto o la URL a la imagen.

Yo primero descargo todas las imágenes de las urls que vienen en el fichero CSV del proveedor, así puedo descartar las que ya tengo o comprobar que la imagen se ha descargado bien, midiendo la longitud con una linea del tipo:

if (filesize(“referencia.jpg”) == 0) { echo “La imagen no se ha descargado bien”; }

Uso un wget desde la linea de comandos Linux para descargar las imágenes y las renombro a referencia.jpg para identificarla de forma unica de los demás productos, así que cuando falla una descarga se crea el fichero pero queda vacío y su longitud es cero, un ejemplo:

shell_exec (“wget http://URLqueVieneEnElCSV -O /directorioDondeGuardo/”. $ref .”.jpg >/dev/null 2>&1″); //PHP code

Los ejemplos son para Linux, recuerda que si usas un XAMPP sobre Windows deberas cambiar las barras / por \ cuando indiques directorios o no te va a funcionar, tampoco los comandos nativos de Linux, claro está.

Un fichero CSV es un fichero de texto en el que las columnas se separan por ; u otro caracter.

Para Prestashop es mejor usar como separador ; ya que la coma se usa para separar varios valores dentro de una columna.

Vamos a suponer que nuestro fichero.CSV tiene este formato:

Subcat, categoria; Nombre; descripcion; referencia; EAN13; peso; preciocoste; precioventa; ecotasa; fabricante; img

piensos,Animales; Pienso de primera; El pienso de bla bla…; 010; 1234567890123; 0.2; 9.01; 10.50; 0; Fab; /dir/img.jpg

Este script PHP importa los productos a Prestashop 1.6 automáticamente, como verás en la cabecera le decimos donde encontrar las funciones y opciones de configuración que tenemos en nuestra tienda, tal como está este script tiene que estar en el directorio adminxxxx de tu tienda y el fichero.CSV a importar el directorio adminxxx/import, recuerda cambiar fichero.csv por el nombre de tu fichero:

Descarga aquí el fichero autoimportPS16.php (zip)

Este es el código PHP que hay dentro del fichero:

<?php

// definimos la cabecera y el juego de caracteres
header(“Content-Type: text/html;charset=utf-8″);

// colocamos el directorio de adminxxxxx en la variable cogiendo el directorio donde está este script con getcwd
define(‘_PS_ADMIN_DIR_’, getcwd());

// incluimos los parametros que se definieron en la instalación
include(_PS_ADMIN_DIR_.’/../config/config.inc.php’);

// incluimos las funciones php de Prestashop que vamos a usar
include(_PS_ADMIN_DIR_.’/functions.php’);

// incluimos el script php que hace las importaciones de CSV de Prestashop
include_once ‘../controllers/admin/AdminImportController.php’;

// Configura bien los parametros:
//
// skip = numero de lineas a saltar, 1 para saltar los títulos de las columnas del csv
// forceIDs = 0 si queremos que los ponga Prestashop (recomendado) 1 si ponemos una columna con los números de id
// match_ref = 0 no usar la referencia como clave o 1 usarla como clave y hacer la referencia clave unica en mysql
// convert = lo dejamos vacio para usar el juego utf-8, el csv debe estar en este formato.
// entity = los dejamos a 1 , que es importar productos para Prestashop, 0 es importar categorías… etc.
// separator = el caracter de separacion de columnas del fichero.csv en nuestro caso ;
// multiple_value_separator’ = el caracter de separacion de varios valores dentro de una columna: ,
// iso_lang = el idioma del csv que vamos a importar en formato iso, para español : es
// ***
// En el array vamos poniendo por orden las columnas que tenemos en el CSV
// la 0 es las categorias, la 1 es el nombre, etc.. y asociamos el nombre de la variable de Prestashop
// para decirle que hay en ese numero de columna, es lo mismo que sale en la importacion desde el Back Office
//
// la lista de las variables:
//
// ‘no’ = ‘Ignore this column’
// ‘id’ = ‘ID’
// ‘active’ = ‘Active (0/1)’
// ‘name’ = ‘Name’
// ‘category’ = Categories (x,y,z…)
// ‘price_tex’ = Price tax excluded Aquí con poner uno de los 2 price basta, si lo ponemos sin iva incluido
// ‘price_tin’ = Price tax included calcula este que es con IVA incluido.
// ‘id_tax_rules_group’ = Tax rules ID
// ‘wholesale_price’ = Wholesale price
// ‘on_sale’ = ‘On sale (0/1)
// ‘reduction_price’ = Discount amount
// ‘reduction_percent’ = Discount percent
// ‘reduction_from’ = Discount from (yyyy-mm-dd)
// ‘reduction_to’ = Discount to (yyyy-mm-dd)
// ‘reference’ = Reference
// ‘supplier_reference’ = Supplier reference
// ‘supplier’ = Supplier
// ‘manufacturer’ = Manufacturer
// ‘ean13’ = EAN13
// ‘upc’ = UPC
// ‘ecotax’ = Ecotax
// ‘width’ = Width
// ‘height’ = Height
// ‘depth’ = Depth
// ‘weight’ = Weight
// ‘quantity’ = Quantity
// ‘minimal_quantity’ = Minimal quantity
// ‘visibility’ = Visibility
// ‘additional_shipping_cost’ = Additional shipping cost
// ‘unity’ = Unit for the unit price
// ‘unit_price’ = Unit price
// ‘description_short’ = Short description
// ‘description’ = Description
// ‘tags’ = Tags (x,y,z…)
// ‘meta_title’ = Meta title
// ‘meta_keywords’ = Meta keywords
// ‘meta_description’ = Meta description
// ‘link_rewrite’ = URL rewritten
// ‘available_now’ = Text when in stock
// ‘available_later’ = Text when backorder allowed
// ‘available_for_order’ = Available for order (0 = No, 1 = Yes)
// ‘available_date’ = Product availability date
// ‘date_add’ = Product creation date
// ‘show_price’ = Show price (0 = No, 1 = Yes)
// ‘image’ = Image URLs (x,y,z…)
// ‘delete_existing_images’ = Delete existing images (0 = No, 1 = Yes)’)
// ‘features’ = Feature (Name:Value:Position:Customized)
// ‘online_only’ = Available online only (0 = No, 1 = Yes)
// ‘condition’ = Condition
// ‘customizable’ = Customizable (0 = No, 1 = Yes)
// ‘uploadable_files’ = Uploadable files (0 = No, 1 = Yes)
// ‘text_fields’ = Text fields (0 = No, 1 = Yes)
// ‘out_of_stock’ = Action when out of stock
// ‘shop’ = tienda
//
// Puedes encontrarlas todas mirando el fichero AdminImportController.php
// vas añadiendo el numero de columna que tengas en tu csv y la variable que describe esa columna y pones
// todos los campos que quieras en el array, para el ejemplo CSV de arriba quedaría como ves abajo 0 => Categorias etc..
//

function loadProductsPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘1’,
‘csv’ => ‘fichero.csv’,
‘forceIDs’ => ‘0’,
‘match_ref’ => ‘1’,
‘convert’ => ”,
‘entity’ => ‘1’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘iso_lang’ => ‘es’,
‘import’ => ‘Importar datos CSV’,
‘type_value’ =>
array (

0 => ‘category’,
1 => ‘name’,
2 => ‘description_short’,
3 => ‘reference’,
4 => ‘ean13’,
5 => ‘weight’,
6 => ‘wholesale_price’,
7 => ‘price_tex’,
8 => ‘ecotax’,
9 => ‘manufacturer’,
10 => ‘image’,

),
);
}

$import = New AdminImportController();

loadProductsPost();

$import->productImport();
?>

Si necesitas importar Categorías el proceso es el mismo, pero cambian las variables y entity = 0;

El código sería como éste:

 

<?php

header(“Content-Type: text/html;charset=utf-8″);

define(‘_PS_ADMIN_DIR_’, getcwd());

include(_PS_ADMIN_DIR_.’/../config/config.inc.php’);

include(_PS_ADMIN_DIR_.’/functions.php’);

include_once ‘../controllers/admin/AdminImportController.php’;

function loadCategoriesPost() {
$_POST = array (
‘tab’ => ‘AdminImport’,
‘skip’ => ‘0’,
‘csv’ => ‘categorias.csv’,
‘forceIDs’ => ‘0’,
‘convert’ => ”,
‘entity’ => ‘0’,
‘separator’ => ‘;’,
‘multiple_value_separator’ => ‘,’,
‘iso_lang’ => ‘es’,
‘import’ => ‘Importar datos CSV’,
‘type_value’ =>
array (
0 => ‘id’,
1 => ‘active’,
2 => ‘name’,
3 => ‘parent’,
4 => ‘is_root_category’,
5 => ‘description’,
6 => ‘meta_title’,
7 => ‘meta_keywords’,
8 => ‘meta_description’,
9 => ‘link_rewrite’,
10 => ‘image’,
),
);
}

$import = New AdminImportController();

loadCategoriesPost();

$import->categoryImport();
?>

Happy script !

También te puede interesar :

Twitter cards en Prestashop para todos los productos automático gratis y fácil