Импорт и миграция
Первым реализован импорт из Strapi v4/v5. Это пилотный запуск под контролем оператора: совместимость со всеми архивами реальных сайтов и ограничениями инфраструктуры ещё не подтверждена. Границы продукта показывают различие между локальными проверками и приёмкой миграции реального сайта.
До импорта
Заголовок раздела «До импорта»Сохраните исходный файл экспорта без изменений и проверенную резервную копию целевого сайта. Запишите сведения об источнике, время экспорта, ожидаемое количество записей и файлов, языки, состояние публикаций и владение медиа. Сначала выполните импорт на временный сайт назначения. Явно определите, какой раздел источника относится к каждому сайту назначения. Не выводите принадлежность из одинаковых слагов и не копируйте данные между сайтами лишь потому, что у них общая БД.
Анализ архива и сопоставление
Заголовок раздела «Анализ архива и сопоставление»Откройте Настройки → Перенос данных и нажмите Начать импорт на карточке Импорт данных. Выберите поддерживаемый источник Strapi и передайте архив, который запрашивает интерфейс. Успешный анализ архива ещё не означает, что миграция прошла приёмку. Проверьте каждый найденный тип контента, поле, связь, локаль и источник медиа. Для каждого типа выберите новую модель, существующую модель или пропуск. Осознанно сопоставьте типы полей и основной язык. Неразрешённое или неоднозначное сопоставление должно блокировать запуск. Создание моделей и добавление языков требуют соответствующих прав.
Новое поле в существующей модели не может занять ключ, под которым сохранённые версии этой модели ещё хранят значения. Тогда шаг моделей импорта отклоняется с model_change_blocked, каждый такой ключ указывается как retained_key_reuse, и поле не добавляется. Иначе старое значение могло бы вернуться в новом поле. Направьте это поле источника в другое поле или пропустите его.
Экраны импорта проходят этапы источника, обзора/сопоставления, проверки, выполнения и завершения. На экране обзора явно указываются источник и целевой сайт; принадлежность данных не определяется по предположениям.
Отменить этот импорт есть на экранах загрузки, обзора, обзора WordPress, проверки и выполнения. Кнопка сначала спрашивает подтверждение, останавливает работу на странице, отменяет задание и открывает результат. Отменённое задание освобождает сайт для другого импорта. Уже сохранённые изменения остаются. Результаты обычного импорта, который только создаёт данные, можно отменить отдельно; у обновления выбранного контента нет автоматического отката. Начать новый импорт для ещё открытого импорта сначала спрашивает подтверждение (Отменить и начать заново), отменяет его и затем начинает заново. Если задание нельзя отменить в его текущем состоянии, экран так и говорит и ничего не отправляет. Если отмену отклонили, мастер остаётся на месте и показывает причину.
Архив, чтение которого остановилось на полпути (при распаковке или анализе), открывается на шаге загрузки с пояснением. Продолжить продолжает чтение с места остановки. Отменить этот импорт вместо этого освобождает сайт.
Компоненты, динамические зоны и одиночные типы Strapi
Заголовок раздела «Компоненты, динамические зоны и одиночные типы Strapi»- Определения компонентов. Каждый компонент Strapi, который использует сопоставленный тип, становится компонентом, которым владеет этот сайт. Его слаг — категория и имя:
shared.seoстановитсяshared-seoс именем «seo (shared)». Компонент внутри компонента переносится вместе с ним. Компоненты могут быть вложены до 3 уровней ниже компонента, который называет поле, — тот же предел, что у компонентов, созданных здесь. Более глубокая цепочка, цепочка, содержащая саму себя, или значение компонента больше 5 000 значений либо больше 256 КиБ блокирует типы, которые её используют (component_nesting_too_deep,component_cycle,normalize_component_too_large), и называет цепочку или путь поля. Ничего не обрезается. - Поля. Атрибут-компонент становится полем компонента, допускающим этот компонент, — списком, если в Strapi он повторяемый. Динамическая зона становится списком блоков, допускающим компоненты зоны: каждый блок сохраняет свою позицию в источнике, называет свой компонент и версию определения и показывается.
- Значения внутри компонентов. Форматированный текст становится форматированным текстом. Файлы становятся импортированными медиа и закрепляются за версией, как любые медиа компонента. Связь внутри компонента указывает на импортированную запись. Связь с типом, который сопоставление пропускает, не попадает в компонент (
component_relation_not_imported). Связь внутри компонента показывает цель по полю заголовка цели, иначе по её полюtitle,nameилиlabel; цель без них блокирует проверку (component_relation_display_unknown). - Ключи полей в компонентах. Ключ поля компонента — строчные буквы, цифры, дефисы и подчёркивания. Атрибут Strapi, который не подходит, сохраняется под детерминированным ключом: строчные буквы, каждая серия других символов становится
_(SKUстановитсяsku). Проверка показывает каждое изменение (component_field_key_normalized), а сохранённые значения переносятся вместе с ним. Два атрибута с одним итоговым ключом или атрибут без пригодного ключа блокируют типы, использующие компонент (component_field_unmappable), и называют путь в источнике. - Связи «один ко многим» в компонентах. Значение компонента хранит порядок и цели связи, но не может закрепить цель за одним владельцем, поэтому связь «один ко многим» сохраняется как «многие ко многим». Проверка показывает это (
component_relation_remapped). Проверка отклоняет источник, где две записи ссылаются на одну цель через одно поле компонента (component_relation_target_shared), и называет поле. Выберите запись-владельца цели и исключите остальные. - Языки. Локализованный компонент или зона сохраняет значение каждого языка. Нелокализованный компонент сохраняет значение основного языка.
- Собственные компоненты сайта. Компонент, которым этот сайт уже владеет под тем же слагом и с теми же полями, используется повторно, поэтому второй импорт из того же источника ничего нового не пишет. Другие поля под этим слагом (
component_slug_taken), общий компонент с этим слагом (component_shadows_shared) или другой компонент с тем же именем (component_name_taken) блокируют проверку. - Добавление в существующую модель. Её поля для компонентов источника должны быть полями компонентов, допускающими те же компоненты с той же формой списка (
component_field_mismatch). - Одиночные типы. Одиночный тип Strapi становится моделью с одной записью: одна запись со своими языками. Экран обзора помечает его как одиночный. Проверка блокирует запуск, если выбор или существующая одиночная модель содержали бы вторую запись (
single_entry_many,single_entry_exists). - Приватные поля. Атрибут Strapi с пометкой
privateстановится приватным полем: он хранится для редакторов и никогда не отдаётся публично. Атрибуты-пароли никогда не импортируются. - Папки медиа. Папки архива Strapi 4 или 5 воссоздаются в медиатеке по сущностям папок и их связям с родителем и файлами, а не по путям файлов. Создаются только папки, в которых лежат выбранные файлы, вместе с их предками. Папка с тем же путём на сайте переиспользуется. Файл с путём папки, но без связи с папкой, импортируется без папки (Без папки) и попадает в отчёт (
media_folder_link_missing). Пробный запуск отклоняет папку, не соответствующую ограничениям медиатеки: непригодное имя, отсутствующий родитель, цикл, больше 5 уровней, сосед, отличающийся только регистром, или больше 500 папок. Ничего не переименовывается. Отмена удаляет только созданные этим заданием пустые папки. - Тип файла записан неверно. Strapi может записать для файла один тип изображения, например WebP, а байты окажутся другими, например JPEG или PNG. Импорт Strapi сохраняет такой файл по настоящему типу, если оба типа — JPEG, PNG, WebP, GIF или AVIF, настоящий тип принимает этот сайт, и оставляет имя файла. Каждый такой файл — предупреждение (
media_type_corrected) с именем файла, записанным и сохранённым типом; результат импорта показывает их отдельным блоком, а загруженная квитанция перечисляет все. Любое другое несовпадение по-прежнему блокирует файл: SVG, не изображение или тип, который сайт не принимает. Загрузки в админке это не меняет. - Права. Роли конечных пользователей Strapi (Public, Authenticated) и их права API перечисляются, но не импортируются (
strapi_permissions_not_imported). Импортированные модели публичны, как и любые новые модели; после импорта задайте видимость каждой модели. Экспорт не несёт ролей администраторов. - Обзор. Карточка типа называет каждое поле компонента по его компоненту, а динамическую зону — по её блокам. Блок Компоненты перечисляет каждое определение, которое пишет импорт, его поля и типы, которые его используют. Чтение сопоставления через API управления (
getImportMapping) возвращает тот же списокcomponentsпостранично, как иtypes. - Отмена и копия сайта. Отмена удаляет определения компонентов, записанные импортом, как только их не использует ни одно поле; определение, которое теперь использует другая модель или которое с тех пор изменили, остаётся. Копия сайта переносит определения и пересопоставляет каждую связь внутри значений компонентов на скопированные записи.
- Ещё не доказано. В записанных архивах нет повторяемого атрибута-компонента и нет приватного атрибута, кроме паролей. Оба случая следуют правилам выше, но не проверены на реальном экспорте.
Проверка, запуск и возобновление
Заголовок раздела «Проверка, запуск и возобновление»Сохраните сопоставление и выполните проверку до начала записей. Проверка не пишет контент сайта, только состояние проверки в задании. Пока она идёт, Запустить проверку становится Остановить. Остановить останавливает только эту страницу: уже идущий запрос может завершиться. Остановленная или незавершённая проверка так и показывается, а Проверить снова запускает её снова. Устраните блокирующие замечания. Сохраните принятое сопоставление вместе с архивом. Адрес каждой записи — slug источника или выбранное поле URL, нормализованные по правилам адреса записи. Адрес без букв и цифр блокирует проверку (slug_invalid). Если выбранное поле URL содержит адрес, отличный от значения поля slug записи, проверка тоже блокируется (slug_conflict). Берите URL из slug или сделайте их одинаковыми. Проверка оценивает каждую запись по правилам полей назначения, включая обязательные связи и медиа и число их элементов. Это верно, есть у записи ссылки или нет. Запускайте только нужное задание и сайт. После прерывания возобновляйте это задание, а не создавайте другое с новой идентичностью источника. Повторяемый запуск не разрешает игнорировать отказы или перезаписывать строки другого сайта.
Проверка рассматривает типы контента и компоненты получателя такими, какими они были в момент её запуска. Если позже добавлено поле, поле переименовано на какой-то ключ или поле компонента начинает разрешать ещё один компонент, запуск отклоняет каждую запись или перенесённую версию, у которой есть значение под ключом, занятым этим изменением: 409 import_definition_changed с названием ключа. Повторный запуск этого не меняет, потому что архив и его значения остаются прежними. Из такой записи или версии ничего не записывается, а уже записанное остаётся. Дайте новому полю другой ключ и продолжите запуск. Импорт записей и версий без значения под этим ключом продолжается. Поле, которое добавляет сам импорт, изменением не считается. Пока изменение компонента удерживает тип контента, запись в него ждёт (component_migration_in_progress) и продолжается после его завершения.
Копия сайта и файл истории также содержат приватные файлы: их содержимое, контрольные суммы и настройки видимости. Если в установке не настроено приватное хранилище файлов, проверка останавливает импорт с private_storage_unavailable до записи любых данных. Запуск кладёт каждый приватный файл в это хранилище и никогда в публичный бакет, а отмена убирает его оттуда. Модель, отмеченная в файле как приватная, сохраняется на целевом сайте с той же видимостью. Если модель с тем же ключом уже есть здесь как публичная, проверка блокирует с model_visibility_public, чтобы приватные записи никогда не показывались публично. Для сборки такого файла нужны data:export и доступ на чтение к медиатеке; экспорт только содержимого (CSV, JSON, XLSX) никогда не зависит от приватных файлов медиатеки. См. Медиа.
Копия сайта и файл истории также содержат определения полей исходного сайта. Переносимое значение сохраняет исходный ключ своего поля, даже если поле позже удалили в источнике. Поле целевого сайта с таким же ключом не считается тем же полем. Если у типа контента или компонента этого сайта есть поле под ключом, под которым лежит такое значение, а в определении исходного сайта этого ключа не было, проверка блокирует запуск с unmapped_source_key и называет ключ (component.key внутри компонента). Это верно и для поля, которое было здесь до проверки, и для добавленного позже. Это касается перенесённых версий, опубликованной версии языка в копии сайта, а также опубликованных и текущих значений. Запуск отклоняет такое значение с 409 unmapped_source_key при каждой попытке и ничего из него не записывает. Дайте полю этого сайта другой ключ и выберите Проверить снова. Поле, добавленное после проверки, сначала отклоняется как import_definition_changed. Поля под ключами, которых не использует ни одно перенесённое значение, и поля, которые добавляет сам импорт, это не затрагивает.
Приватность источника тоже переносится. Если источник держит поле приватным, а поле этого сайта под тем же ключом публичное, проверка блокирует запуск с source_private_value. Это касается и приватного атрибута компонента, и приватного поля компонента вокруг него. Запуск отклоняет такое значение с 409 source_private_value. Замечания и отказы называют ключи, но никогда не значения. Сделайте поле этого сайта приватным в редакторе модели или компонента и выберите Проверить снова. Публичное поле источника можно импортировать в приватное поле здесь.
Проверка также отклоняет значение, которое здесь не смогло бы записать ни одно сохранение. Если опубликованная, текущая или языковая версия содержит ключ, которого у типа контента назначения не будет, запуск упал бы с unknown_fields. Проверка блокирует это раньше с unsupported_source_key и ничего не записывает. Если источник этот ключ больше не определяет, сохраните и опубликуйте запись в источнике без этого значения, экспортируйте новый файл и импортируйте его. Отклонённый файл остаётся привязанным к своему заданию. Если источник ключ всё ещё определяет, а у типа контента этого сайта его нет, добавьте поле здесь (приватное, если в источнике оно приватное) и выберите Проверить снова. Старые перенесённые версии могут хранить удалённый ключ, потому что здесь его ничто не читает.
Храните источник, сопоставление и итог завершения/отказа вместе. Проверьте первичные записи, переводы, связи, используемые медиа и состояние публикации относительно ожидаемого раздела источника. Сверяйте количества по сайту и модели, а не только общий итог. Убедитесь, что назначение A не читает импортированные записи назначения B.
Отмена и застрявшие файлы
Заголовок раздела «Отмена и застрявшие файлы»Для обычного импорта, который только создаёт данные, отмена на экране завершения убирает только то, что создало задание. Обновление выбранного контента не поддерживает автоматический откат. Обработка файла может зависнуть, если предыдущая операция записи при импорте или удаления при отмене не вернула результат. Тогда отмена ждёт его и не может завершиться сама. Для каждого такого файла раздел отмены показывает Файл застрял.
Экран показывает сайт, задание, элемент, старый ключ хранилища, ожидаемый дайджест, чего ждёт отмена, когда отмена последний раз проверяла ключ, и результат проверки ключа, выполненной при загрузке экрана. Ещё используется здесь показывает, использует ли эти байты строка медиа на этом сайте.
Чтобы завершить, отметьте подтверждение и выберите Оставить старый ключ и завершить. Нужно право data:import. Незавершённая запись или удаление ещё может позже сработать на старом ключе, и потом этот ключ никто не очистит. Старый ключ остаётся занятым навсегда и больше не используется. Квитанция фиксирует решение: кто, когда, показанные доказательства и подтверждение. Если ключ изменился после загрузки экрана, действие отклоняется. Выберите Проверить снова и решайте по новым данным.
Если байты снова появились на старом ключе и их не использует ни одна строка медиа, действие заблокировано. Сначала выберите Продолжить откат: она удалит эти байты. Повторный импорт того же ресурса пишет в новый ключ.
Файлы Dee Wan
Заголовок раздела «Файлы Dee Wan»Копия сайта содержит текущий контент, отличающиеся опубликованные версии, модели, поля, языки и медиа. История правок, аккаунты и учётные данные в неё не входят. Настройки, определения рабочих процессов и документы контекста генерации включены только для сравнения; при импорте они не применяются. Для всех сохранённых версий контента и событий рабочего процесса выберите Перенос с историей. Ни один из этих файлов не заменяет резервную копию установки.
Новые копии сайта и переносы с историей скачиваются в формате .deewan. Загружайте их через тот же мастер импорта. Создание файла, загрузка, проверка загруженного архива, подготовка и импорт продолжаются с сохранённого места. Если скачивание прервалось, откройте сохранённое задание экспорта и продолжите. В Brave выбранный файл записывается на диск проверенными частями. Если выбор файла недоступен, остаётся обычное скачивание средствами браузера.
Для этих файлов больше нет прежнего ограничения в 20 000 строк истории или 64 МиБ на архив. Максимальный размер загружаемого архива — 52 428 800 000 байт (около 48,8 ГиБ с учётом служебных данных). Проверка читает не более 32 МиБ за запрос и после прерывания продолжается по ID задания: загружать файл заново не нужно. К отдельным медиафайлам применяются обычные ограничения целевой установки: до 5 ГБ, если это разрешено настройками. Файлы переносятся частями и проверяются по контрольной сумме целого файла. Закрытые оригиналы и их превью остаются закрытыми. Сайт назначения должен разрешать тип и размер файла. Слишком большая запись или отсутствующий файл не пропускаются молча: подготовка или проверка показывает причину отказа, а задание можно продолжить.
Размер одной записи ограничен 8 МиБ. Конфигурация одной модели или набор зависимых компонентов может занимать до 16 МиБ; при обработке одного элемента импорта загружается не более 32 МиБ. Если элемент нельзя обработать за один ограниченный проход, система сообщает причину отказа. Разбиение архива не отменяет ограничения на отдельный элемент. Большие группы событий рабочего процесса переносятся частями, без усечения примечаний. Каждое событие вместе с примечанием и идентификаторами должно укладываться в 1 900 000 байт на строку базы данных (workflow_event_too_large).
Списки людей и назначений разбиты на страницы. Предложения применяются только к текущей странице списка людей; сохранённые решения не сбрасываются при переходе. Для CSV и XLSX действуют отдельные ограничения по строкам и размеру. Старые JSON-файлы сайта по-прежнему можно импортировать: до 64 МиБ на архив, 32 МиБ на вложенный файл и 10 000 символов в примечании к событию рабочего процесса.
Перенос структуры модели
Заголовок раздела «Перенос структуры модели»Переключитесь на сайт назначения и откройте Конструктор контента → Сравнить модели. Выберите доступные исходный сайт и модель. Модели сопоставляются по стабильному слагу API, поля — по ключу; переведённые подписи не определяют их идентичность.
Нажмите Сравнить, отметьте параметры модели и добавления, изменения или удаления полей, затем сравните выбранные изменения. Удаления изначально не отмечены. Проверить изменения создаёт предложение и открывает обычный редактор модели. Сохранить применяет его только после успешной проверки совместимости. Для создания модели нужно явно выбрать поля. Контент, права, процессы и учётные данные не копируются.
Сравнение фиксирует определения обоих сайтов. Если определение изменилось или доступ к исходному сайту отозван, сравните заново. Обычные проверки защищают сохранённые значения, прошлые определения, цели связей, компоненты и уникальность; принудительной несовместимой перезаписи нет. Поле с сохранённым ключом сохраняет ID на сайте назначения; новому полю назначается новый ID.
Административные эндпоинты: POST /api/models/promotions/check и POST /api/models/promotions/propose. Запрос указывает source_site_id, source_model_id, target_model_id (null для новой модели) и selection: { metadata, fields, remove }. Для propose также нужны source_revision и target_revision из проверки. Предложение проходит обычную проверку и применение; несовпадение ревизий возвращает schema_promotion_stale.
Обновление выбранного контента
Заголовок раздела «Обновление выбранного контента»На экране Проверка импорта выберите Обновить выбранный контент, чтобы обновить заполненный тестовый сайт CMS из новой копии сайта. Обычный импорт по-прежнему добавляет недостающие записи и пропускает уже импортированные. Для файлов истории и импорта WordPress предусмотрены отдельные процессы.
- Загрузите свежую копию сайта в мастере импорта на целевом сайте и дождитесь её подготовки.
- Выберите Обновить выбранный контент, затем отметьте до 50 моделей. Определения полей в копии и на целевом сайте должны совпадать.
- Нажмите Проверить изменения. Просмотрите количество изменений и все страницы с добавляемыми, обновляемыми, удаляемыми в корзину и сохраняемыми записями. Запись целевого сайта, которой нет в копии, будет удалена в пределах выбранных моделей, даже если её создали вручную. Сопоставление использует идентификатор источника, а не сходство названий или адресов.
- Устраните проблемы. На удаляемую запись может ссылаться контент из другой модели. Включите нужную модель в обновление или отметьте Оставить запись у целевой записи и проверьте изменения ещё раз. Можно сохранить до 200 отдельных записей. Выбор сохраняется при переходе между страницами и перезагрузке.
- Подтвердите замену без возможности отмены и нажмите Применить план обновления. Затем выполните обычные действия Запустить проверку и Начать импорт. Подтверждение плана само по себе не меняет контент.
Обновление согласует связи выбранных записей и необходимые медиафайлы. Другие модели, аккаунты приложений, роли и настройки сайта сохраняются. Удалённые в источнике записи перемещаются в корзину, а не удаляются навсегда. Если после проверки целевой сайт изменился, обновление остановится: новые правки не будут перезаписаны. До начала импорта проверьте изменения ещё раз. Если хотя бы один пакет уже выполнен, отмените задание и загрузите текущую копию источника как новое задание, чтобы проверить оставшиеся изменения. Уже внесённые правки сохранятся.
Автоматической отмены обновления нет. Перед запуском сохраните резервную копию целевого сайта. Действие Отменить этот импорт останавливает следующие пакеты, но сохраняет уже внесённые изменения. Ход выполнения и отчёт сохраняются: тот же импорт можно открыть и продолжить. Обновление не является одной атомарной операцией для всех записей и файлов.
Внешняя ссылка не может снова использовать URL сохранённой неизменяемой версии или менять записанные для него характеристики файла. Проверка отклоняет такую замену с кодом refresh_linked_media_retained; существующие версии сохраняются.
В модели с одной записью можно обновить запись, уже связанную с тем же идентификатором источника. Другой идентификатор источника не может заменить существующую запись, даже если она в корзине. Проверка останавливается с кодом single_entry_taken: записи не сопоставляются по адресу, а существующая запись не удаляется навсегда.
Перенос сайта с историей
Заголовок раздела «Перенос сайта с историей»Действие Настройки → Перенос данных → Перенос с историей переносит один сайт в другой сайт, в котором ещё нет записей. Переносятся все сохранённые версии и история рабочего процесса. Это отдельный файл, а не расширенная копия сайта. Скачать файл истории создаёт его на исходном сайте. Импортировать файл истории на сайте назначения открывает тот же мастер, проверку, запуск, отмену и квитанцию, что и для копии сайта.
Файл (формат переноса 1, данные истории 3.1) содержит модели, контент, языки, изображения и файлы, фрагменты форматированного текста, все сохранённые версии каждой записи, копии изображений, которые эти версии показывают, шаги рабочего процесса каждой записи, элементы Корзины, текущие назначения и то, кому приписаны каждая запись, файл и комментарий вошедшего пользователя. Люди переносятся только как метки с именем или email, никогда как аккаунты. Не переносятся аккаунты, сессии, пароли, ключи доступа (passkeys), API-токены, учётные данные управления, ключи ИИ, настройки и секреты развёртывания, журнал аудита администраторов, установки плагинов, планы, запуски и очередь планировщика, а также задания и квитанции импорта. Проверка показывает этот список.
Элементы Корзины попадают в Корзину. Они не появляются на публичных страницах и в обычных списках, сохраняют свои версии, ссылки, файлы и комментарии и хранятся 30 дней с момента завершения импорта. Назначение сохраняет email исходного исполнителя и срок. Во время проверки Назначения предлагают активного участника этого сайта с точно таким email, который может выполнить следующий шаг по записи. Оставьте предложение, выберите другого участника, который может действовать, или выберите Без назначения. Никто не получает от этого аккаунт или доступ. Если совпадения нет или к запуску импорта человек больше не может действовать, запись приходит без назначения с предупреждением. Перенесённое назначение уведомлений не отправляет. Импорт по умолчанию тихий; чтобы его собственные переходы по рабочему процессу уведомляли, отметьте Уведомлять проверяющих об изменениях проверки в этом импорте на экране запуска. Выбор хранится в задании и сохраняется при обработке каждого фрагмента, запуске без браузера, возобновлении и повторе; менять его можно во время работы с тем же правом data:import. См. отзывы и уведомления.
Сопоставление людей с участниками этого сайта
Заголовок раздела «Сопоставление людей с участниками этого сайта»Файл истории и экспорт WordPress указывают авторов контента и действий: автора каждой версии, исполнителя каждого шага рабочего процесса, создателя записи, пользователя, загрузившего файл, и автора каждого комментария вошедшего пользователя. Автор WordPress указывается по отображаемому имени; логин и email никогда не хранятся. Во время проверки раздел Люди перечисляет каждого из них и то, что ему приписано.
- Сопоставить с выбирает активного участника этого сайта. Если участников много, используйте поиск.
- Предлагается участник, email которого точно совпадает с email источника. Предложение ничего не делает, пока вы его не примете. Принять подсказки на странице ({count}) принимает предложения для людей на текущей странице переноса, по которым ещё нет решения. Для старых файлов JSON и WordPress кнопка Принять {count} предложений принимает сразу все такие предложения. Уже сделанный выбор остаётся.
- Не сопоставлено сохраняет имя или email из источника как метку.
Сопоставленная строка показывает Сопоставлено с {email} (источник: {label}). Затем импорт приписывает контент участнику и сохраняет рядом метку источника: в перенесённых версиях и шагах рабочего процесса, в каждой записи (участник становится её владельцем), в каждом файле и в комментариях вошедших пользователей. Назначение использует сопоставленного участника как предложение. Несопоставленные люди остаются метками; их записями владеет тот, кто запускает импорт. Комментарии посетителей сохраняют имя посетителя, сайт и email.
Сопоставление никогда не создаёт учётную запись и не предоставляет доступ к сайту и не копирует пароль, сессию, способ входа или аккаунт. Проверка блокирует запуск, если сопоставленный участник больше не является здесь активным участником. Запуск снова проверяет каждое сопоставление перед записью и останавливается с principal_mapping_invalid, если доступ изменился после проверки. Верните участнику доступ или отмените импорт. Повторный экспорт сайта несёт метки источника и никогда не несёт id аккаунтов. Участник, которому принадлежат сопоставленные записи, считается владельцем для прав на «свой контент»; оператор только с правами на «свой контент» не может отменить импорт записей, переданных другому пользователю. Экспорт Strapi не содержит сведений об авторах в формате, который поддерживает это сопоставление.
Проверка блокирует запуск, если на сайте назначения уже есть записи, включая Корзину. Она также блокирует запуск, если Версий на элемент (Настройки → Процесс → История версий) меньше, чем нужно самой длинной перенесённой истории, или если перенесённая версия использует язык или показывает изображение, которых нет в файле. Она блокирует перенесённое значение под ключом, используемым полем целевого сайта, если такого ключа не было в определении исходного сайта (unmapped_source_key, см. Проверка, запуск и продолжение). Старая версия, которая ссылается на запись, отсутствующую в файле, переносится без этой ссылки, и проверка перечисляет удалённые ссылки. Текущая и опубликованная версии следуют правилам копии сайта, поэтому неразрешённая ссылка в них по-прежнему блокирует. Перенесённые версии сохраняют номера, время и метки авторов из источника, а в истории они отмечены как Импортирована. Собственные версии импорта идут после них и снова содержат опубликованное и текущее состояние, поэтому этот контент виден в истории дважды: как версия Импортирована и как собственная версия импорта. Перенесённые шаги рабочего процесса показаны в Импортированная история workflow ({count}) и никогда не меняют рабочий процесс записи. Отмена удаляет всё, что создало задание, включая историю, даже когда импортированные записи ссылаются друг на друга. Отмена не трогает то, что изменили после импорта, и то, на что такая изменённая запись всё ещё ссылается. Верните изменение, затем выберите Повторить оставшиеся элементы. Перенос с историей не является восстановлением: ID меняются, а аккаунты не переносятся.
Импорт из WordPress
Заголовок раздела «Импорт из WordPress»В WordPress откройте Tools → Export, выберите All content и скачайте файл .xml. В разделе Настройки → Перенос данных нажмите Начать импорт на карточке Импорт данных, выберите Файл экспорта WordPress, назовите сайт WordPress, выберите назначение и загрузите файл. Используйте одно и то же имя для всех следующих экспортов с этого сайта, чтобы повторный импорт пропускал то, что уже перенесено. Читается только экспорт WordPress формата 1.2 в UTF-8, не больше 8 MiB. Экспорт, в котором один и тот же ID записи или вложения встречается дважды, отклоняется (wxr_item_duplicate).
Медиафайлы, которые называет экспорт, копируются один раз, до обзора: не больше 5 000, только с https-адресов на публичных хостах и только типов, которые принимает Dee Wan, причём байты должны подтверждать тип. Файл, который не удалось скопировать, обзор считает в Не скопировано, а отчёт проверки называет его.
Записи, категории, метки, авторы (как упомянутые люди), комментарии и медиа попадают в блог сайта. Страницы попадают в тип страниц. Проверка блокирует запуск, пока на сайте нет блога с добавленными категориями, метками и людьми (wordpress_blog_taxonomy_missing). В обзоре выберите Язык содержимого среди языков этого сайта, а в Куда попадут страницы — тип страниц для страниц WordPress или Не переносить страницы. Если на сайте ровно один тип страниц, он уже выбран; если типов страниц нет, страницы не переносятся. Опубликованные записи и страницы публикуются, черновики приходят черновиками. Изображение записи (featured image) становится её cover.
Материалы со статусом pending, закрытые и защищённые паролем остаются черновиками. Закрытый доступ и пароли не воссоздаются; пароли нигде не сохраняются. Для статуса future явно выберите Сохранить расписание или Импортировать как черновики. В проверке показано исходное время wp:post_date_gmt; часовой пояс источника не угадывается. Сохранение расписания требует установленного и активного плагина Scheduling с доступом к модели и подходящим переходом публикации. Отсутствующее, неверное или прошедшее время UTC либо недоступный Scheduling блокируют проверку с указанием причины. Публикация закрепляется за последней версией, сохранённой этим импортом; последующие правки требуют отдельной проверки. При импорте черновиков исходное время UTC и местное время остаются в проверке и wordpress-plugin-data.json. Возобновление не создаёт повторного расписания. При отмене импорта сначала отменяется неизменённое расписание, созданное этим заданием. Если это невозможно, его материалы сохраняются.
Раздел Произвольные поля в обзоре перечисляет произвольные поля записей, имена которых не начинаются с _. Поле с одним простым значением на запись можно перенести в поле записи блога, тип которого принимает каждое значение (текст, одиночный выбор, среди вариантов которого есть это значение, число, да/нет или дата), или не переносить. Ничего не выбрано заранее, и поля не создаются. Произвольное поле с несколькими значениями в одной записи или с сериализованным или составным значением есть в списке, но сопоставить его нельзя. Если в экспорте таких полей нет, раздел скрыт. Выбор сохраняется кнопкой Сохранить и продолжить. Поле, удалённое или изменённое после сохранения, блокирует проверку (wordpress_metadata_mapping_invalid). Запись, которую уже создал прежний импорт, сохраняет свои значения: изменение выбора произвольных полей не обновит её при следующем импорте.
Раздел Свои типы записей в обзоре перечисляет каждый произвольный тип записей и каждую произвольную таксономию экспорта (например, тип event с таксономиями venue и event_tag). Для каждого выберите Новая модель «{name}» (по умолчанию; она создаётся на шаге моделей импорта), существующую модель этого сайта или Не переносить. Если на сайте уже есть модель с именем из WordPress, выбрана она и заполняется поле за полем там, где совпадает ключ поля. Откройте Поля, чтобы для каждого поля источника выбрать поле, в которое оно попадает, или Не переносить. Новая модель получает заголовок, содержимое (форматированный текст), отрывок, изображение записи, дату публикации, каждое поле Advanced Custom Fields (ACF), которое определяют группы полей экспорта, простые публичные значения как текст и по одному полю ссылки на каждую произвольную таксономию. Произвольная таксономия сохраняет имя, описание, родителя (у иерархических таксономий) и поля терминов ACF. В модели, которая уже есть на сайте, поле источника попадает в поле, способное вместить каждое значение, либо для него создаётся Новое поле ({type}) под собственным ключом, если в модели нет поля с таким ключом; больше ничего в этой модели не меняется. Поля ACF и произвольные таксономии записей блога предлагаются так же в разделе Записи: каждое может стать новым полем записи блога, попасть в существующее или не переноситься (по умолчанию). Выбор, который больше не действует, блокирует проверку (wordpress_model_choice_invalid); непереносимый тип или таксономия даёт предупреждение (wordpress_type_left_out, wordpress_taxonomy_left_out). Произвольные элементы следуют правилу «создать или пропустить», как записи: второй импорт того же источника пропускает уже созданные им элементы, термины и модели и не обновляет их. Если у элементов произвольного типа есть комментарии, флажок Перенести {count} комментариев включён: они приходят на модерацию, как комментарии блога, и модель открывается для комментариев (новая модель создаётся с включёнными комментариями; у существующей комментарии включаются на шаге моделей импорта, и отмена их не выключает). Снимите флажок, чтобы не переносить их (wordpress_comment_type_left_out).
Отрывки и изображения записи сохраняются только через сопоставление, которое вы проверяете; по умолчанию ничего не сопоставлено. В разделе Свои типы записей раздел Записи показывает отрывок: он попадает в существующее текстовое поле записи Блога, становится новым полем или остаётся без места. Изображение записи всегда становится её cover и может также попасть во второе поле изображения. Раздел Страницы показывает отрывок и изображение записи, когда в экспорте есть такая страница и выбран тип страницы: каждое значение попадает в текстовое поле или поле изображения этого типа страницы, становится новым полем со своим ключом или остаётся без места. Смена типа страницы сбрасывает выбор для страниц. Несопоставленное значение попадает в отчёт проверки со счётчиком (wordpress_excerpt_not_kept, wordpress_featured_image_not_kept) и называется у каждого элемента; изображение записи, вложение которого не импортировано как изображение, называется у своего элемента.
Типы полей ACF сопоставляются по настройкам, которые несёт экспорт: text, email, URL, oEmbed, color и time становятся текстом; textarea — многострочным текстом; WYSIWYG — форматированным текстом; number и range — числом; true/false — значением да/нет; select, radio и button group — выбором; checkbox — множественным выбором; date picker — датой; link — своим URL как текстом (текст ссылки и target названы как не сохраняемые); image и file — медиа, указывающими на скопированное вложение; relationship и post object — ссылкой на импортированный элемент, только когда все разрешённые типы записей попадают в одну модель. Группы и повторители ACF с определениями из экспорта становятся редактируемыми полями JSON. Вложенность и порядок строк сохраняются. Структура не выводится из названий метаданных. Неподдерживаемые вложенные поля, несовпадающие определения и неразрешённые ссылки на записи или медиа явно перечисляются при сопоставлении и остаются в файле данных плагинов.
Значения Yoast SEO попадают в настройки поиска и распространения каждой записи, страницы и произвольного элемента: SEO-заголовок, мета-описание, канонический адрес (только https или путь на сайте), изображение Open Graph или Twitter и noindex. Заголовки и описания Open Graph и Twitter заполняют только то, что Yoast оставил пустым. Шаблон заголовка разрешается, только когда каждая его переменная — из тех, на которые отвечает экспорт (%%title%%, %%sitename%%, %%sitedesc%%, %%excerpt%%); шаблон с %%sep%% или другой настройкой Yoast не сохраняется и называется. Ключевое слово фокуса, заголовок хлебных крошек, cornerstone, nofollow, расширенные настройки robots, тип schema и основная категория называются и сохраняются в файле данных плагинов.
Кнопка Данные плагинов в обзоре скачивает wordpress-plugin-data.json: всё, что импорт не читает, — группы полей ACF, типы записей и таксономии, синхронизированные паттерны и блочную навигацию, каждое несопоставленное мета-значение элемента или термина (настройки Yoast, кеши oEmbed, несопоставленные значения ACF), блоки плагинов, пользовательский HTML и шорткоды без эквивалента, а также ключи мета комментариев. Файл строится из экспорта и сохранённого выбора, поэтому меняется при изменении выбора. Клиенты API управления читают его как артефакт импорта plugin_data.
Изображение в тексте записи или страницы, адрес которого точно совпадает с адресом файла или GUID вложения из того же экспорта, указывает на скопированный файл. Уменьшенная копия вроде photo-300x200.jpg, изображение на другом хосте и изображение, файл которого не скопирован, — потери, у каждой своя причина. Классический текст (до блочного редактора) читается так, как его показывает WordPress: пустые строки разделяют абзацы; в блочном тексте разметка между блоками сохраняется. Блоки, у которых есть эквивалент, преобразуются: галереи, таблицы (строки подвала становятся последними строками), встраивания YouTube и Vimeo (с заголовком из кеша oEmbed экспорта), блоки файлов, цитаты и выносные цитаты (подпись становится последней строкой), details (жирная строка над текстом), кнопки (ссылки), изображения с подписями (абзац под изображением), шорткоды [caption] и [gallery] и синхронизированные паттерны (копируются внутрь). Колонки, группы, обложки, «медиа и текст», цвета, отступы и маркер «more» сохраняют свои слова, изображения и ссылки; раскладка отбрасывается и называется как не сохраняемая. Блоки плагинов, динамические блоки и пользовательский HTML остаются потерями. Ссылка, адрес которой точно совпадает с адресом файла вложения, указывает на скопированный файл. На страницах встроенное видео становится видео в медиасекции, блок details — секцией FAQ, обложка с текстом — секцией hero, а цитата или выносная цитата с подписью — отзывом; ссылка на скопированный файл вложения сохраняется как файловый блок в форматированном тексте. Запись, страница или комментарий, которые нельзя перенести точно, например из-за такого изображения, шорткода или разметки в заголовке, не переносятся, если в Что нельзя перенести без потерь не выбрать Перенести с потерями. Отчёт проверки перечисляет, что теряет каждый из них.
Страница становится структурированным документом страницы. Уровни заголовков, блоки кода, таблицы, цитаты, списки, ссылки, поддерживаемое форматирование и скопированные файлы сохраняются в форматированном тексте. Длинное содержимое разбивается на полные текстовые секции, а не обрезается после прежнего лимита преобразования в 24 секции. Одна такая секция вмещает до 256 КиБ, страница — до 24 секций. Блок или страница сверх этих ограничений отклоняются целиком, даже если вы разрешили другие потери. Простые страницы сохраняют обычные текстовые и медиасекции. Импортированный форматированный текст можно менять в обычном редакторе. Заголовок, адрес и состояние черновика или публикации сохраняются. В разделе Свои типы записей сопоставьте свои поля и поля ACF страницы с совместимыми полями выбранного типа страницы. Несопоставленные и неподдерживаемые значения остаются в файле данных плагинов. Родительская страница, шаблон темы, порядок в меню и автор перечисляются в отчёте: импорт их не угадывает. Отрывок и изображение записи требуют проверенного сопоставления (см. Отрывки и изображения записи).
Если WXR содержит метаданные Rank Math и не содержит метаданных Yoast, поддерживаемые заголовок, описание и канонический адрес Rank Math заполняют те же настройки. Из данных экспорта подставляются только %title%, %sitename%, %sitedesc% и %excerpt%. Неразрешённые переменные и неподдерживаемые настройки остаются в файле данных плагинов. Отсутствующие значения не придумываются. Если значения есть у обоих плагинов, используются значения Yoast, а данные Rank Math остаются в файле данных плагинов.
Комментарии приходят на модерацию. Экспорт WordPress не хранит, принял ли комментатор форму комментариев этого сайта, поэтому каждый импортированный комментарий хранится без согласия, остаётся в ожидании (или в спаме, если так отметил WordPress) и не виден посетителям. В разделе Записи → Комментарии у него метка Нет согласия. Чтобы показать комментарий, выберите Опубликовать импортированный комментарий…, по одному комментарию. Это ваше решение опубликовать его снова, а не запись о согласии: метка Нет согласия остаётся, а раздел Настройки → История записывает, кто опубликовал. Одобрение выделенных комментариев пропускает такие комментарии. Отклоните или удалите те, что не нужны. У комментария сохраняются запись, родитель ответа, имя, необязательный личный email, необязательный сайт, текст и дата. Пингбэки, трекбэки, комментарии в корзине WordPress, комментарии к страницам и к неперенесённым записям, ответы на ответы (в ветке блога один уровень ответов), ответы без родителя и зацикленные цепочки родителей не переносятся и перечисляются. Комментарий с разметкой сохраняет только текст и переносится, если принять потери; его ответы идут за ним.
Элементы с любым статусом, кроме опубликованного, черновика, ожидающего проверки, запланированного, личного или защищённого паролем, типы записей и таксономии, которые вы не переносите в обзоре, и данные SEO-плагинов, кроме описанных выше полей Yoast, перечисляются в отчёте проверки и не импортируются; непрочитанные данные плагинов сохраняются в файле данных плагинов.
Меню — часть импорта. Для них нужно право site:settings. Каждое меню экспорта становится меню Site Chrome в своей принятой версии, в порядке экспорта. Меню, его версия Site Chrome и запись импорта о нём сохраняются вместе или не сохраняются вовсе. Пункт переносится, если указывает на перенесённую запись, страницу, категорию или метку или на https-адрес. Порядок пунктов сохраняется, с одним уровнем пунктов под пунктом верхнего уровня. Пункт, который указывает на неперенесённое, адрес не по https и всё, что вложено глубже, пропускаются и перечисляются по пунктам. Пункт без адреса остаётся заголовком над перенесёнными пунктами под ним. Открытие в новой вкладке, CSS-классы, атрибуты связи, атрибуты title и описания не сохраняются. Следующий импорт из того же источника обновляет меню, только пока оно точно такое, каким его записал прошлый импорт: он добавляет пункты, которые теперь переносятся, в порядке экспорта и не дублирует пункты. Размещение меню остаётся как было. Меню, которое кто-то изменил, и меню с таким ключом, которое не записывал ни один импорт из этого источника, остаются как есть и перечисляются в отчёте проверки и в итоговом отчёте. Повторный импорт того же экспорта ничего не меняет. Отмена идёт от новых к старым: отмена последнего импорта возвращает меню к версии до него, а более ранний импорт нельзя отменить, пока меню принадлежит более позднему. Меню не размещаются: выберите, где они появятся, в Site Chrome.
Отмена сначала удаляет меню, затем комментарии (ответы раньше комментариев, на которые они отвечают), затем записи, страницы, термины, людей и медиа. Меню, которое размещено, изменено после импорта или обновлено более поздним неотменённым импортом, остаётся и перечисляется.
Переключение или остановка
Заголовок раздела «Переключение или остановка»На временном сайте назначения проверьте типичные публичные страницы во всех нужных локалях, доступ к приватным моделям, байты и URL медиа, а также явное снятие с публикации. Перед production-переключением согласуйте с оператором остановку редактирования источника и финальный экспорт. Перенаправляйте трафик только после прохождения полного набора проверок. Сохраняйте исходный сервис и резервную копию назначения до приёмки владельцем.
Неудачная или частичная миграция не является успешным переключением. Для отката нужны сохранённые состояние развёртывания, БД и медиа, а не второй импорт, угадывающий прежнее состояние. Следуйте резервному копированию и восстановлению. Копирование нативного пакета сайта и перенос CSV/XLSX — другие процессы. Копия сайта получает новые ID и не является полным восстановлением. Ни копия сайта, ни файл истории не переносят планы, запуски и элементы очереди планировщика; черновики, которые сохранил планировщик, переносятся как обычные записи.
Источники: backend/src/lib/import/, backend/src/lib/import/bundle-handlers.ts и frontend/src/routes/settings/components/data-transfer/. Никакая команда здесь автоматически не изменяет провайдера или production-систему.
Подключение WordPress
Заголовок раздела «Подключение WordPress»Выберите WordPress, назовите источник и выберите сайт назначения. На экране Импорт из WordPress выберите Загрузить файл экспорта или Подключиться к WordPress. Для подключения введите HTTPS-адрес, имя пользователя и пароль приложения WordPress. При ошибке показывается причина, а данные сохраняются для повторной попытки; после успешного получения пароль очищается. Учётные данные остаются в памяти браузера и не попадают в WXR или артефакты переноса. Каждый запрос читает одну страницу API WordPress, до 50 строк. Междоменные перенаправления запрещены.
Доступные через REST записи, страницы, типы, таксономии, пользователи, комментарии, медиа и меню превращаются в WXR и проходят обычную проверку, импорт, квитанции и отмену. Ограничения: снимок 8 МиБ, 200 запросов, 100 страниц на ресурс, 64 ресурса и 2 МиБ на ответ. Отсутствующие сведения о пагинации или файлы логотипа/значка останавливают получение. Пропуски показываются при проверке.
Замена настроек сайта выключена по умолчанию. Явное согласие переносит проверенные название, слоган/SEO-описание, логотип, значок и переданную настройку индексации. Проверка версии целевого сайта защищает от перезаписи параллельных изменений. Файлы темы и произвольные настройки WordPress не переносятся.
Применение настроек требует прав импорта и site:settings. Принятая версия Site Chrome и квитанция импорта записываются одним защищённым пакетом. Повторный импорт меняет только настройки, которыми ещё владеет квитанция источника; параллельная правка назначения блокирует замену. Отмена следует владению квитанции и возвращает прежние настройки, не затирая последующие правки. Логотип/иконка сопоставляются с импортированными медиа назначения; управляемый и сгенерированный рендереры используют принятый бренд и favicon. Если WordPress не передал индексацию, сохраняется настройка назначения. Часовой пояс, код темы, произвольные options и настройки плагинов этим выбором не переносятся.
Нативный формат bundle 1.16 переносит дерево папок записей и текущие размещения; формат истории 3.1 также переносит отдельную историю размещения с метками исходных авторов. ID сопоставляются с записями и папками назначения. Отмена по квитанции удаляет импортированные эффекты и сохраняет последующие локальные правки. Текущие обработчики импорта требуют эти форматы, включая entry-folders.json; старые файлы нужно заново экспортировать из соответствующего источника.
Повторно используемые ссылки внутри rich-блоков
Заголовок раздела «Повторно используемые ссылки внутри rich-блоков»Формат копии сайта 1.16 и формат истории 3.1 требуют rich-relations.json. Файл с количеством и
контрольной суммой указывает позиции исходных ссылок во вложенных и повторяемых rich-блоках и
приватных сниппетах. Импорт сначала создаёт записи на целевом сайте, затем подставляет их ID в ссылки.
Нет текущей цели — проверка или применение блокируются. Исключённая цель старой истории получает
обычное именованное предупреждение об удалённой связи. Установленные плагины, предоставленный доступ и учётные данные
не копируются.
export_rich_relation_schema_unavailable означает отсутствие подходящей исходной декларации блока.
Восстановите декларацию на источнике и повторите экспорт. Хранимый блок остаётся прежним.
Декларация назначения не определяет, какие строки источника являются ссылками.
Стабильная версия ещё не выпущена (pre-MVP)
Коммит исходного кода: fe23db481c422b40e317b92fc98116b4c0c26a87 (с локальными изменениями)
Дата сборки (UTC): 2026-10-18T09:22:34.630Z
Коммит для обновления: не определён: в рабочей копии есть изменения. Примечания к выпуску