Настройка модуля Migrate для миграции контента в Drupal

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Настройка модуля Migrate для миграции контента в Drupal
Сложный
~3-5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Представьте: вы переносите интернет-магазин с 80 000 товаров, историей заказов и пользовательскими профилями из старого Drupal 7 на Drupal 10. Категории перестроены, изображения хранятся по нестандартным путям, а в comments — 300 000 записей с вложенными ответами глубиной до 10 уровней. Вручную такой объём займёт месяцы, а ошибки неизбежны. Мы используем встроенный ETL-фреймворк Drupal — модуль Migrate, который извлекает, трансформирует и загружает данные. За пять лет мы провели 50+ миграций, гарантируя целостность данных и полное соответствие новой структуре. При грамотной настройке Migrate обрабатывает 10 000 записей за 15–20 минут. Свяжитесь с нами — проведём аудит вашего проекта и предложим оптимальный план миграции.

Архитектура Migrate

Модуль состоит из трёх логических компонентов, которые настраиваются через YAML-конфиги:

  • Source — источник данных: CSV, SQL, JSON, старый Drupal 7, WordPress, любые API.
  • Process — трансформация: маппинг полей, конвертация форматов, обогащение через плагины.
  • Destination — куда записываем: Node, Term, User, File, Config.

Каждая миграция описывается в файле config/install/migrate_plus.migration.*.yml. Мы используем Migrate Plus, Migrate Tools и дополнительные source-плагины. Все миграции наследуют базовый класс Migration.

Критерий Migrate Ручной перенос
Скорость Часы для 10 000 записей Дни или недели
Трансформации Встроенные плагины Вручную скрипты
Ошибки Логирование, continue-on-failure Нет контроля
Повторное использование YAML конфиги Каждый раз заново

Migrate обычно в 10 раз быстрее ручного переноса при сравнении времени разработки и выполнения.

Как настроить миграцию в Drupal?

Процесс включает шесть шагов:

  1. Анализ исходных данных: структура, типы, связи, объём. Например, определяем, что категории хранятся в отдельной таблице, а изображения — по внешним URL.
  2. Проектирование миграций: маппинг полей, выбор source-плагинов, определение зависимостей (например, сначала миграция категорий, потом статей).
  3. Реализация: написание YAML, кастомных плагинов, тестирование на выборке из 10–20 записей.
  4. Тестирование: проверка целостности, регрессия, исправление ошибок — запускаем на полной копии.
  5. Запуск: поэтапный импорт с мониторингом, откат при необходимости.
  6. Поддержка: доработка под новые источники, обновление после релизов Drupal.

Какие источники данных поддерживаются?

Модуль Migrate из коробки поддерживает CSV, JSON, XML, SQL-базы через PDO, а также старые версии Drupal (6, 7). Для WordPress есть готовый source-плагин, для произвольных API — кастомные плагины. Таблица ниже показывает популярные варианты:

Источник Плагин Пример использования
CSV csv Импорт из экспорта Excel
JSON json REST API стороннего сервиса
WordPress wordpress Перенос блога из WP
Drupal 7 d7_node Обновление до Drupal 10
Произвольный API кастомный source Интеграция с CRM

Пример: миграция из CSV

Конфигурация миграции статей из CSV-файла:

id: articles_from_csv
label: 'Статьи из CSV'
migration_group: content_import

source:
  plugin: csv
  path: 'public://import/articles.csv'
  ids:
    - external_id
  header_row_count: 1
  column_names:
    - external_id
    - title
    - body
    - category
    - publish_date
    - image_url

process:
  title: title
  'body/value': body
  'body/format':
    plugin: default_value
    default_value: full_html
  created:
    plugin: format_date
    source: publish_date
    from_format: 'd.m.Y'
    to_format: 'U'
  status:
    plugin: default_value
    default_value: 1
  field_category:
    plugin: migration_lookup
    migration: categories_from_csv
    source: category
  field_image:
    plugin: download
    source:
      - image_url
      - '@filename'
    destination:
      plugin: 'public://images'
    rename: true

destination:
  plugin: 'entity:node'
  default_bundle: article

migration_dependencies:
  required:
    - categories_from_csv

Пример кастомного source-плагина для API:

<?php
// src/Plugin/migrate/source/ExternalApiSource.php
namespace Drupal\mymodule\Plugin\migrate\source;

use Drupal\migrate\Plugin\migrate\source\SourcePluginBase;

/**
 * @MigrateSource(
 *   id = "external_api",
 *   source_module = "mymodule"
 * )
 */
class ExternalApiSource extends SourcePluginBase {
    public function getIds(): array {
        return ['id' => ['type' => 'integer']];
    }

    public function fields(): array {
        return [
            'id' => 'ID записи',
            'title' => 'Заголовок',
            'content' => 'Содержимое',
            'tags' => 'Теги (через запятую)',
        ];
    }

    protected function initializeIterator(): \Iterator {
        $page = 0;
        do {
            $response = \Drupal::httpClient()->get(
                'https://api.external.com/posts?page=' . $page,
                ['headers' => ['Authorization' => 'Bearer ' . $this->configuration['api_key']]]
            );
            $data = json_decode($response->getBody(), true);
            $items = $data['items'];

            foreach ($items as $item) {
                yield $item;
            }

            $page++;
        } while (!empty($items) && $page < $data['total_pages']);
    }
}

Как избежать дубликатов при повторной миграции?

Используйте highwater mark или track_changes: true в конфигурации источника. Тогда мигрируются только новые или изменённые записи. Это особенно полезно при инкрементальном обновлении после первичного импорта. Пример настройки:

highwaterProperty:
  name: updated_at
  alias: u

Миграция медиафайлов и инкрементальный импорт

Изображения и файлы мигрируются отдельным YAML-конфигом, затем привязываются к сущностям через migration_lookup. Пример миграции файлов:

id: files_migration
source:
  plugin: csv
  path: 'public://import/files.csv'
process:
  filename:
    plugin: callback
    callable: basename
    source: file_url
  uri:
    plugin: download
    source:
      - file_url
      - '@filename'
    destination:
      plugin: 'public://migrated'
destination:
  plugin: 'entity:file'

В миграции нод поле field_image использует migration_lookup для ссылки на загруженный файл.

Что входит в наши услуги по миграции контента?

В рамках работы под ключ мы предоставляем:

  • Документацию по структуре миграций
  • Доступы к репозиторию с конфигурацией
  • Оптимизацию производительности: настройка batch size, highwater mark, parallel processing
  • Обучение ваших разработчиков работе с Migrate
  • Поддержку в течение месяца после запуска
  • Гарантию безостановочной работы сайта во время миграции

Сроки

Простая миграция из CSV (500–5000 записей) — 2–3 дня. Сложная миграция из нескольких источников с кастомными плагинами и трансформациями — 1–2 недели. Точные сроки определяем на бесплатном аудите.

Почему миграция на Migrate выгоднее ручного переноса?

Миграция через Migrate — это не только скорость, но и гарантия целостности. Мы используем best practices: highwater mark, track_changes, continue-on-failure. Наши инженеры имеют сертификаты Drupal и опыт работы с проектами, где объём контента превышает 500 000 записей. Свяжитесь с нами, чтобы обсудить вашу задачу. Получите консультацию по миграции бесплатно.

Редизайн и миграция сайта: смена CMS, сохранение SEO

Клиент пришёл через 6 недель после самостоятельного редизайна: «Мы переехали с WordPress на Tilda, трафик упал на 70%». Открываю Google Search Console — 847 страниц отдают 404, URL-структура полностью изменилась, не было ни одного 301-редиректа. Яндекс ещё не переиндексировал новый сайт, позиции рухнули. Восстановление заняло 4 месяца и обошлось в потерю выручки около 2 млн рублей за квартал. Наш опыт — более 7 лет и 80+ успешных миграций, гарантируем сохранение позиций при правильном подходе.

Почему миграции ломают SEO

Поисковики проиндексировали конкретные URL. Если /catalog/shoes/nike-air-max-270 превратился в /products/nike-air-max-270 без 301-редиректа — весь ссылочный вес страницы, весь трафик, все позиции уходят в никуда. Google говорит, что 301 передаёт ~99% PageRank, но на практике позиции восстанавливаются за 2–8 недель, а не мгновенно.

Чаще всего SEO ломают не из злого умысла, а потому что разработчик не думает о URL-структуре как о публичном API. Вот типичные поломки:

Проблема Причина Решение
Дублированный контент Новый сайт открывается параллельно со старым Отключить индексацию dev-версии, настроить canonical
Потеря метаданных Title и description остались в старой CMS Экспорт через API, массовый импорт с проверкой
Изменение canonical Пагинация и фильтры сбросились Зафиксировать до разработки, внедрить в шаблон
Скорость просела Тяжёлые секции, неоптимизированные изображения Оптимизировать LCP, CLS, TTFB до запуска

Как восстановить трафик после неудачной миграции?

Если трафик упал — действуйте немедленно:

  1. Краул нового сайта на 404 и сравнение с предмиграционным списком URL.
  2. Создание редиректов для всех потерянных страниц с трафиком >0.
  3. Проверка структурированных данных и мета-тегов на тестовой выборке.
  4. Ежедневный мониторинг Coverage в Search Console и позиций по топ-50 запросам.
  5. Если спустя 2 недели трафик не восстанавливается — глубокий аудит редиректов (транзитивность, цепочки, циклы).

В нашей практике такой случай: крупный интернет-магазин потерял 50% трафика при переезде с Битрикса на React + Strapi. За три дня восстановили 95% редиректов, через 3 недели трафик вернулся на 90% от исходного.

Предмиграционный аудит: что нельзя пропустить

До начала разработки нового сайта нужно:

  1. Полный краул текущего сайта через Screaming Frog или Sitebulb. Получить список всех индексируемых URL с трафиком из Google Search Console.
  2. Выгрузить все страницы с органическим трафиком >0 за последние 6 месяцев — это приоритет для редиректов.
  3. Зафиксировать все внешние ссылки (backlinks) на конкретные страницы — Ahrefs, Semrush.
  4. Сфотографировать текущие позиции по ключевым запросам — база для сравнения после миграции.
  5. Сохранить Core Web Vitals из Search Console за предыдущие 90 дней.

Таблица для фиксации:

Этап аудита Инструмент Критичность
Сбор URL Screaming Frog + GSC Высокая
Трафик по страницам Google Analytics / Search Console Высокая
Внешние ссылки Ahrefs / Majestic Средняя
Позиции Яндекс.Wordstat / Serpstat Средняя
Core Web Vitals GSC CrUX Высокая

Свяжитесь с нами для детального предмиграционного аудита — мы поможем выявить все риски и составить план действий.

Маппинг URL и редиректы

Для проекта с 200+ страницами создаём таблицу маппинга: старый URL → новый URL → статус (301, объединён с другой страницей, удалён). Каждая строка проходит проверку: реально ли контент переехал именно сюда.

В Laravel редиректы через конфигурационный файл и middleware, не через .htaccess — это быстрее и управляемо. Для WordPress → Next.js: редиректы настраиваются в next.config.js (статические) и на уровне Nginx/CDN для динамических. Старый .htaccess на shared хостинге с 500+ строками редиректов — особый ад. Каждый редирект проверяется последовательно, производительность падает. Переносим в Nginx map директиву или Redis-кэш для динамического поиска. Подробнее в Wikipedia: HTTP 301.

Миграция контента из разных CMS

WordPress → Headless CMS (Contentful, Strapi, Sanity):
WordPress REST API или WP All Export для экспорта постов, метаполей, медиафайлов. Скрипт миграции на Node.js: парсим экспорт, трансформируем структуру, загружаем через API CMS. Медиафайлы перегружаем в новое хранилище, обновляем ссылки в контенте. Типичная проблема — shortcodes в контенте WordPress ([gallery id="123"]): нужен парсер и трансформация в новый формат.

1С-Битрикс → современный стек:
Битрикс хранит контент в нестандартных таблицах с IBLOCK_ELEMENT_PROPERTY. Прямой SQL-экспорт через phpMyAdmin или Bitrix API. Трансформация — самая долгая часть из-за специфики структуры данных Битрикса.

Тяжёлые WYSIWYG → структурированный контент:
Годы редактирования в FCKEditor/TinyMCE оставляют inline-стили, нестандартные теги, сломанные атрибуты. HTML sanitize + трансформация в Markdown или Portable Text (Sanity) с ручной проверкой проблемных страниц.

CMS Инструменты миграции Сложность Риски
WordPress WP All Export, WP-CLI, REST API Средняя Shortcodes, meta fields
1C-Битрикс Bitrix API, SQL-экспорт Высокая Сложная структура, свойства инфоблоков
Joomla J2XML, прямая выгрузка из БД Высокая Устаревшие расширения
Tilda/Readymag Экспорт через API (ограничен) Средняя Нет полного доступа к контенту

SEO-сохранение технических элементов

Структурированные данные (Schema.org) — если на старом сайте были Product, Article, BreadcrumbList разметки, они должны быть и на новом. Google Search Console → Enhancement reports покажут потерю rich snippets.

Sitemap XML: генерируется автоматически, отправляется в GSC через день после запуска. Старый sitemap остаётся до полной переиндексации.

hreflang для мультиязычных сайтов: если теги потерялись при миграции, через несколько недель начнутся конфликты между языковыми версиями в выдаче.

Open Graph и Twitter Card мета-теги — часто забывают при смене шаблона, страницы перестают корректно отображаться при шаринге в соцсетях.

Запуск и мониторинг первых недель

DNS propagation: переключение DNS занимает до 48 часов, планируйте запуск с запасом. Cloudflare как DNS-провайдер — propagation занимает минуты, не часы.

После запуска ежедневно мониторим: Search Console → Coverage (ошибки индексации), Analytics → органический трафик, сравнение с аналогичным периодом прошлого года, краулинг сайта на 404-ошибки.

Первые 2 недели — критический период. Если трафик падает на 30%+ — немедленный аудит редиректов и сравнение с предмиграционным краулом.

Чек-лист на запуск (спойлер)
  • [ ] Все 301 редиректы работают и не образуют цепочек
  • [ ] Sitemap отправлен в GSC и Яндекс.Вебмастер
  • [ ] Прописаны canonical на всех страницах
  • [ ] Проверено отображение Open Graph / Twitter Card
  • [ ] Скорректированы robots.txt и мета-теги noindex
  • [ ] Core Web Vitals в зелёной зоне (LCP <2.5s, CLS <0.1, INP <200ms)

Что входит в работу

Результаты, которые вы получаете:

  1. План миграции с маппингом URL и редиректов в формате Excel/Google Sheets.
  2. Настроенные 301 редиректы на серверном уровне (Nginx/Cloudflare/Vercel).
  3. Перенесённый контент с проверкой целостности: изображения, мета-поля, ссылки.
  4. Структурированные данные (Schema.org) на новом сайте, идентичные старым или улучшенные.
  5. Отчёт по SEO: динамика позиций через 1, 3 и 6 недель после запуска.
  6. Мониторинг Coverage в Search Console с уведомлениями об ошибках.
  7. Гарантия сохранения позиций: если трафик падает более чем на 15% в течение первого месяца — бесплатный аудит и коррекция.

Сроки и ориентиры

  • Редизайн с миграцией небольшого сайта (до 100 страниц): 4–8 недель.
  • Миграция e-commerce с 500+ страниц товаров: 8–16 недель.
  • Только техническая часть миграции (редиректы, метаданные) без редизайна: 1–3 недели.

Стоимость рассчитывается индивидуально по объёму. Средняя экономия клиента за счёт сохранения трафика после миграции — от 300 000 до 500 000 рублей в год.

Получите консультацию по вашему проекту — мы ответим в течение дня. Закажите предмиграционный аудит вашего сайта и получите точную смету с планом редиректов. Свяжитесь с нами, чтобы обсудить детали.