Dziś pokażemy jak z grubsza przenieść dane w PrestaShop o całe 3 wersje do przodu. Czyli zupelnie pomijamy 1.5 i 1.6 🙂 Zadanie wydaje się dość karkołomne, ale jest do wykonania:)
Poradnik dotyczy dokładnie migracji z wersji PS 1.4.6.2 do PS 1.7.6.1. Zatem miej na uwadze, że struktura tabel w innych wersjach może się nieznacznie różnić.
Zawartość artykułu
Ustawienie prefixów tabel w MySQL
Przede wszystkim będziemy kopiować tabele po stronie MySQL. Pozwoli nam to na migrację nawet gigtantycznej ilości danych (kilkadziesiąt tys. produtków i wiecej). Po za prostotą – zapytania nie obciążają tak serwera i są nieprównywalnie szybsze niż import przez CSV..
W tym celu przyjmujemy podstawową zasadę:
- Prefix tabel MySQL w sklepie PS17 będzie mial postać: pr_
- Prefix tabel MySQL w sklepie PS14 będzie mial postać: ps_
Prefix – czyli „wstawka” którą zaczynają się nazwy tabel.
To kluczowe, ponieważ pozwoli nam na umieszczenie zrzutów baz z obu sklepów w 1 bazie danych MySQL i operowanie pomiędzy tabelami.
Dlatego w instalacji nowego sklepu PS17 zmień te prefixy w programie PhpMyAdmin, następnie uwzględnij tą zmianę w pliku:
app/config/parameters.php
Jeśli stary sklep PS14 nie ma prefixu ps_ tylko jakiś inny – odpowiednio go zmodyfikuj albo uwzględniaj to w poniższych zapytaniach.
Program PhpMyAdmin umożliwia łatwą podmianę prefixów:
Po tak przygotowanych prefixach, umieść zrzut starej bazy w bazie danych nowego sklepu. Poprzez zakładkę „Import” w PhpMyAdmin. Finalnie baza nowego sklepu musi mieć „swoje” tabele zaczynające się od „pr_” i „doklejone” tabele starego sklepu zaczynające się od „ps_”.
OK, zdaje się że jest to już jasne i możemy przystąpić do działania 🙂
Przygotowanie instalacji nowego sklepu.
Dobrze aby nowy sklep poza odp. ustawieniem prefixów – miał możliwość wyczyszczenia danych. Tzn. niech będzie to najlepiej czysta instalacja PS.
Uwaga ! Poniższe zapytania będą bezpowrotnie czyścić dane w nowym sklepie i miej to na uwadze 🙂
Języki
Dane będą powielane ze starego sklepu. Zatem, jeśli sklep posiada kilka języków – muszą one na nowym sklepie być założone z tymi samymi ID. Ewentualnie potem w zaimportowanych tabelach trzeba będzie odpowiednio te ID przestawić. NIestety ta druga opcja mimo, że trudniejsza w wykonaniu jest mniej pozbawiona błędów.
Przybliża to artykuł: https://pskrk.com/przeniesienie-kombinacji-produktow-ze-sklepu-w-wersji-1-4-do-najnowszej-1-6-1-2/#Przyklad_z_innymi_ID_jezykow
Import kont klientów i ich adresów.
Importujemy adresy:
TRUNCATE pr_address; INSERT INTO `pr_address`( `id_address` , `id_country` , `id_state` , `id_customer` , `id_manufacturer` , `id_supplier` , `alias` , `company` , `lastname` , `firstname` , `address1` , `address2` , `postcode` , `city` , `other` , `phone` , `phone_mobile` , `vat_number` , `dni` , `date_add` , `date_upd` , `active` , `deleted` ) SELECT `id_address` , `id_country` , `id_state` , `id_customer` , `id_manufacturer` , `id_supplier` , `alias` , `company` , `lastname` , `firstname` , `address1` , `address2` , `postcode` , `city` , `other` , `phone` , `phone_mobile` , `vat_number` , `dni` , `date_add` , `date_upd` , `active` , `deleted` FROM ps_address;
Jak widać na początku zapytań czyścimy tabele nowego sklepu poprzez polecenie TRUNCATE.
Import kont klientów:
TRUNCATE pr_customer; INSERT INTO `pr_customer`( `id_customer` , `id_gender` , `id_default_group` , `secure_key` , `note` , `email` , `passwd` , `last_passwd_gen` , `birthday` , `lastname` , `newsletter` , `ip_registration_newsletter` , `newsletter_date_add` , `optin` , `firstname` , `active` , `deleted` , `is_guest` , `date_add` , `date_upd` ) SELECT `id_customer` , `id_gender` , `id_default_group` , `secure_key` , `note` , `email` , `passwd` , `last_passwd_gen` , `birthday` , `lastname` , `newsletter` , `ip_registration_newsletter` , `newsletter_date_add` , `optin` , `firstname` , `active` , `deleted` , `is_guest` , `date_add` , `date_upd` FROM ps_customer;
Jeśli zapytanie zwróci błąd np. przez brak domyślnego języka dla klienta odp. zmodyfikuj strukturę tabeli i ustaw domyślną wartość. Np. dla języka będzie to:
ALTER TABLE `pr_customer` CHANGE `id_lang` `id_lang` INT(10) UNSIGNED NULL DEFAULT '3';
Strukturę (domyślne dane dla kolumn) mozna łatwo modyfikować poprzez PhpMyAdmin
Przeniesienie haseł klientów
Tutaj dochodzi kwestia haseł. Jak widać w zapytaniu importu wyżej – dokładnie kopiujemy wartość hash haseł klientów. Możesz spróbować dodać ten sam „cookie_key” w pliku:
app/config/parameters.php
Co „_COOKIE_KEY_” w pliku:
config/settings.inc.php
Może to pozwolić na zachowanie tych samych haseł klientów. Jednak nie jest to pewne i całkiem możliwe że będą musieli oni sobie ustwić nowe hasła. Kwestia do sprawdzenia.
Ustawienie grupy klienta.
Większość klientów będzie w grupie „Klient”. W PS17 id tej grupy to 3. Aby to przypisać użyj:
UPDATE `pr_customer` SET id_default_group = 3;
Dodatkowo wypełnij tebelę:
TRUNCATE pr_customer_group; ALTER TABLE `pr_customer_group` CHANGE `id_group` `id_group` INT(10) UNSIGNED NOT NULL DEFAULT '3'; INSERT INTO pr_customer_group (id_customer) SELECT (id_customer) FROM pr_customer;
W ten sposób wszyscy klienci będą klientami 🙂
Jeśli chcesz to rozgraniczyć na „gości” (w PS id tej grupy to domyślnie 2) to musisz odp. zmodyfikować te zapytania wg Twoich danych.
Przeniesienie kategorii
Ok jedziemy z asortymentem. To tak naprawdę podstawowe dane do przeniesienia.
Główna tabela kategorii:
TRUNCATE pr_category; INSERT INTO `pr_category`( `id_category` , `id_parent` , `level_depth` , `nleft` , `nright` , `active` , `date_add` , `date_upd` , `position` ) SELECT `id_category` , `id_parent` , `level_depth` , `nleft` , `nright` , `active` , `date_add` , `date_upd` , `position` FROM ps_category;
Grupy kategorii
TRUNCATE pr_category_group; INSERT INTO pr_category_group SELECT * FROM ps_category_group;
Tabele językowe kategorii:
TRUNCATE pr_category_lang; INSERT INTO pr_category_lang ( `id_category` , `id_lang` , `name` , `description` , `link_rewrite` , `meta_title` , `meta_keywords` , `meta_description` ) SELECT `id_category` , `id_lang` , `name` , `description` , `link_rewrite` , `meta_title` , `meta_keywords` , `meta_description` FROM ps_category_lang;
Tabela kategorii dla multistore.
Podobnie jak w przypadku produktów – patrz niżej po prostu ją sklonujemy narzucająć ID = 1 dla ID sklepu.
TRUNCATE pr_category_shop; INSERT INTO pr_category_shop ( `id_category` , `id_shop` , `position` ) SELECT `id_category` , 1 , `position` FROM pr_category;
Przeniesienie produktów.
Podstawowa tabela produktowa:
TRUNCATE pr_product; INSERT INTO `pr_product`( `id_product` , `id_supplier` , `id_manufacturer` , `id_tax_rules_group` , `id_category_default` , `on_sale` , `online_only` , `ean13` , `upc` , `ecotax` , `quantity` , `minimal_quantity` , `price` , `wholesale_price` , `unit_price_ratio` , `additional_shipping_cost` , `unity` , `reference` , `supplier_reference` , `location` , `width` , `height` , `depth` , `weight` , `out_of_stock` , `quantity_discount` , `customizable` , `uploadable_files` , `text_fields` , `active` , `available_for_order` , `condition` , `show_price` , `indexed` , `cache_is_pack` , `cache_has_attachments` , `cache_default_attribute` , `date_add` , `date_upd` ) SELECT `id_product` , `id_supplier` , `id_manufacturer` , `id_tax_rules_group` , `id_category_default` , `on_sale` , `online_only` , `ean13` , `upc` , `ecotax` , `quantity` , `minimal_quantity` , `price` , `wholesale_price` , `unit_price_ratio` , `additional_shipping_cost` , `unity` , `reference` , `supplier_reference` , `location` , `width` , `height` , `depth` , `weight` , `out_of_stock` , `quantity_discount` , `customizable` , `uploadable_files` , `text_fields` , `active` , `available_for_order` , `condition` , `show_price` , `indexed` , `cache_is_pack` , `cache_has_attachments` , `cache_default_attribute` , `date_add` , `date_upd` FROM ps_product;
Tabela bliźniacza produktowa (w zależnośc od ID sklepu) dla multistore:
W PS14 nikt nawet nie marzył o multistore więc po prostu ją sklonujemy z ID sklepu = 1. 🙂
TRUNCATE pr_product_shop; INSERT INTO `pr_product_shop`( `id_product` , `id_shop` , `id_category_default` , `id_tax_rules_group` , `on_sale` , `online_only` , `ecotax` , `minimal_quantity` , `low_stock_threshold` , `low_stock_alert` , `price` , `wholesale_price` , `unity` , `unit_price_ratio` , `additional_shipping_cost` , `customizable` , `uploadable_files` , `text_fields` , `active` , `redirect_type` , `id_type_redirected` , `available_for_order` , `available_date` , `show_condition` , `condition` , `show_price` , `indexed` , `visibility` , `cache_default_attribute` , `advanced_stock_management` , `date_add` , `date_upd` , `pack_stock_type` ) SELECT `id_product` , 1, `id_category_default` , `id_tax_rules_group` , `on_sale` , `online_only` , `ecotax` , `minimal_quantity` , `low_stock_threshold` , `low_stock_alert` , `price` , `wholesale_price` , `unity` , `unit_price_ratio` , `additional_shipping_cost` , `customizable` , `uploadable_files` , `text_fields` , `active` , `redirect_type` , `id_type_redirected` , `available_for_order` , `available_date` , `show_condition` , `condition` , `show_price` , `indexed` , `visibility` , `cache_default_attribute` , `advanced_stock_management` , `date_add` , `date_upd` , `pack_stock_type` FROM pr_product;
Tabela opisowa dla produktów:
TRUNCATE pr_product_lang; INSERT INTO `pr_product_lang`( `id_product`, `id_lang`, `description`, `description_short`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`, `available_now`, `available_later` ) SELECT `id_product`, `id_lang`, `description`, `description_short`, `link_rewrite`, `meta_description`, `meta_keywords`, `meta_title`, `name`, `available_now`, `available_later` FROM ps_product_lang;
Powiązanie produktów z kategoriami:
TRUNCATE pr_category_product; INSERT INTO pr_category_product SELECT * FROM ps_category_product;
Przeniesienie cech produktów
Tutaj pomocny może być artykuł:
Przeniesienie cech produktów ze sklepu PrestaShop w wersji 1.4.x do 1.6.x lub 1.7.x
TRUNCATE pr_feature_product; TRUNCATE pr_feature_value; TRUNCATE pr_feature_value_lang; INSERT INTO pr_feature_product SELECT * FROM ps_feature_product; INSERT INTO pr_feature_value SELECT * FROM ps_feature_value; INSERT INTO pr_feature_value_lang SELECT * FROM ps_feature_value_lang;
Tabele ze zdjęciami produktów – import
TRUNCATE pr_image; INSERT INTO pr_image SELECT * FROM ps_image; TRUNCATE pr_image_lang; INSERT INTO pr_image_lang SELECT * FROM ps_image_lang; ALTER TABLE `pr_image_shop` CHANGE `id_shop` `id_shop` INT(10) UNSIGNED NOT NULL DEFAULT '1'; TRUNCATE pr_image_shop; INSERT INTO `pr_image_shop`( `id_image` , `id_product` , `cover` ) SELECT `id_image` , `id_product` , `cover` FROM pr_image;
Przeniesienie grup atrybutów.
Jest to najbardziej problematyczny element, jednak do zrobienia. Prosimy o zapoznanie się najpierw z artykułem gdzie to bardziej przybliżyliśmy:
przeniesienie kombinacji produktów ze sklepu w wersji 1.3-1.4 do 1.6.x [AKTUALIZACJA]
Należy tutaj uważać, ponieważ w wersji PS14 dane są nieco odmiennie składowane i często można natrafić na problemy. Szczególnie z duplikatami kluczy.
W każdym razie spróbuj zrealizować te polecenia celem importu danych.
Tabela łącząca produkty z atrybutami:
Przed importem jest konieczna modyfikacja struktury starej tabeli:
ALTER TABLE `ps_product_attribute` CHANGE `default_on` `default_on` TINYINT(1) UNSIGNED NULL DEFAULT '0'; UPDATE `ps_product_attribute` SET `default_on` = NULL WHERE `default_on` = 0;
Import:
TRUNCATE pr_product_attribute; INSERT INTO `pr_product_attribute`( `id_product_attribute` , `id_product` , `reference` , `supplier_reference` , `location` , `ean13` , `upc` , `wholesale_price` , `price` , `ecotax` , `quantity` , `weight` , `unit_price_impact` , `default_on` , `minimal_quantity` ) SELECT `id_product_attribute` , `id_product` , `reference` , `supplier_reference` , `location` , `ean13` , `upc` , `wholesale_price` , `price` , `ecotax` , `quantity` , `weight` , `unit_price_impact` , `default_on` , `minimal_quantity` FROM ps_product_attribute ;
Tabela kombinacji atrybutów:
TRUNCATE pr_product_attribute_combination; INSERT INTO pr_product_attribute_combination SELECT * FROM ps_product_attribute_combination;
Tabela łącząca kombinacje z odp. zdjęciem:
TRUNCATE pr_product_attribute_image; INSERT INTO pr_product_attribute_image SELECT * FROM ps_product_attribute_image;
Tabela multistore dla atrybutów:
TRUNCATE pr_product_attribute_shop; INSERT INTO `pr_product_attribute_shop` ( `id_product`, `id_shop`, `id_product_attribute`, `wholesale_price`, `price`, `ecotax`, `weight`, `unit_price_impact`, `default_on`, `minimal_quantity`, `available_date` ) SELECT `id_product`, 1, `id_product_attribute`, `wholesale_price`, `price`, `ecotax`, `weight`, `unit_price_impact`, `default_on`, `minimal_quantity`, `available_date` FROM pr_product_attribute;
Uzupełnienie ilości.
Operuje tym tabela pr_stock_available (domyślnie ps_stock_available). Prezentujemy tutaj podstawowe wypełnienie tej tabeli.
TRUNCATE pr_stock_available; INSERT INTO `pr_stock_available` ( `id_product`, `id_product_attribute` ) SELECT `id_product` , `id_product_attribute` FROM pr_product_attribute; UPDATE `pr_stock_available` SET `id_shop` = 1, `quantity` = 100 WHERE `id_product_attribute` > 0 ;
Jednak konieczny jest skrypt PHP który poprawi spójność danych w tej tabeli. Tzn. samo zapisanie produktu w adminie to wykonuje, jednak tylko dla konkretnego produktu. Nasz skrypt – wykonuje to masowo:) Aby go użyć zapraszamy do artykułu:
Skrypt PHP to akutalizacji i przebudowy tabeli ps_stock_available [PrestaShop 1.7] [PrestaShop 1.6]
W razie problemów z którymś zapytaniem zapraszamy do kontaktu albo komentarzy.
W przypadku problemów z tym zagadnieniem zapraszamy do zapozniania się z ofertą:
grafika:wallpaperflare.com
[…] Migracja danych ze sklepu PrestaShop 1.4 do PrestaShop 1.7. Czy to możliwe? TAK! […]
Z bazy danych PS1.6 przeniosłem wszystkie kategorie do bazy PS1.7
Następnie zrobiłem to samo z produktami. Na stronie sklepu mam produkty dostępne natomiast nie są one widoczne w backoffice.
Dodatkowo klikając „dodaj nowy produkt” przekierowuje mnie do głównej strony panelu administracyjnego.
Co zrobiłem źle?
Najlepiej zakutalizuj PS16 do takiej samej wersji jak ten PS17 i przenieś wszystkie tabele produktowe ps_produkt* oraz te co łączą produkty z kategoriami. Dochodzi jeszcze tabela ps_stock_available. Ogólnie nie jest to łatwe zadanie..
[…] do skorzystania z naszej oferty. Akutalizujemy sklepy do najnowszej wersji PrestaShop 1.7 już od prehistorycznych wersji PrestaShop 1.4 […]