Перенесення WordPress: 8 речей, які ламаються, і як ми їх прибрали
5 хв читанняWordPressміграціябекапи
Архів на 35 ГБ «без медіа», сайт, що падає без причини, паролі, які не підходять, і биті посилання в ACF. Що за цим стоїть, як це лагодити вручну і чому ми зрештою написали свій плагін.
Ми переносимо WordPress-сайти постійно: з локалки на стейдж, зі стейджа на прод, від одного хостингу до іншого. І щоразу натрапляємо на ті самі граблі. Останній проєкт зібрав їх майже всі за два дні, тож ми записали кожну: що сталося, чому, як це виправити руками і що з цим зробили в плагіні, який зрештою написали для себе.
1. «Без медіа» - а архів на 35 ГБ
Ставиш галочку «не включати медіа», а плагін міграції збирає 35 ГБ. Причина - у wp-content лежить не тільки сайт. Там копії на кшталт uploads-old і plugins-old, які хтось колись зробив «про всяк випадок», і бекапи інших плагінів: UpdraftPlus, All-in-One, Duplicator. Галочка прибирає лише папку uploads, а все інше їде в архів.
# what actually takes the space in wp-content
du -sh wp-content/* | sort -rh | head -15У нашому плагіні бекапи інших плагінів, кеші й копії *-old, *-backup, *.bak у верхньому рівні wp-content пропускаються завжди. А на екрані експорту видно найбільші папки, і будь-яку можна вимкнути одним кліком.
2. Сайт падає після переносу, хоча на старому сервері все працювало
Розгорнули бекап з продакшну на локалці - і замість сайту критична помилка. У логах: Failed opening required '/scripts/object-cache.memcache.php'. Винуватець - wp-content/object-cache.php. Це «drop-in» від хостингу: він підключає їхній кеш і існує лише на їхніх серверах. Разом з бекапом він переїхав туди, де цього кешу немає, і поклав сайт.
# on the new server: switch off the old host's drop-ins
mv wp-content/object-cache.php wp-content/object-cache.php-off
mv wp-content/advanced-cache.php wp-content/advanced-cache.php-offТе саме працює у зворотний бік: якщо при імпорті на хостинг затерти його рідний object-cache.php, сайт не впаде, але втратить кешування. Тому наш плагін не переносить object-cache.php, advanced-cache.php і db.php і не перезаписує їх на сервері, куди імпортує.
3. Після імпорту пароль не підходить
Це не баг, а наслідок: разом з базою переїжджають і користувачі. Після імпорту входити треба логіном і паролем зі старого сайту, а не з того, куди імпортували. Плутанина починається, коли на двох сайтах різні адміни, а попередити про це ніхто не здогадався.
# forgot the old site's password - set a new one
wp user update admin --user_pass="new-strong-password"Наш плагін пише про це прямо на екрані після імпорту і дає кнопку «Увійти знову». Дрібниця, але вона знімає половину паніки.
4. Посилання на старий домен у віджетах, конструкторах і ACF
Найпідступніше. WordPress зберігає багато налаштувань серіалізованими: рядок пам'ятає свою довжину. Якщо замінити домен простим пошуком і заміною в SQL-дампі, довжина зміниться, а запис - ні. PHP не зможе його прочитати, і віджет, блок ACF чи налаштування теми тихо зникнуть.
# WP-CLI knows about serialized data; plain sed on a dump does not
wp search-replace 'https://old-site.com' 'https://new-site.com' --all-tables --preciseНаш плагін переписує адреси й шляхи сам, розбираючи серіалізовані значення і перераховуючи довжини, плюс ловить JSON-екрановані посилання (https:\/\/...). А після імпорту на вкладці «Інструменти» показує, де в базі ще лишилась стара адреса, і замінює її всюди одним кліком.
5. Сайт переїхав, а показує стару версію
Імпорт пройшов, база нова, а відвідувачі бачать старі сторінки. Це сторінковий кеш (WP Rocket, LiteSpeed, W3 Total Cache), який віддає збережені копії, і об'єктний кеш, що тримає старі налаштування в пам'яті. Ми самі хвилину дивились на «неправильну» сторінку, поки не помітили в коді позначку WP Rocket.
wp cache flush # object cache
# page cache: "Clear cache" in WP Rocket / LiteSpeed / W3 Total CacheНаш плагін після імпорту сам чистить кеші WP Rocket, W3 Total Cache, LiteSpeed, WP Super Cache, Autoptimize і SiteGround, а також об'єктний кеш.
6. Перенесли тільки базу - і зникли картинки
Щоб не тягати гігабайти, переносять тільки базу й тему. Але якщо на старому сайті за цей час з'явились нові картинки, база тепер на них посилається, а файлів на новому сервері немає. У нас так зникли дві іконки на головній: записи в медіатеці є, файлів немає.
# copy only the months that changed, not the whole uploads folder
rsync -av old-server:wp-content/uploads/2026/10/ wp-content/uploads/2026/10/Для таких випадків у нашому плагіні є бекапи «тільки зміни»: пакуються лише файли, що змінились після повного бекапу. Переносити їх швидко, а відновлення само накладає зміни на повний бекап.
7. Страховий бекап забирає більше місця, ніж сам імпорт
Правильна звичка - зробити бекап перед імпортом. Але ми імпортували архів на 165 МБ (база й тема), а «бекап перед імпортом» почав пакувати весь сайт з медіа на 22 ГБ. На хостингу з обмеженим диском це закінчується тим, що на сам імпорт місця вже не лишається.
Тепер страховий бекап у нашому плагіні бере тільки те, що імпорт перезапише: архів містить базу й теми - бекапляться база й теми. Хвилина замість години.
8. Імпорт обірвався на середині
Хостинг обриває запит через 30-60 секунд, браузер втрачає з'єднання, і імпорт зупиняється посередині. Найгірший варіант - коли половина таблиць уже нова, а половина ще стара.
У нашому плагіні все працює короткими кроками, які продовжуються з того місця, де зупинились. Нова база спершу заливається в тимчасові таблиці, а живий сайт перемикається на неї однією операцією в самому кінці. Якщо щось обірвалось раніше, сайт навіть не помітить. А стара база зберігається ще 7 днів: якщо після імпорту щось не так, кнопка «Скасувати імпорт» повертає все як було.
Чому ми написали свій плагін
Кожну з цих проблем можна обійти руками, і команди вище - якраз про це. Але коли переносиш сайти щотижня, хочеться, щоб інструмент сам знав про drop-ins, серіалізовані дані, кеші й бекапи інших плагінів. Тож ми зібрали все це в WinOnWeb Migrate. Він безкоштовний повністю: без ліміту розміру, без платних розширень, а ще вміє імпортувати архіви All-in-One і Duplicator, тож перейти можна без перепакування.
- Без обмеження розміру: експорт, завантаження й імпорт частинами.
- Імпорт архівів All-in-One (.wpress) і Duplicator (.zip).
- Безпечний імпорт через тимчасові таблиці й скасування протягом 7 днів.
- Розумна заміна адрес, включно із серіалізованими даними й ACF.
- Пошук залишків старих посилань після переносу.
- Автобекапи з режимом «тільки зміни».
Завантажити плагін і прочитати, як ним користуватись, можна на winonweb.dev/migrate.
