Перенесення між 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 днів після міграції.
Зв'яжіться з нами для консультації щодо перенесення вашого сайту — оцінимо бюджет і терміни за один день. Замовте міграцію зараз, щоб обговорити деталі без зобов'язань. Гарантуємо збереження даних і нульовий даунтайм.







