Перенос 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.
