Перенос интернет-магазина с OpenCart на Webasyst Shop-Script без потери трафика

За 10 лет работы я перенес более 30 интернет-магазинов между различными платформами. Один из самых сложных, но интересных кейсов, переход с OpenCart на Webasyst Shop-Script. Почему клиенты выбирают Shop-Script? Чаще всего из-за гибкой системы прав доступа, встроенного CRM и удобства управления мультимагазинами. Но главный страх владельцев, это потеря трафика и позиций в поисковиках. В этой статье я подробно разберу, как провести перенос без ошибок, с примерами кода, таблицами сравнения инструментов и личными лайфхаками.

Подготовка к переносу: с чего начать?

Перед переносом важно провести аудит текущего магазина. Вот мой чек-лист:

  1. Резервное копирование:
    • База данных OpenCart (использую mysqldump или плагин Backup Pro).
    • Файлы шаблонов и изображений (рекомендую Duplicati для инкрементных бэкапов).
  2. Анализ структуры:
    • Сравните типы полей товаров в OpenCart и Shop-Script. Например, в OpenCart есть «Опции», а в Webasyst — «Фичи».
    • Проверьте связи: категории, производители, атрибуты.
  3. Планирование этапов:
    • Перенос товаров → Клиенты → Заказы → Настройки SEO → Тестирование.

Перенос каталогов товаров

Основная проблема — разная структура баз данных. Приведу пример таблиц:

OpenCart:

sql
TABLE oc_product (
  product_id INT,
  model VARCHAR(64),
  sku VARCHAR(64),
  quantity INT,
  ...
);

Webasyst Shop-Script:

sql
TABLE shop_product (
  id INT,
  name VARCHAR(255),
  sku VARCHAR(64),
  count INT,
  ...
);

Решение:

  1. Экспортируем данные из OpenCart в CSV с помощью скрипта:
php
// export_opencart.php
$products = $db->query("SELECT * FROM oc_product");
$csv = fopen('products.csv', 'w');
foreach ($products as $product) {
  fputcsv($csv, [
    'name' => $product['model'],
    'sku' => $product['sku'],
    'stock' => $product['quantity']
  ]);
}
  1. Импортируем в Shop-Script через консольный скрипт:
php
// import_webasyst.php
$csv = fopen('products.csv', 'r');
while ($row = fgetcsv($csv)) {
  $product = new shopProduct();
  $product->name = $row['name'];
  $product->sku = $row['sku'];
  $product->save();
}

Для сложных случаев (например, перенос опций) используйте API Shop-Script.

Интеграция платежных систем: Robokassa, ЮКассы

В OpenCart платежные модули устанавливаются через админку, в Webasyst требуется написать небольшой плагин.

Пример кода для Robokassa в Shop-Script:

php
class robokassaPayment extends waPayment {
  public function allowedCurrency() {
    return 'RUB';
  }

  protected function callbackHandler($data) {
    if ($this->verifySign($data)) {
      $order_id = $data['InvId'];
      $this->appPayment(self::CALLBACK_PAYMENT, $data);
      return array('result' => 'OK');
    }
  }
}

Важно:

  • Тестируйте в режиме песочницы.
  • Настройте автоматическое обновление статусов заказов через Cron.

SEO: как сохранить позиции после переезда

По моему опыту, 70% ошибок при переносе связаны с SEO. Вот план:

  1. Редиректы 301:
    Если в OpenCart был ЧПУ /product/iphone, а в Webasyst /iphone/p1234, добавьте в .htaccess:

    apache
    RedirectMatch 301 ^/product/(.*)$ /$1/p1234
  2. Сохранение мета-тегов:
    Экспортируйте title и description из OpenCart и импортируйте через SQL:

    sql
    UPDATE shop_product SET meta_title = '...' WHERE id = 123;

Сравнение инструментов для переноса: что выбрать?

Инструмент Плюсы Минусы Стоимость
Cart2Cart Автоматизация, поддержка Цена (от $299) Дорого
CMS2CMS Быстрый старт Ограниченные поля От $199
Самописный скрипт Полный контроль Требует времени Бесплатно

Для небольших магазинов (до 1000 товаров) пишу скрипты сам. Для крупных — Cart2Cart.

Рекомендации для разработчиков

  • Тестируйте на копии. Никогда не работайте с живым сайтом.
  • Договоритесь о downtime. Предупредите клиентов о технических работах.
  • Проверьте скорость. Shop-Script требует оптимизации MySQL. Установите индекс для shop_product.sku.

Перенос с OpenCart на Shop-Script задача выполнимая, если подойти к ней системно. Главное не спешить, тестировать каждый этап и не забывать про SEO. Если остались вопросы, пишите в комментариях, помогу!