Перенос WordPress с сохранением URL
При обновлении мы связывали файлы, базу и проверенные сценарии. Перенос WordPress требует той же связи, но добавляет изменение окружения и адреса хоста. Рассмотрим переезд учебной мастерской с https://workshop.test на условный https://workshop.example, сохраняя пути страниц. Домен .example здесь обозначает проектный адрес, не существующую опубликованную площадку. Результат урока — карта переноса и процедура проверки, а не выполненный выпуск сайта.
В опыте ProfessorWeb важной задачей было сохранить старые индивидуальные URL. Для WordPress это тоже начинается с инвентаризации, но данные имеют другой формат: настройки и содержимое могут включать сериализованные значения. Нельзя заменить слово «перенос» на массовую текстовую замену в SQL. Официальное руководство миграции объясняет условия переезда и работу с адресом сайта. Наш пример касается одной установки без Multisite и без смены структуры permalink.
Карта до изменения окружения
Исходные пути — три страницы, шесть записей после урока поиска, архив курсов и четыре карточки. Добавьте к ним используемые изображения, поиск с параметром s и REST-коллекцию. Карта должна различать HTML-документ, ресурс и API: одинаковое слово «страница» скрывает разные контракты. Для HTML сравниваем заголовок и назначение, для изображения — фактический файл, для API — схему и публичные поля.
Полный образец нескольких строк фиксирует правило сохранения пути, а весь реестр лежит в материалах урока:
source_path,target_path,kind,expected
/study/,/study/,html,200 correct document
/html-request/,/html-request/,html,200 correct document
/courses/javascript/,/courses/javascript/,html,200 correct course
/wp-json/wp/v2/courses,/wp-json/wp/v2/courses,api,public course collection
/?s=HTML,/?s=HTML,search,posts and courses only
/unknown-material/,/unknown-material/,missing,404
Число ID курса в одной и той же перенесённой базе должно сохраняться, если перенос не создаёт новые объекты вручную. Поэтому не импортируем карточки по одной в случайном порядке и не считаем новые ID эквивалентными без соответствия. Слаги, статусы, рубрики, метаданные и навигация тоже относятся к данным. Восстановление темы без базы покажет каркас, но не выполнит договор о страницах и содержимом.
Состав копии включает базу, wp-content, конфигурацию среды и известную версию ядра. Не переносите рабочие секреты в общедоступный учебный ZIP. На новом месте требуются собственные параметры базы, права файлов, HTTPS и корректная передача запросов WordPress. Перенос одного wp-config.php с прежним подключением может заставить новый хост писать в старую базу. Это особенно опасно, если редакторы одновременно продолжают менять материалы на обоих адресах.
Замена origin в данных
Настройки siteurl и home должны отражать выбранную структуру установки. В нашем простом варианте WordPress и публичный сайт находятся в корне одного хоста, но это не универсальная схема. Установка ядра в подкаталоге может требовать других значений и файлов входа. Не копируйте параметры произвольно из примера, если исходная среда организована иначе. Сначала документируйте, какие URL обслуживают панель, ресурсы и публичную оболочку.
Некоторые значения базы представлены PHP-сериализацией, где длина строки является частью формата. Простой SQL REPLACE способен изменить текст, не исправив длину, и повредить значение. Для выбранной копии можно использовать инструмент, понимающий такой формат. Например, команда WP-CLI search-replace поддерживает предварительный просмотр изменений. Она требует отдельно установленного и подходящего WP-CLI; в серии этот инструмент не устанавливался и не запускался.
Ниже команда только для читателя, в каталоге новой изолированной копии и после подтверждения параметров её базы. Она ничего не меняет благодаря --dry-run, но всё равно читает указанную базу:
wp search-replace 'https://workshop.test' 'https://workshop.example' \
--all-tables-with-prefix --skip-columns=guid --dry-run
Сначала прочитайте, какие таблицы и столбцы затрагиваются, затем решите, нужен ли реальный проход отдельной командой без dry-run. GUID не является обычным публичным адресом для массового переименования, поэтому в этом образце исключён. Префикс таблиц помогает выбирать пространство установки, но не доказывает, что каждая найденная таблица безопасна для изменения. Расширения могут хранить особые значения и внешние ссылки, которые требуют отдельного решения.
Файлы и сохранённое оформление
Наши ссылки хедера начинаются с / и сохраняют путь при изменении хоста, если WordPress остаётся в корне. При переезде в подкаталог это перестаёт быть верно. Файл reader использует текущий origin и корневой REST-путь, поэтому имеет то же ограничение. Не называйте эти ссылки «абсолютно переносимыми». Их переносимость основана на конкретном договоре расположения. Изменение этого договора требует просмотра файлов, не только замены строки в базе.
Проверьте пользовательские шаблоны и глобальные стили, сохранённые в базе. После переноса они могут продолжать перекрывать файлы темы. Успешное копирование каталога pw-workshop не гарантирует, что сайт отображает именно его последний снимок. Редакторские изменения навигации тоже требуют сравнения с утверждённой таблицей. Основной источник нужно определить до переключения, чтобы два человека не исправляли меню в разных местах одновременно.
Один авторитетный источник записи
На время финального переноса выберите, где принимаются новые изменения. Если старый и новый WordPress независимо записывают статьи, снимок быстро перестанет быть общим состоянием. Для небольшого контентного сайта можно договориться о коротком окне остановки редактирования и перенести окончательную копию. Более сложный проект требует отдельной синхронизации. В этом уроке нет реализации двусторонней записи и не обещается отсутствие потерь при параллельном редактировании.
Если путь действительно меняется, нужна явная строка сопоставления и эквивалентный документ. Перенаправление всех неизвестных URL на главную скрывает ошибки и лишает читателя нужного материала. Проверьте постоянный статус перенаправления, конечный адрес, отсутствие цепочки и циклов. Смена хоста при сохранённом пути тоже требует решения о доступности старого адреса, если он был публичным. Наш workshop.test локальный, поэтому SEO-миграция реального домена здесь не выполняется.
При окончательной проверке также сравните canonical и обычные внутренние ссылки с новым origin. Рабочий HTML может открываться на новом адресе, но продолжать указывать старую площадку как основную. Это отдельное несоответствие, которое не видно по одному успешному статусу. Если используются SEO-расширения, их настройки входят в карту переноса; наша минимальная установка такой плагин не добавляет.
Ожидаемый итог — перенесённые данные и прежние пути с правильным содержимым на отдельно подготовленной площадке. В этой задаче копирование базы, команды, настройка DNS, HTTPS и HTTP-проверки не выполнялись. Матрица остаётся not_run. Последний урок передаст редактору понятный договор о том, что можно менять самостоятельно, какой источник определяет оформление и к кому обращаться при несовпадении числа уроков, адреса или сохранённого шаблона.