Міграція сайту з Magento 1 на Magento 2

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Міграція сайту з Magento 1 на Magento 2
Складна
від 2 тижнів до 3 місяців
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Міграція з 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. Після міграції клієнти повинні скинути паролі. Варіанти:

  1. Примусовий скид — надішліть всім клієнтам електронну пошту зі посиланням на скидання пароля
  2. Ледачої міграції — при першому вході перевірте старий 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. Для кожного розширення:

  1. Знайдіть аналог на marketplace.magento.com або Packagist
  2. Якщо аналогу немає — напишіть модуль заново під 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.