Міграція з Magento 1 на Magento 2
Magento 1 більше не підтримується з червня 2020 року. Перенесення на Magento 2 — це не оновлення, а повна переробка: інша архітектура, інші формати даних, інша система розширень. Офіційний інструмент Data Migration Tool перенесе дані, але весь код тем та модулів потрібно переписати з нуля або знайти аналоги.
Що мігрує, а що ні
| Компонент | Статус |
|---|---|
| Товари, категорії, атрибути | Мігрують через Data Migration Tool |
| Клієнти та паролі | Клієнти мігрують, паролі ні (алгоритм хешування змінився) |
| Замовлення та історія | Мігрують |
| CMS-сторінки та блоки | Мігрують |
| Теми (шаблони) | Не мігрують — Magento 2 використовує PHTML + Knockout.js + LESS |
| Розширення | Не мігрують — Magento 2 API несумісний |
| Власні таблиці БД | Потребують ручної міграції |
| URL rewrites | Мігрують з застереженнями |
Етапи міграції
1. Аудит Magento 1
Інвентаризація розширень — найважливіший етап:
# Список встановлених розширень
find /var/www/m1 -name "*.xml" -path "*/etc/config.xml" | \
grep -v "Mage\|Phoenix\|Enterprise" | head -50
# Список власного коду в app/local та app/community
ls /var/www/m1/app/code/local/
ls /var/www/m1/app/code/community/
Для кожного розширення знайдіть аналог для Magento 2 або оцініть вартість переписування.
2. Установка Magento 2 та Data Migration Tool
# Встановити Magento 2
composer create-project --repository-url=https://repo.magento.com/ \
magento/project-community-edition /var/www/m2
# Встановити Data Migration Tool
composer require magento/data-migration-tool
# Конфіг: app/etc/env.php (з'єднання M2)
# Конфіг мігратора config.xml
cp vendor/magento/data-migration-tool/etc/opensource-to-opensource/1.9.4.1/config.xml.dist \
app/etc/migration-config.xml
Редагуйте migration-config.xml — вкажіть обидва з'єднання (M1 та M2), версію джерела.
3. Налаштування маппінгу
<!-- app/etc/migration-config.xml -->
<config xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="urn:magento:module:Magento_DataMigrationTool:etc/config.xsd">
<steps mode="data">
<step title="Settings Step">
<integrity>Magento\DataMigration\Step\Settings\Integrity</integrity>
<run>Magento\DataMigration\Step\Settings\Data</run>
</step>
</steps>
<source>
<database host="localhost" name="magento1_db" user="root" password="pass"/>
</source>
<destination>
<database host="localhost" name="magento2_db" user="root" password="pass"/>
</destination>
<options>
<bulk_size>100</bulk_size>
<custom_option_map>false</custom_option_map>
<source_prefix></source_prefix>
<dest_prefix></dest_prefix>
</options>
</config>
4. Запуск міграції настроєк
# Перевірити настроєння (тільки читання)
php bin/magento migrate:settings --config=app/etc/migration-config.xml
# Мігрувати конфігурацію магазину
php bin/magento migrate:settings --config=app/etc/migration-config.xml --stage=data
5. Міграція даних
# Перевірка цілісності (перед запуском!)
php bin/magento migrate:check --config=app/etc/migration-config.xml --stage=data
# Якщо перевірка пройшла — запустіть міграцію даних
php bin/magento migrate:data --config=app/etc/migration-config.xml
# Прирощувальна міграція (delta) для синхронізації нових замовлень
php bin/magento migrate:delta --config=app/etc/migration-config.xml
Міграція великого каталогу (100k+ товарів) займає годин. Запустіть через screen або tmux:
screen -S migration
php bin/magento migrate:data --config=app/etc/migration-config.xml 2>&1 | tee /var/log/migration.log
# Ctrl+A D для відлучення
6. Маппінг нестандартних атрибутів
Якщо М1 мав власні атрибути з специфічними кодами або типами:
<!-- vendor/magento/data-migration-tool/etc/opensource-to-opensource/1.9.4.1/map-eav.xml -->
<map>
<source>
<field_rules>
<ignore>
<field>catalog_product/my_custom_attr_old_name</field>
</ignore>
</field_rules>
</source>
<destination>
<field_rules>
<transform>
<field>catalog_product/new_attr_name</field>
<handler class="Magento\DataMigration\Handler\SetValue">
<param name="value" value="default_value"/>
</handler>
</transform>
</field_rules>
</destination>
</map>
Міграція власних таблиць
Data Migration Tool не знає про власні таблиці розширень. Для них — ручний SQL-скрипт:
<?php
// migrate_custom_data.php
$m1 = new PDO('mysql:host=localhost;dbname=magento1', 'root', 'pass');
$m2 = new PDO('mysql:host=localhost;dbname=magento2', 'root', 'pass');
// Приклад: мігрувати власні відгуки
$stmt = $m1->query("SELECT * FROM custom_reviews WHERE status = 1");
$reviews = $stmt->fetchAll(PDO::FETCH_ASSOC);
$insert = $m2->prepare(
"INSERT INTO custom_reviews (product_id, customer_id, text, rating, created_at)
VALUES (:product_id, :customer_id, :text, :rating, :created_at)
ON DUPLICATE KEY UPDATE text = :text"
);
foreach ($reviews as $review) {
$insert->execute($review);
}
Проблема паролів клієнтів
М1 використовує MD5-гешування паролів, M2 — bcrypt. Після міграції клієнти повинні скинути паролі. Варіанти:
- Примусовий скид — надішліть всім клієнтам електронну пошту зі посиланням на скидання пароля
- Ледачої міграції — при першому вході перевірте старий MD5, якщо збігається — перегешуйте через bcrypt та збережіть
// Плагін для CustomerAuthenticationService
public function aroundAuthenticate($subject, callable $proceed, $username, $password)
{
try {
return $proceed($username, $password); // Спробуйте стандартний bcrypt
} catch (AuthenticationException $e) {
// Перевірте legacy MD5
$customer = $this->customerRepository->get($username);
$legacyHash = md5($password); // спрощено, М1 використовував сіль
if (hash_equals($customer->getLegacyPasswordHash(), $legacyHash)) {
// Оновіть до bcrypt
$this->customerRepository->save(
$customer->setPasswordHash($this->encryptor->getHash($password, true))
);
return $customer;
}
throw $e;
}
}
Перехід з OCMOD/Connect на Composer
Усі М1-розширення встановлені через Magento Connect або файлові патчі. У M2 — тільки Composer. Для кожного розширення:
- Знайдіть аналог на marketplace.magento.com або Packagist
- Якщо аналогу немає — напишіть модуль заново під M2 API
# Встановлення розширення через Composer
composer require vendor/module-name
# Активуйте модуль
php bin/magento module:enable Vendor_ModuleName
php bin/magento setup:upgrade
SEO: збереження URL
М1 та M2 мають різні формати URL. Потрібно генерувати редиректи 301:
-- Отримати старі URL з М1
SELECT request_path, target_path, options
FROM core_url_rewrite
WHERE store_id = 1
AND id_path NOT LIKE 'product/%' -- виключити автогенеровані
ORDER BY request_path;
Після генерування URL у M2 — порівняйте та створіть редиректи в Nginx або через M2 URL Rewrites.
Остаточна синхронізація (Delta Migration)
Поки М1 працює в production, нові замовлення продовжують надходити. Після перемикання DNS:
# Зупиніть М1, запустіть остаточну дельта-міграцію
php bin/magento migrate:delta --config=app/etc/migration-config.xml
# Переіндексація
php bin/magento indexer:reindex
# Розгорніть статичний контент
php bin/magento setup:static-content:deploy ru_RU en_US -f
php bin/magento cache:flush
Часові рамки
Міграція даних Magento 1 (до 50k товарів) — 2–3 дні. Весь проект з переробкою теми, портуванням розширень та тестуванням — 2–4 місяці залежно від обсягу власного коду М1.







