🏭

Миграция сайта с Joomla на WordPress без потери позиций

заказ производителя картонной упаковки: три сайта превращаются в два

Перенос трёх сайтов производителя упаковки с Joomla 3.10 на два независимых сайта WordPress: контент, редиректы 301, каталог FEFCO из 325 конструкций, SEO-разметка и панель настроек, которую ведёт сам заказчик.

Тестирование у заказчикаNDA
3 → 2
сайта на устаревшей Joomla переезжают на два независимых сайта WordPress
325
конструкций FEFCO в каталоге с развёртками, поиском и фильтром
0 ссылок
между двумя сайтами: проверено на собранных страницах

Задача

Заказчик, производитель картонной упаковки, вёл три сайта на Joomla 3.10 с шаблоном Gantry 5 и компонентом форм RSForm. CMS устарела, обновить её было не на что. Править контент без разработчика было нельзя, а на телефоне вёрстка расползалась.

Условия переезда:

  • контент, адреса страниц и позиции в поиске не должны потеряться;
  • заказчик сам правит тексты, фотографии, карточки и контакты;
  • сайт на телефоне работает не хуже, чем на компьютере;
  • у заказчика два юридических лица, поэтому сайтов остаётся два, и они не пересекаются ни ссылками, ни контактами, ни админкой.

Решение

Миграция CMS — это не «пересоздание сайта», а перенос контента, адресов и SEO-данных в новую систему с сохранением того, что уже знают поисковики. Мы разобрали дампы трёх баз Joomla скриптами на Python, очистили контент и загрузили его в WordPress.

Что сделано:

  • Перенос текстов, вложенных рубрик, дат, адресов страниц и вложений, заявки RSForm выгружены в архивный CSV.
  • Идемпотентный импорт: повторный запуск обновляет записи и не плодит дубли.
  • Карта старых адресов и постоянные редиректы 301 на новые.
  • Каталог FEFCO из 325 конструкций с развёртками, группами, похожими конструкциями и призывом к действию под каждой карточкой.
  • Поиск по сайту: код FEFCO, бытовые названия через словарь синонимов, размеры вида «300x200x150», живые подсказки.
  • Дочерняя тема к Astra с палитрой, снятой с оригиналов, тёмным режимом с переключателем и адаптивной вёрсткой.
  • Формы заявки на расчёт и обратного звонка на Contact Form 7, защита от спама без капчи.
  • Панель «Сайт» в админке: больше 60 полей, отдельные тексты, справочник FEFCO, встроенная инструкция.
  • Защита входа и развёртывание на сервере одной командой.

Как это устроено

Перенос с Joomla на WordPress по дампу базы

Конвейер такой: SQL-дампы загружаются в MySQL, Python-скрипты с BeautifulSoup достают записи и чистят HTML, результат сохраняется в JSON, а PHP-скрипты через WP-CLI создают записи в WordPress. Правила очистки лежат в одном скрипте, экспорт использует их, а не копирует. Шорткоды Joomla вырезаются, черновики приходят как черновики, информационные и юридические записи становятся страницами.

В Joomla таблицами верстали не только прайсы, но и блоки «картинка и текст». Порог разбора выведен из фактических данных: таблица разбирается на блоки, если в ней есть картинка, не больше двух строк и меньше половины ячеек с числами. Из 98 таблиц трёх баз разобрано 95 макетов, а один настоящий прайс на 53 строки остался таблицей.

Редиректы 301 при смене CMS

Редирект 301 — постоянная переадресация: она сообщает поисковику, что страница переехала, и передаёт ей вес старого адреса. Особенность Joomla в том, что при включённых ЧПУ адрес статьи строится от пункта меню. Поэтому карту соответствий проверяли на живом оригинале: адрес по рубрике отдавал 404, а по пункту меню открывался. Готовые правила сохранены в файлах .htaccess и в CSV для проверки человеком.

Каталог FEFCO в WordPress

FEFCO — европейская классификация конструкций гофрокартонной упаковки. Каталог из 325 конструкций восстановлен с развёртками и разложен по девяти группам. Вход в каталог — витрина групп, дальше раздел, затем карточка. У карточки блок похожих конструкций и переходы «Назад» и «Далее». Фильтр по типу конструкции и способу сборки работает обычной ссылкой без JavaScript: результат можно переслать, а страницы не теряют выбранные условия.

Изоляция двух сайтов одного заказчика

Сайты работают в отдельных контейнерах Docker с отдельными базами, без общих ссылок, контактов и админки. Отсутствие перекрёстных ссылок проверено на собранных страницах: ноль в обе стороны.

Защита входа в админку

Модуль защиты считает неверные пароли по адресу: после трёх ошибок вход закрыт на 15 минут, при повторе за сутки на час, затем на сутки. Ошибка входа одна для чужого логина и неверного пароля, поэтому по ответу нельзя угадать логин. Вторая линия стоит на входном nginx: не больше 20 запросов в минуту к странице входа, служебные файлы WordPress закрыты.

Панель настроек: заказчик правит сайт сам

Всё управление собрано в меню «Сайт»: обзор с готовностью к запуску, настройки, тексты, справочник FEFCO и встроенная инструкция. Правило простое: пустое поле означает «не использовать», незаполненная Метрика не грузит скрипт. На страницах настроек внизу история изменений с кнопкой «Вернуть как было».

Результат

  • Три сайта на Joomla 3.10 заменяются двумя сайтами на WordPress, заказчик ведёт их сам.
  • Каталог из 325 конструкций FEFCO восстановлен с развёртками, поиском и фильтром.
  • Адаптивность измерена на ширине 375 и 1280 пикселей: переполнения нет, меню раскрывается, прайсы превращаются в карточки.
  • Заголовки и описания заполнены у всех записей и рубрик, настроены карта сайта, хлебные крошки, разметка организации и вопросов-ответов.
  • Перенос воспроизводится скриптами: контейнеры, дампы, импорт, оформление и редиректы разворачиваются одной командой.
  • Замеров скорости загрузки в исходниках нет, поэтому оценок не приводим.

Технологии: что и зачем

  • Python, sqlparse, BeautifulSoup, pymysql — разбор SQL-дампов Joomla, очистка HTML, выгрузка в JSON.
  • WordPress 6.7 и PHP 8.2 — новая CMS с привычной для заказчика админкой; на PHP написаны импорт, тема и панель «Сайт».
  • MySQL 8.0 — база сайтов и промежуточная база для разбора дампов.
  • Astra и дочерняя тема — основа оформления, чтобы обновления родительской темы не ломали правки.
  • Rank Math SEO — заголовки, описания, карта сайта, хлебные крошки, разметка.
  • Contact Form 7 и Flamingo — формы заявок и их архив в админке.
  • Docker Compose и nginx — одинаковое окружение локально и на сервере, отдельный контейнер на сайт.
  • Let's Encrypt, проверка DNS-01 — сертификаты для стенда, который не отвечает на проверки по HTTP из-за ограничений сервера.

Статус

Версия 1.41.0 от 28 сентября 2026 года, стенд у заказчика. Сайты показаны заказчику на демонстрационном стенде с работающим HTTPS, индексация на нём выключена намеренно и включается при переезде на боевой домен. Остаются подключение отправки писем (ждём доступ к почтовому ящику), счётчики, фотографии к 23 записям без обложки, проверка справочника FEFCO технологом заказчика и резервное копирование по расписанию. Другие детали заказчика не раскрываются. Как мы собираем новые сайты с нуля, описано в разделе «Сайты».

Вопросы по проекту

Как перенести сайт с Joomla на WordPress и не потерять позиции в поиске?
Контент, адреса страниц, даты и вложения переносят скриптами по дампу базы Joomla. Для старых адресов строят карту соответствий и настраивают постоянные редиректы 301 на новые. Всем записям и рубрикам заполняют заголовки и описания, чтобы поисковик увидел прежний контент по новым адресам.
Почему после переезда с Joomla старые адреса не открываются?
При включённых ЧПУ Joomla строит адрес статьи от пункта меню, а не от рубрики. Здесь рубрика каталога называется «fefco», а пункт меню другой, поэтому «правильный» с виду адрес отдаёт ошибку 404, а настоящий открывается. Карту редиректов строят по реальным адресам с оригинала, в проекте это 24, 684 и 270 правил по трём сайтам.
Что переносится с Joomla, а что остаётся в архиве?
Переносятся тексты, вложенные рубрики, даты, адреса страниц и картинки. Заявки из формы RSForm выгружены в архивный файл CSV: их 2423, и в WordPress они не едут. 131 архивная запись одного из сайтов в перенос не вошла.
Можно ли повторно запустить импорт, не получив дубли?
Да. Импорт идемпотентен: повторный прогон обновляет записи и картинки, но не создаёт копий. Отдельная защита не даёт импорту затереть страницы, которые уже собраны вручную.
Может ли заказчик сам править сайт после переезда?
Да. Меню «Сайт» в админке собирает контакты, реквизиты, обложку главной, куки, аналитику и словарь поиска: больше 60 полей. Отдельный экран правит 27 надписей, которые рисует тема. Каждое сохранение запоминается, и прежние значения можно вернуть кнопкой.
Как защитить WordPress после переноса?
После трёх неверных паролей вход с адреса закрывается на 15 минут, при повторах на час и на сутки. XML-RPC и пароли приложений закрыты, список пользователей в REST API скрыт, а на входном nginx ограничено число запросов к странице входа.

Ещё по этому направлению

В разработке

BruDgital: платформа онлайн-курсов с защищённым видео и живыми эфирами

онлайн-школа по маркетингу: свой сайт, вход через ботов, оплата и эфиры вместо Zoom

В продакшенеNDA

Интернет-магазин рубашек на Nuxt 4 с админкой для владельца

магазин рубашек в Чебоксарах: владелец сам ведёт товары, цены и заказы

В продакшене · собственный продукт

UNLOCK: интерактивные открытки и адвент-календарь

собственный сервис студии: открытка по ссылке с паролем, управление из Telegram

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.