Миграция WordPress: перенос сайта на другой домен или хостинг

Перенос WordPress на другой хостинг или домен — задача, с которой сталкивается каждый разработчик. Смена хостера, переезд с HTTP на HTTPS, смена домена при ребрендинге — причины разные, а процесс одинаковый. Разберём пошагово, как перенести сайт без потери данных и с минимальным простоем.

Подготовка: что нужно перенести

WordPress-сайт состоит из трёх частей:

  • Файлы — ядро WordPress, тема, плагины, загруженные медиафайлы (wp-content/uploads)
  • База данных — все записи, страницы, настройки, пользователи
  • Конфигурацияwp-config.php с параметрами подключения к БД

Перед началом сделайте бэкап всего. Если что-то пойдёт не так, вы сможете откатиться. Проверьте, что на новом хостинге достаточно места и версия PHP совместима с вашими плагинами.

Шаг 1: Экспорт базы данных

Через WP-CLI (самый удобный способ):

# Экспорт всей базы данных
wp db export backup.sql

# Экспорт с GZIP-сжатием (для больших баз)
wp db export - | gzip > backup.sql.gz

# Экспорт только определённых таблиц
wp db export backup.sql --tables=wp_posts,wp_postmeta,wp_options

# Через mysqldump (если WP-CLI недоступен)
mysqldump -u username -p database_name > backup.sql

# Через phpMyAdmin:
# 1. Откройте phpMyAdmin
# 2. Выберите базу данных
# 3. Вкладка "Экспорт" → "Быстрый" → формат SQL → "Выполнить"

Размер дампа зависит от количества контента. Блог с 500 записями — обычно 10-50 МБ. Интернет-магазин с тысячами товаров может занять гигабайты.

Шаг 2: Перенос файлов

Скопируйте всю директорию WordPress на новый сервер. Способы:

# Архивирование на старом сервере
tar -czf wordpress-backup.tar.gz /path/to/wordpress/

# Копирование через SCP
scp wordpress-backup.tar.gz user@new-server:/path/to/new-site/

# Через rsync (показывает прогресс, поддерживает докачку)
rsync -avz --progress /path/to/wordpress/ user@new-server:/path/to/new-site/

# Если доступ только через FTP — используйте FileZilla или lftp
lftp -u username,password ftp.new-host.com <<EOF
mirror -R /local/path/to/wordpress/ /remote/path/
EOF

# Распаковка на новом сервере
cd /path/to/new-site/
tar -xzf wordpress-backup.tar.gz

Обязательно перенесите wp-content/uploads — там все изображения и файлы. Без них сайт будет работать, но со сломанными картинками.

Шаг 3: Импорт базы данных на новый сервер

Создайте новую базу данных на новом хостинге и импортируйте дамп:

# Через WP-CLI
wp db import backup.sql

# Через MySQL CLI
mysql -u new_username -p new_database < backup.sql

# Для больших дампов (GZIP)
gunzip < backup.sql.gz | mysql -u new_username -p new_database

# Через phpMyAdmin:
# 1. Создайте новую базу (или используйте существующую)
# 2. Вкладка "Импорт" → выберите файл → "Выполнить"
# Лимит phpMyAdmin обычно 50-100 МБ.
# Для больших файлов используйте BigDump или SSH.

Шаг 4: Настройка wp-config.php

Обновите параметры подключения к базе данных в wp-config.php на новом сервере:

// Данные для подключения к новой БД
define( 'DB_NAME', 'new_database_name' );
define( 'DB_USER', 'new_database_user' );
define( 'DB_PASSWORD', 'new_secure_password' );
define( 'DB_HOST', 'localhost' );  // или IP/сокет нового сервера

// Если сменился префикс таблиц (обычно нет)
$table_prefix = 'wp_';

// Если переезжаете на HTTPS — добавьте
define( 'FORCE_SSL_ADMIN', true );

// Если сайт за reverse proxy (Cloudflare, Nginx proxy)
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
     $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
    $_SERVER['HTTPS'] = 'on';
}

// Временно включите debug для отладки
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Не забудьте обновить ключи и соли (AUTH_KEY, SECURE_AUTH_KEY и т.д.). Сгенерируйте новые на https://api.wordpress.org/secret-key/1.1/salt/. Это сбросит все сессии пользователей, но повысит безопасность.

Шаг 5: Замена URL в базе данных (wp search-replace)

Это самый важный шаг. WordPress хранит абсолютные URL в базе данных: в контенте записей, настройках, виджетах, сериализованных данных плагинов. Простая замена через SQL REPLACE() сломает сериализованные массивы. Используйте wp search-replace:

# Предварительный просмотр (dry-run) — показывает, что будет заменено
wp search-replace 'http://old-domain.ru' 'https://new-domain.ru' --dry-run

# Выполнение замены
wp search-replace 'http://old-domain.ru' 'https://new-domain.ru'

# Если меняется только протокол (HTTP → HTTPS)
wp search-replace 'http://example.com' 'https://example.com'

# Замена с учётом поддиректории
wp search-replace 'http://old-domain.ru/blog' 'https://new-domain.ru'

# Только в определённых таблицах
wp search-replace 'old-domain.ru' 'new-domain.ru' wp_posts wp_postmeta wp_options

# Замена пути к uploads (если изменилась структура)
wp search-replace '/home/old-user/public_html' '/home/new-user/public_html'

# Проверка результата
wp option get siteurl
wp option get home
# Оба должны показывать новый URL

wp search-replace корректно обрабатывает сериализованные данные — это его главное преимущество перед SQL-запросами. Он обновляет длины строк в сериализованных массивах, сохраняя их валидность.

Шаг 6: DNS и SSL

После переноса файлов и базы нужно направить домен на новый сервер:

# Проверка текущих DNS-записей
dig example.com A
dig www.example.com CNAME

# На новом хостинге:
# 1. Добавьте домен в панели управления
# 2. Получите IP нового сервера
# 3. Обновите A-запись у регистратора домена:
#    example.com → A → NEW_SERVER_IP
#    www.example.com → CNAME → example.com

# SSL-сертификат
# Let's Encrypt (бесплатный):
sudo certbot --nginx -d example.com -d www.example.com
# или через панель хостинга (у большинства есть автоустановка)

# Проверка SSL
curl -I https://example.com

DNS-записи обновляются от 15 минут до 48 часов. В это время часть посетителей будет видеть старый сайт, часть — новый. Чтобы минимизировать проблемы:

  • Уменьшите TTL DNS-записи до 300 секунд за сутки до переезда
  • Не вносите изменения на старом сайте после начала миграции
  • На старом сервере поставьте заглушку с сообщением о переезде

Шаг 7: Проверка после миграции

Контрольный список для проверки:

# Проверка структуры ссылок
wp rewrite flush

# Проверка целостности БД
wp db check

# Тест cron-задач
wp cron event list

# Проверка, что все плагины активны
wp plugin list --status=active

# Тест отправки email
wp eval "wp_mail( get_option('admin_email'), 'Test', 'Migration test' );"

# Проверка прав на директории
find wp-content/uploads -type d ! -perm 755 -exec chmod 755 {} \;
find wp-content/uploads -type f ! -perm 644 -exec chmod 644 {} \;

Также проверьте вручную:

  • Главную страницу и несколько внутренних
  • Изображения в записях (не сломались ли пути)
  • Формы обратной связи (отправка email)
  • Авторизацию в админке
  • Работу HTTPS (нет mixed content)
  • Sitemap (обычно /sitemap_index.xml)

Типичные ошибки при миграции

Белый экран после переноса — обычно проблема с подключением к БД. Проверьте данные в wp-config.php. Включите WP_DEBUG для просмотра ошибок.

Редирект-петля — возникает, когда siteurl и home в базе не совпадают с реальным URL. Исправьте через WP-CLI:

# Принудительная установка URL
wp option update siteurl 'https://new-domain.ru'
wp option update home 'https://new-domain.ru'

# Если WP-CLI недоступен — добавьте в wp-config.php (временно)
define( 'WP_HOME', 'https://new-domain.ru' );
define( 'WP_SITEURL', 'https://new-domain.ru' );

Сломанные ссылки в контенте — если забыли сделать search-replace. Запустите команду повторно, она безопасна для многократного выполнения.

404 на всех страницах кроме главной — не работают правила перезаписи URL. Обновите .htaccess:

# Для Apache — добавьте в .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# Или через WP-CLI
wp rewrite structure '/%postname%/'
wp rewrite flush

Mixed content (HTTP/HTTPS) — браузер блокирует HTTP-ресурсы на HTTPS-страницах. Проверьте, что search-replace заменил все http:// на https://. Проверьте хардкод в теме.

Автоматизация миграции

Для частых переносов (staging → production) создайте скрипт:

#!/bin/bash
# migrate.sh — скрипт миграции WordPress

OLD_URL="http://staging.example.com"
NEW_URL="https://example.com"
DB_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"

echo "=== Экспорт базы данных ==="
wp db export "$DB_FILE"

echo "=== Замена URL ==="
wp search-replace "$OLD_URL" "$NEW_URL" --precise --recurse-objects

echo "=== Сброс кеша ==="
wp cache flush
wp rewrite flush
wp transient delete --all

echo "=== Проверка ==="
wp option get siteurl
wp option get home
wp db check

echo "=== Готово ==="

Миграция WordPress — не сложная операция, если следовать чёткому плану. Ключевые моменты: полный бэкап перед началом, wp search-replace для замены URL, проверка wp-config.php и сброс кеша. WP-CLI делает весь процесс быстрым и надёжным — используйте его вместо ручных SQL-правок и phpMyAdmin.