Перенесення між CMS: збереження контенту та SEO-позицій
WordPress з 10 000 записів, headless-архітектура для мультиканальної публікації — типовий сценарій, де прямий експорт-імпорт ламає SEO та структуру. Схеми даних несумісні, медіафайли в прив'язках, Rich Text втрачає форматування. Ми вирішуємо це завдання через ETL-пайплайн з батчингом та повторною обробкою. За 5 років провели 30+ міграцій — від WP→Strapi до Drupal→Contentful. Економія бюджету сягає 40% (до 200 000 грн на проєкті з 5000 записів) завдяки автоматизації порівняно з ручною міграцією. Наша команда має 10+ років досвіду у веб-розробці, що гарантує надійність перенесення.
Звичайний дамп бази не працює: 60% часу йде на трансформацію. Мапінг типів контенту, перебудова таксономій, конвертація Rich Text — кожен етап потребує свого підходу.
Як підготувати дані до міграції?
Перший крок — інвентаризація. Збираємо схему: типи контенту, поля, таксономії, метадані. Для WordPress це пости, сторінки, користувачі, шорткоди; для Contentful — моделі та локалі. Мапінг робимо вручну за участю вашої команди — це гарантує 100% перенесення.
Мапінг типів контенту
| Тип даних | WordPress | Strapi | Sanity |
|---|---|---|---|
| Пост | wp_posts.post_type = 'post' |
Post collection |
post document |
| Сторінка | wp_posts.post_type = 'page' |
Page collection |
page document |
| Метаполе | wp_postmeta |
Dynamic zone | metadata object |
Такий мапінг лягає в основу скриптів трансформації.
Чому ETL-пайплайн швидший за ручне перенесення?
ETL — Extract–Transform–Load — дозволяє автоматизувати навіть складні перетворення. Батчинг по 50 записів із затримкою 500 мс пришвидшує процес у 3 рази порівняно з поштучною обробкою. Приклад скрипта:
// scripts/cms-migration.ts interface MigrationConfig { source: 'wordpress' | 'contentful' | 'ghost'; target: 'strapi' | 'contentful' | 'sanity'; contentTypes: ContentTypeMapping[]; } async function migrate(config: MigrationConfig) { const extractor = getExtractor(config.source); const transformer = getTransformer(config.source, config.target); const loader = getLoader(config.target); for (const mapping of config.contentTypes) { console.log(`Migrating: ${mapping.sourceName} → ${mapping.targetName}`); const items = await extractor.extract(mapping.sourceName); const transformed = items.map(item => transformer.transform(item, mapping)); for (const batch of chunk(transformed, 50)) { await loader.load(mapping.targetName, batch); await delay(500); } } } Міграція Rich Text
Найскладніший етап — трансформація форматів. HTML → Portable Text (Sanity) або Markdown (Contentful) потребує рекурсивного парсингу DOM. Блоки зображень, вбудовані шорткоди — кожен елемент обробляється за правилом. Наприклад, для перенесення 15 000 зображень з WordPress у Strapi знадобилося 2 дні на батчинг і перелінковку.
// WordPress HTML → Portable Text import { htmlToPortableText } from '@portabletext/html'; function transformWpContent(html: string) { return htmlToPortableText(html, { rules: [ { deserialize(el, next, block) { if (el.tagName === 'IMG') { return block({ _type: 'image', _key: Math.random().toString(36).slice(2), src: el.getAttribute('src'), alt: el.getAttribute('alt'), }); } }, }, ], }); } Після завантаження контенту генеруємо мапінг редиректів і налаштовуємо 301 редиректи.
const redirects = oldPosts.map(old => ({ source: old.url, destination: newPosts.find(n => n.slug === old.slug)?.url ?? '/blog', permanent: true, })); Що робити з SEO-структурою після міграції?
Старі URL, мета-теги, карти сайту — все переноситься без втрати позицій. Використовуємо 301 редиректи та лог помилок. Як зазначено в документації WordPress, коректні редиректи критичні для збереження PageRank. Якщо ви плануєте міграцію, зв'яжіться з нами — ми допоможемо спланувати бюджет і терміни.
Основні складності міграції
Rich Text з вкладеннями
У WordPress контент зберігається як HTML із вбудованими шорткодами. У Contentful — на Markdown, у Sanity — Portable Text. Алгоритм рекурсивно парсить DOM і збирає блоки.
SEO-структура
Переносимо мета-теги, заголовки, карти сайту. Налаштовуємо 301 редиректи для збереження позицій. Налаштування редиректів у Strapi описано в офіційному плагіні Redirects.
Даунтайм
Мінімізуємо простій до 15 хвилин за рахунок паралельного запису та перемикання DNS.
Користувачі та права
Імпортуємо акаунти, ролі та підписки, забезпечуючи безшовну аутентифікацію.
Процес роботи
- Аудит — інвентаризуємо контент, схему, SEO-теги, медіа.
- Мапінг — складаємо відповідності типів контенту та полів.
- Розробка скриптів — пишемо ETL-пайплайн під вашу пару CMS.
- Тестова міграція — прогоняємо на копії, перевіряємо цілісність даних та метаданих.
- Бойовий запуск — виконуємо перенесення у вікно з мінімальним трафіком.
- Пост-міграція — моніторинг помилок 404, коригування редиректів, передача документації.
Терміни
| Обсяг контенту | Термін |
|---|---|
| до 500 записів | 1–2 тижні |
| 500–5000 записів | 2–4 тижні |
| 5000+ записів | від 4 тижнів |
Вартість розраховується індивідуально — пишіть, оцінимо проєкт за один день. Отримайте консультацію інженера з міграції.
Чек-лист постміграції
- Перевірити 301 редиректи для топ-100 сторінок
- Звірити кількість записів у старій та новій CMS (count)
- Протестувати форми, пошук, фільтри
- Завантажити карту сайту в Search Console
- Налаштувати моніторинг 404
Що входить у роботу
- План міграції та мапінг.
- Скрипти ETL з урахуванням вашої CMS.
- Налаштування 301 редиректів та карти сайту.
- Тестування на staging і моніторинг після запуску.
- Документація (список редиректів, схема даних, інструкція).
- Підтримка 30 днів після міграції.
Зв'яжіться з нами для консультації щодо перенесення вашого сайту — оцінимо бюджет і терміни за один день. Замовте міграцію зараз, щоб обговорити деталі без зобов'язань. Гарантуємо збереження даних і нульовий даунтайм.







