Remettre Prestashop à neuf

Procédure de migration SQL pour Prestashop

Vous voulez mettre votre boutique sous Prestashop à neuf de manière radicale?

Procédure utilisable lors d’une migration d’une vieille version de Prestashop vers une nouvelle…

Suite à un hack et une modification de vos fichiers sources ou bien suite à de mauvaises manipulations.

Cette procédure reste d’actualité si vous voulez passer de Prestashop 1,6 vers Prestashop 1,7.

Pré-requis :

  • Effectuer un back-up du FTP et de la base de données,
  • Mettre le site en maintenance,
  • Avoir les accès au serveur FTP et à phpMyAdmin à porté de doigts.
  • Copier et garder à disposition la COOKIE_KEY (présente dans le fichier /config/settings.inc.php. 

Mettrez à jour votre base de données

Sur le site original, il faut mettre la base de données à jour. Pour cela, il suffit d’utiliser OneClickUpgrade et de suivre les instructions.

Exporter les tables suivantes :

Avec PhpMyAdmin, il faut exporter les tables contenant les données nécessaires.

Attention, vous êtes responsable de votre base de données, cliquez ici pour découvrir comment sauvegarder votre site (METTRE LE LIEN VERS L’ARTICLE).

Customers :

  • ps_address
  • ps_customer
  • ps_customer_group
  • ps_customer_message
  • ps_customer_thread
  • ps_message
  • ps_message_readed

CMS :

  • ps_cms
  • ps_cms_block
  • ps_cms_block_lang
  • ps_cms_block_page
  • ps_cms_block_shop
  • ps_cms_category
  • ps_cms_category_lang
  • ps_cms_category_shop
  • ps_cms_lang
  • ps_cms_role
  • ps_cms_role_lang
  • ps_cms_shop

Products :

Les attributs :

  • ps_attribute
  • ps_attribute_group
  • ps_attribute_group_lang
  • ps_attribute_group_shop
  • ps_attribute_impact
  • ps_attribute_lang
  • ps_attribute_shop

Les catégories :

  • ps_category
  • ps_category_group
  • ps_category_lang
  • ps_category_product
  • ps_category_shop

Les produits :

  • ps_product
  • ps_product_attachment
  • ps_product_attribute
  • ps_product_attribute_combination
  • ps_product_attribute_image
  • ps_product_attribute_shop
  • ps_product_carrier
  • ps_product_country_tax
  • ps_product_download
  • ps_product_group_reduction_cache
  • ps_product_lang
  • ps_product_sale
  • ps_product_shop
  • ps_product_supplier
  • ps_product_tag

Le stock :

  • ps_stock
  • ps_stock_available
  • ps_stock_mvt
  • ps_stock_mvt_reason
  • ps_stock_mvt_reason_lang

Orders :

Les paniers :

  • ps_cart
  • ps_cart_cart_rule
  • ps_cart_product
  • ps_cart_rule
  • ps_cart_rule_country
  • ps_cart_rule_lang

Les commandes:

  • ps_orders
  • ps_order_carrier
  • ps_order_cart_rule
  • ps_order_detail
  • ps_order_detail_tax
  • ps_order_history
  • ps_order_invoice
  • ps_order_invoice_payment
  • ps_order_invoice_tax
  • ps_order_payment

Taxes/Carriers :

Les transporteurs :

  • ps_carrier
  • ps_carrier_group
  • ps_carrier_lang
  • ps_carrier_shop
  • ps_carrier_tax_rules_group_shop
  • ps_carrier_zone
  • ps_range_price
  • ps_range_weight

Les taxes :

  • ps_tax
  • ps_tax_lang
  • ps_tax_rule
  • ps_tax_rules_group
  • ps_tax_rules_group_shop

Faites une nouvelle installation de Prestashop

Après avoir exporté les tables, il faut une nouvelle base de données.

Installez un Prestashop neuf après avoir supprimé l’ancien du serveur FTP ainsi que l’ancienne base de données (avoir effectué une sauvegarde avant).

Après avoir installé la nouvelle version de PrestaShop, pensez à :

  • Mettre le site en maintenance,
  • Activer le mode « debug »,
  • Désactiver le cache,
  • Forcer la compilation Smarty.

Supprimer les tables correspondantes aux tables à importer dans la nouvelle base de données

Supprimez les tables correspondantes aux tables à importer.  Reprenez la liste des tables que vous avez exportées et les supprimer. Cela permet d’importer vos tables originales.

Voici donc la requête SQL à envoyer (attention, celle-ci est irréversible)

				
					DROP TABLE IF EXISTS ps_address;
DROP TABLE IF EXISTS ps_attribute;
DROP TABLE IF EXISTS ps_attribute_group;
DROP TABLE IF EXISTS ps_attribute_group_lang;
DROP TABLE IF EXISTS ps_attribute_group_shop;
DROP TABLE IF EXISTS ps_attribute_impact;
DROP TABLE IF EXISTS ps_attribute_lang;
DROP TABLE IF EXISTS ps_attribute_shop;
DROP TABLE IF EXISTS ps_carrier;
DROP TABLE IF EXISTS ps_carrier_group;
DROP TABLE IF EXISTS ps_carrier_lang;
DROP TABLE IF EXISTS ps_carrier_shop;
DROP TABLE IF EXISTS ps_carrier_tax_rules_group_shop;
DROP TABLE IF EXISTS ps_carrier_zone;
DROP TABLE IF EXISTS ps_cart;
DROP TABLE IF EXISTS ps_cart_cart_rule;
DROP TABLE IF EXISTS ps_cart_product;
DROP TABLE IF EXISTS ps_cart_rule;
DROP TABLE IF EXISTS ps_cart_rule_country;
DROP TABLE IF EXISTS ps_cart_rule_lang;
DROP TABLE IF EXISTS ps_cart_rule_product_rule;
DROP TABLE IF EXISTS ps_cart_rule_product_rule_group;
DROP TABLE IF EXISTS ps_cart_rule_product_rule_value;
DROP TABLE IF EXISTS ps_cart_rule_shop;
DROP TABLE IF EXISTS ps_category;
DROP TABLE IF EXISTS ps_category_group;
DROP TABLE IF EXISTS ps_category_lang;
DROP TABLE IF EXISTS ps_category_product;
DROP TABLE IF EXISTS ps_category_shop;
DROP TABLE IF EXISTS ps_customer;
DROP TABLE IF EXISTS ps_customer_group;
DROP TABLE IF EXISTS ps_customer_message;
DROP TABLE IF EXISTS ps_customer_thread;
DROP TABLE IF EXISTS ps_manufacturer;
DROP TABLE IF EXISTS ps_manufacturer_lang;
DROP TABLE IF EXISTS ps_manufacturer_shop;
DROP TABLE IF EXISTS ps_message;
DROP TABLE IF EXISTS ps_message_readed;
DROP TABLE IF EXISTS ps_order_carrier;
DROP TABLE IF EXISTS ps_order_cart_rule;
DROP TABLE IF EXISTS ps_order_detail;
DROP TABLE IF EXISTS ps_order_detail_tax;
DROP TABLE IF EXISTS ps_order_history;
DROP TABLE IF EXISTS ps_order_invoice;
DROP TABLE IF EXISTS ps_order_invoice_payment;
DROP TABLE IF EXISTS ps_order_invoice_tax;
DROP TABLE IF EXISTS ps_order_payment;
DROP TABLE IF EXISTS ps_orders;
DROP TABLE IF EXISTS ps_product;
DROP TABLE IF EXISTS ps_product_attachment;
DROP TABLE IF EXISTS ps_product_attribute;
DROP TABLE IF EXISTS ps_product_attribute_combination;
DROP TABLE IF EXISTS ps_product_attribute_image;
DROP TABLE IF EXISTS ps_product_attribute_shop;
DROP TABLE IF EXISTS ps_product_carrier;
DROP TABLE IF EXISTS ps_product_country_tax;
DROP TABLE IF EXISTS ps_product_download;
DROP TABLE IF EXISTS ps_product_group_reduction_cache;
DROP TABLE IF EXISTS ps_product_lang;
DROP TABLE IF EXISTS ps_product_sale;
DROP TABLE IF EXISTS ps_product_shop;
DROP TABLE IF EXISTS ps_product_supplier;
DROP TABLE IF EXISTS ps_product_tag;
DROP TABLE IF EXISTS ps_range_price;
DROP TABLE IF EXISTS ps_range_weight;
DROP TABLE IF EXISTS ps_stock;
DROP TABLE IF EXISTS ps_stock_available;
DROP TABLE IF EXISTS ps_stock_mvt;
DROP TABLE IF EXISTS ps_stock_mvt_reason;
DROP TABLE IF EXISTS ps_stock_mvt_reason_lang;
DROP TABLE IF EXISTS ps_supplier;
DROP TABLE IF EXISTS ps_supplier_lang;
DROP TABLE IF EXISTS ps_supplier_shop;
DROP TABLE IF EXISTS ps_tax;
DROP TABLE IF EXISTS ps_tax_lang;
DROP TABLE IF EXISTS ps_tax_rule;
DROP TABLE IF EXISTS ps_tax_rules_group;
DROP TABLE IF EXISTS ps_tax_rules_group_shop;
				
			

Importez vos tables

Effectuer l’import des tables d’origine dans la nouvelle base de données.

Si vous avez changé le préfixe des tables, vous pouvez utiliser ces requêtes SQL :

				
					ALTER TABLE ps_address RENAME newprefix_address; 
ALTER TABLE ps_attribute RENAME newprefix_attribute; 
ALTER TABLE ps_attribute_group RENAME newprefix_attribute_group; 
ALTER TABLE ps_attribute_group_lang RENAME newprefix_attribute_group_lang; 
ALTER TABLE ps_attribute_group_shop RENAME newprefix_attribute_group_shop; 
ALTER TABLE ps_attribute_impact RENAME newprefix_attribute_impact; 
ALTER TABLE ps_attribute_lang RENAME newprefix_attribute_lang; 
ALTER TABLE ps_attribute_shop RENAME newprefix_attribute_shop; 
ALTER TABLE ps_carrier RENAME newprefix_carrier; 
ALTER TABLE ps_carrier_group RENAME newprefix_carrier_group; 
ALTER TABLE ps_carrier_lang RENAME newprefix_carrier_lang; 
ALTER TABLE ps_carrier_shop RENAME newprefix_carrier_shop; 
ALTER TABLE ps_carrier_tax_rules_group_shop RENAME newprefix_carrier_tax_rules_group_shop; 
ALTER TABLE ps_carrier_zone RENAME newprefix_carrier_zone; 
ALTER TABLE ps_cart RENAME newprefix_cart; 
ALTER TABLE ps_cart_cart_rule RENAME newprefix_cart_cart_rule; 
ALTER TABLE ps_cart_product RENAME newprefix_cart_product; 
ALTER TABLE ps_cart_rule RENAME newprefix_cart_rule; 
ALTER TABLE ps_cart_rule_country RENAME newprefix_cart_rule_country; 
ALTER TABLE ps_cart_rule_lang RENAME newprefix_cart_rule_lang; 
ALTER TABLE ps_cart_rule_product_rule RENAME newprefix_cart_rule_product_rule; 
ALTER TABLE ps_cart_rule_product_rule_group RENAME newprefix_cart_rule_product_rule_group; 
ALTER TABLE ps_cart_rule_product_rule_value RENAME newprefix_cart_rule_product_rule_value; 
ALTER TABLE ps_cart_rule_shop RENAME newprefix_cart_rule_shop; 
ALTER TABLE ps_category RENAME newprefix_category; 
ALTER TABLE ps_category_group RENAME newprefix_category_group; 
ALTER TABLE ps_category_lang RENAME newprefix_category_lang; 
ALTER TABLE ps_category_product RENAME newprefix_category_product; 
ALTER TABLE ps_category_shop RENAME newprefix_category_shop; 
ALTER TABLE ps_customer RENAME newprefix_customer; 
ALTER TABLE ps_customer_group RENAME newprefix_customer_group; 
ALTER TABLE ps_customer_message RENAME newprefix_customer_message; 
ALTER TABLE ps_customer_thread RENAME newprefix_customer_thread; 
ALTER TABLE ps_manufacturer RENAME newprefix_manufacturer; 
ALTER TABLE ps_manufacturer_lang RENAME newprefix_manufacturer_lang; 
ALTER TABLE ps_manufacturer_shop RENAME newprefix_manufacturer_shop; 
ALTER TABLE ps_message RENAME newprefix_message; 
ALTER TABLE ps_message_readed RENAME newprefix_message_readed; 
ALTER TABLE ps_order_carrier RENAME newprefix_order_carrier; 
ALTER TABLE ps_order_cart_rule RENAME newprefix_order_cart_rule; 
ALTER TABLE ps_order_detail RENAME newprefix_order_detail; 
ALTER TABLE ps_order_detail_tax RENAME newprefix_order_detail_tax; 
ALTER TABLE ps_order_history RENAME newprefix_order_history; 
ALTER TABLE ps_order_invoice RENAME newprefix_order_invoice; 
ALTER TABLE ps_order_invoice_payment RENAME newprefix_order_invoice_payment; 
ALTER TABLE ps_order_invoice_tax RENAME newprefix_order_invoice_tax; 
ALTER TABLE ps_order_payment RENAME newprefix_order_payment; 
ALTER TABLE ps_orders RENAME newprefix_orders; 
ALTER TABLE ps_product RENAME newprefix_product; 
ALTER TABLE ps_product_attachment RENAME newprefix_product_attachment; 
ALTER TABLE ps_product_attribute RENAME newprefix_product_attribute; 
ALTER TABLE ps_product_attribute_combination RENAME newprefix_product_attribute_combination; 
ALTER TABLE ps_product_attribute_image RENAME newprefix_product_attribute_image; 
ALTER TABLE ps_product_attribute_shop RENAME newprefix_product_attribute_shop; 
ALTER TABLE ps_product_carrier RENAME newprefix_product_carrier; 
ALTER TABLE ps_product_country_tax RENAME newprefix_product_country_tax; 
ALTER TABLE ps_product_download RENAME newprefix_product_download; 
ALTER TABLE ps_product_group_reduction_cache RENAME newprefix_product_group_reduction_cache; 
ALTER TABLE ps_product_lang RENAME newprefix_product_lang; 
ALTER TABLE ps_product_sale RENAME newprefix_product_sale; 
ALTER TABLE ps_product_shop RENAME newprefix_product_shop; 
ALTER TABLE ps_product_supplier RENAME newprefix_product_supplier; 
ALTER TABLE ps_product_tag RENAME newprefix_product_tag; 
ALTER TABLE ps_range_price RENAME newprefix_range_price; 
ALTER TABLE ps_range_weight RENAME newprefix_range_weight; 
ALTER TABLE ps_stock RENAME newprefix_stock; 
ALTER TABLE ps_stock_available RENAME newprefix_stock_available; 
ALTER TABLE ps_stock_mvt RENAME newprefix_stock_mvt; 
ALTER TABLE ps_stock_mvt_reason RENAME newprefix_stock_mvt_reason; 
ALTER TABLE ps_stock_mvt_reason_lang RENAME newprefix_stock_mvt_reason_lang; 
ALTER TABLE ps_supplier RENAME newprefix_supplier; 
ALTER TABLE ps_supplier_lang RENAME newprefix_supplier_lang; 
ALTER TABLE ps_supplier_shop RENAME newprefix_supplier_shop; 
ALTER TABLE ps_tax RENAME newprefix_tax; 
ALTER TABLE ps_tax_lang RENAME newprefix_tax_lang; 
ALTER TABLE ps_tax_rule RENAME newprefix_tax_rule; 
ALTER TABLE ps_tax_rules_group RENAME newprefix_tax_rules_group; 
ALTER TABLE ps_tax_rules_group_shop RENAME newprefix_tax_rules_group_shop;
				
			

Transférez la "COOKIE_KEY" sur le nouveau site

Dans le fichier config/settings.inc.php du site original se trouve une constante appelée COOKIE_KEY. Vous allez copier celle-ci et l’insérer dans le fichier config/settings.inc.php à la place de la nouvelle clé.

Cela permet à Prestashop de comparer correctement les mots de passe des clients qui ont été cryptés en MD5 avec la COOKIE_KEY de votre site original.

NB : Cette manipulation rend le compte administrateur inutilisable car ayant été crypté avec une nouvelle clé (celle de la nouvelle installation), votre mot de passe est maintenant en erreur. Pour corriger cela, il suffit de vous rendre sur la table ps_employee via phpMyAdmin, d’éditer l’entrée de votre compte, de copier la COOKIE_KEY dans le champ “password” et de la faire suivre directement avec votre nouveau mot de passe. Enregistrez et vous avez de nouveau accès à l’administration de votre site.

Importer le dossier img

Pour pouvoir afficher les images de votre site d’origine, il nous suffit de copier la totalité du dossier img/ sur la nouvelle installation. Il y a déjà un dossier de ce nom. Vous pouvez le renommer ou bien le compresser afin de l’avoir à disposition (ça peut servir).

Vérification du bon fonctionnement

Maintenant testez si le site fonctionne correctement.

Vous allez essayer de créer un compte, de passer une commande, de vous connecter avec un ancien compte pour vérifier que la COOKIE_KEY est bien en place.

Vous allez vérifier le bon fonctionnement du Back-Office.

Est-ce que vous voyez bien les anciennes commandes et tout les produits ?

Un problème que j’ai rencontré lors de cette procédure est un décalage entre l’ID de la catégorie principale (home) et l’ID de cette même catégorie sur la nouvelle installation. Le message d’erreur était “Root category must be an integer value”. La solution était alors de corriger l’ID de la catégorie principale dans la table “ps_shop”. Elle est à “2” sur les nouvelles installations de Prestashop mais dans notre cas  l’ID de la catégorie “home” était égale à “1”.

Et voila !!! 😀

Il ne reste plus qu’à désactiver le mode maintenance ainsi que le mode “debug” et à reprendre la production là où elle avait été laissée.

J’espère que ce tutoriel vous aura été utile. Si vous souhaitez que je m’occupe de cette mise à jour, contactez-moi !