Как правильно перенести сайт на WordPress?

Click here to view original web page at www.kobzarev.com

При переносе WordPress сайта с локального компьютера на сервер (или наоборот) сайт перестает работать. Аналогичная проблема возникает и при смене домена, по которому сайт доступен.

Признаки неработоспособности бывают самые разные — не отображаются некоторые страницы, не отображаются картинки в библиотеке медиафайлов, не грузятся стили, не работают слайдеры, и т.д., и т.п. В чем причина такого поведения и как правильно перенести WordPress сайт или сменить его домен?

Начнем с причин. Глобально, их три.

Первая причина

В первую очередь так происходит потому, что все ссылки в базе WordPress хранятся как абсолютные. Например, ссылка на иконку сайта выглядит примерно так:

Для правильной работы сайта на новом домене (например, https://newsite.org) ссылка в базе должна измениться на:

Обратите внимание на то, что даже при простом переводе сайта с http на https, все ссылки внутри базы надо менять!

За использованием абсолютных ссылок в WordPress лежат серьезные доводы. Почитайте этот ответ на английском StackOverflow, в котором даны объяснения. В том числе, приведено мнение одного из ведущих разработчиков WordPress. Единственная проблема, которая возникает при использовании абсолютных ссылок — перенос сайтов. Однако перенос сайта с относительными ссылками в общем случае ещё более проблематичен. В упомянутом ответе это тоже обсуждается.

Вторая причина

Вторая причина проблем при переносе — сериализованные данные в базе. Все современные плагины (включая WooCommerce, слайдеры, различные визуальные редакторы типа Visual Composer), темы — хранят данные в базе в сериализованном виде. Это упакованные в строки массивы и объекты. Несколько примеров.

Информация о последнем отредактированном файле из темы twentyseventeen:

Данные Jetpack:

Данные популярного плагина бэкапа сайтов BackWPUp:

Во всех примерах можно найти путь к папке сайта на сервере: /var/www/test/.

Вот пример сохраненных настроек из очень популярного SEO-плагина Yoast:

Здесь мы видим в сериализованных данных строку с упоминанием домена: href=\"http://test.kagg.eu/wp-admin/?page=wpseo_configurator\". Она мало того, что сериализована, да ещё и экранирована (\").

Третья причина

Третья причина — наличие в базе путей к файлам. Они могут быть не только от корня WordPress, но и от домашнего каталога пользователя хостинг-аккаунта или даже от корня веб-сервера (некоторые плагины так делают). Пути могут быть представлены как обычными строками, так и сериализованными данными (первый пример выше). При переносе на другой хостинг их тоже надо менять.

Что произойдет, если просто перекинуть базу как есть на новый сервер? Очевидно, перестанут работать вещи, связанные с путями к файлам и ссылками, содержащими предыдущий домен.

Что надо делать? Очевидно, менять пути к файлам на новые и имя домена в базе. Вопрос, как. Совершенно непригодны два плохих совета, которые часто можно встретить:

  1. Заменить в базе в таблице wp_options записи c option_name = siteurl и home на новое имя домена. Работает только на самых примитивных сайтах.
  2. Сделать дамп базы в файл .sql, и провести текстовые замены путей и домена, затем залить базу на новый сервер. Это прямой путь к разрушению сайта. Сериализованные данные при этом будут безнадежно испорчены.

Рассмотрим первый пример выше с сериализованными данными. После текстовой замены /var/www/test/ на, скажем, /home/i/account-name/site-name.org/public_html (как на одном популярном хостинге), из строки:

получится строка:

Только ее длина уже ни разу не 46 символов, и WordPress не сможет прочитать эти сериализованные данные из базы.

Таким образом, оба «популярных» совета надо признать вредными.

Как правильно переносить сайт?

Надо использовать программные средства, специально предназначенные для этого. Упомянутые ниже программы корректно работают с сериализованными данными, пересчитывая длину строк.

Скрипт Database Search and Replace поможет корректно внести изменения в базу. Для этого пользователь должен, правда, понимать, что он делает, знать, например, какие пути на старом сайте и какие — на новом.

Плагин WP Migrate DB позволяет корректно подготовить базу для миграции. Для завершения процесса пользователь должен использовать phpMyAdmin для импорта базы на новом сервере.

Интерфейс командной строки для WordPress (WP-CLI) позволяет конвертировать базу одной командой. Например, для конвертации http://site.ru в https://site.org:

Самым простым и автоматизированным решением лично мне представляется плагин Duplicator, который снимает копию локального сайта, предоставляет для скачивания 2 файла: .zip и installer.php, которые надо перенести на новый сервер и там запустить installer.php. Все остальное плагин проделает автоматически. В большинстве случаев имеет смысл переносить только базу с помощью этого плагина, а файлы копировать по FTP.

С мультисайтом ситуация несколько сложнее. Плагины Duplicator и All-in-One WP Migration переносят их только в платной версии.

Мне неизвестны бесплатные плагины для переноса мультисайтов. Если хочется сделать перенос мультисайта бесплатно, то можно скопировать базу, а потом воспользоваться Database Search and Replace.

Ссылки

«Всё будет WordPress»