Миграция сайта с Joomla на WordPress без потери позиций
заказ производителя картонной упаковки: три сайта превращаются в два
Перенос трёх сайтов производителя упаковки с Joomla 3.10 на два независимых сайта WordPress: контент, редиректы 301, каталог FEFCO из 325 конструкций, SEO-разметка и панель настроек, которую ведёт сам заказчик.
Задача
Заказчик, производитель картонной упаковки, вёл три сайта на 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 старые адреса не открываются?
Что переносится с Joomla, а что остаётся в архиве?
Можно ли повторно запустить импорт, не получив дубли?
Может ли заказчик сам править сайт после переезда?
Как защитить WordPress после переноса?
Ещё по этому направлению
BruDgital: платформа онлайн-курсов с защищённым видео и живыми эфирами
онлайн-школа по маркетингу: свой сайт, вход через ботов, оплата и эфиры вместо Zoom
Интернет-магазин рубашек на Nuxt 4 с админкой для владельца
магазин рубашек в Чебоксарах: владелец сам ведёт товары, цены и заказы
UNLOCK: интерактивные открытки и адвент-календарь
собственный сервис студии: открытка по ссылке с паролем, управление из Telegram
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.