یک الگوی تکراری در پروژه‌های فریلنسری می‌بینم: سایت روی محیط لوکال (local environment) بی‌نقص کار می‌کند، اما لحظه‌ای که روی هاست واقعی بالا می‌آید، منوها می‌شکنند، تصاویر غایب می‌شوند، و صفحه‌ساز شکلش را از دست می‌دهد. تجربه‌ام این است که در نود درصد موارد، مقصر خود انتقال نیست؛ مقصر نبود یک ترتیب مشخص برای انجام مراحل است. انتقال سایت از لوکال به هاست (migration from local to hosting) یک جابه‌جایی فیزیکی نیست، یک بازتنظیم کامل معماری در محیط جدید است. در ادامه همان مسیری را می‌گویم که در پروژه‌های واقعی طی می‌کنم.

آماده‌سازی قبل از انتقال

قبل از اینکه یک فایل را جابه‌جا کنید، سه چیز باید روشن باشد. اول، اطمینان از نسخه PHP لوکال و هاست. اگر لوکال روی PHP 8.2 است و هاست شما روی 7.4، افزونه‌ها می‌توانند رفتار متفاوتی نشان دهند؛ تفاوت‌ها در تفاوت PHP 7 و PHP 8 آمده است. دوم، اطمینان از نسخه MySQL. سوم، اطمینان از پشتیبانی هاست از افزونه‌هایی که در لوکال استفاده کرده‌اید (مثلاً افزونه‌های کش که به LiteSpeed یا Redis نیاز دارند). اگر هاست شما این پیش‌نیازها را ندارد، پیش از انتقال راهنمای انتخاب هاست را مرور کنید.

انتقال از لوکال به هاست، جابه‌جایی سایت نیست؛ انتقال یک سایت از یک محیط ساده به یک محیط با قیدهای واقعی است.

بکاپ کامل لوکال

پیش از هر حرکت، بکاپ کامل بگیرید. اگر ابزار لوکال شما (Local WP، XAMPP، MAMP یا Docker) امکان export دارد، از آن استفاده کنید. اما بکاپ دستی هم لازم است چون مسیرهای لوکال با مسیرهای هاست کاملاً متفاوت‌اند. روش دستی: پوشه wp-content را فشرده کنید و دیتابیس را با phpMyAdmin یا ابزار لوکال export بگیرید.

جزئیات روش بکاپ در چگونه از سایت وردپرسی بکاپ بگیریم آمده. اگر از محیط لوکال Docker استفاده می‌کنید، قبل از export، مطمئن شوید که دیتابیس داخل container خاموش نشده؛ یکی از اشتباهات رایج، export از یک container در حال خاموش شدن است که نتیجه‌اش یک sql ناقص است.

آپلود فایل‌ها به هاست

سه روش برای آپلود وجود دارد: FTP، File Manager هاست، و SSH. توصیه من به ترتیب: SSH اگر دارید، File Manager اگر حجم فایل کم است، و FTP برای پروژه‌های حجیم که پایداری اتصال مهم است. نکات کلیدی:

  • ابتدا یک بکاپ از هاست خالی بگیرید. اگر روی هاست از قبل فایلی هست، پاک نکنید تا مطمئن شوید انتقال موفق است.
  • ساختار پوشه‌ها را دقیقاً حفظ کنید: wp-content/uploads، wp-content/plugins، wp-content/themes.
  • دقت کنید که فایل wp-config.php فعلی هاست را رونویسی نکنید؛ اطلاعات اتصال دیتابیس هاست با لوکال متفاوت است.

اگر هاست شما cPanel دارد، مسیر مسیر File Manager و ساختار پوشه‌ها در آموزش کار با cPanel برای مبتدیان توضیح داده شده است.

انتقال دیتابیس

مرحله‌ای که بیشترین خرابی از آن می‌آید. ترتیب صحیح:

  1. در دیتابیس لوکال، دیتابیس را export بگیرید. اگر با phpMyAdmin کار می‌کنید، گزینه Custom را بزنید و مطمئن شوید که Add DROP TABLE غیرفعال است (چون روی هاست می‌خواهید داخل دیتابیس جدید ایمپورت کنید).
  2. در هاست، یک دیتابیس جدید با یک کاربر جدید بسازید. مجوزهای لازم را به کاربر بدهید. مسیر ساخت دیتابیس در مدیریت دیتابیس در cPanel آمده است.
  3. فایل sql را در دیتابیس جدید ایمپورت کنید. اگر فایل بزرگ است، از طریق SSH با mysql ایمپورت کنید تا timeout نگیرید.

نکته‌ای که کمتر گفته می‌شود: پیشوند جداول (table prefix) لوکال و هاست باید یکسان باشد (مثلاً wp_). اگر لوکال با wp_ و هاست با پیشوند دیگری باشد، سایت پس از ایمپورت آدرس جداول را پیدا نمی‌کند. برای اطمینان، پیشوند را یکسان کنید یا wp-config.php را طبق آن تنظیم کنید.

تنظیم wp-config و اطلاعات اتصال

در فایل wp-config.php روی هاست، مقادیر زیر باید با اطلاعات دیتابیس و سرور جدید هماهنگ باشد:

define('DB_NAME', 'host_db_name');
define('DB_USER', 'host_db_user');
define('DB_PASSWORD', 'host_db_password');
define('DB_HOST', 'localhost'); // or host's MySQL host

همچنین مقادیر Salt را از wp-config.php هاست بگیرید یا با یک سرویس مولد تولید کنید. نمک‌های (salt) لوکال و هاست باید متفاوت باشند چون لوکال محیطی است که به‌طور طبیعی امنیت کمتری دارد. سه خط WP_DEBUG را هم بعد از انتقال غیرفعال بگذارید. اگر در مرحله اتصال دیتابیس به مشکل خوردید، رفع خطای اتصال به دیتابیس در رفع خطای اتصال به پایگاه داده وردپرس گام‌به‌گام آمده است.

جایگزینی URL و لینک‌های داخلی

بعد از انتقال، دیتابیس لوکال همچنان آدرس‌های لوکال (http://localhost:10003 یا مشابه) را در خود دارد. سه دسته از داده‌ها باید جایگزین شوند:

  • تنظیمات سایت: siteurl و home در جدول wp_options.
  • لینک‌های داخل محتوا، متادیتا، ویجت‌ها و تنظیمات قالب.
  • مسیرهای موجود در فایل‌های تنظیمات افزونه‌ها.

برای جایگزینی از افزونه‌های تخصصی Search-Replace استفاده کنید، نه Find-Replace ساده در دیتابیس؛ چون داده‌های سریالایز شده (serialized) اگر با طول اشتباه جایگزین شوند، می‌شکنند و تنظیمات قالب از بین می‌رود. اگر می‌خواهید این کار را از طریق خط فرمان انجام دهید، wp search-replace با WP-CLI ابزار مطمئنی است.

در انتقال لوکال به هاست، هیچ مرحله‌ای به اندازه جایگزینی URL ریسک‌پذیر نیست؛ همین‌جاست که خیلی‌ها بین سایت سالم و سایت نابود، فقط یک کلیک فاصله می‌گیرند.

چک‌لیست بعد از انتقال

  1. ورود به پیشخوان؛ اگر رمز عبور کاربر لوکال را وارد می‌کنید، باید کار کند. اگر نه، از طریق phpMyAdmin رمز را ریست کنید.
  2. بررسی سیت‌واید لینک‌ها؛ خطاهای ۴۰۴ را با ابزار Broken Link Checker بگیرید.
  3. بررسی آپلود رسانه؛ یک تصویر تست آپلود کنید تا مجوزهای پوشه uploads را ببینید.
  4. بررسی فرم‌ها؛ ارسال تست بگیرید تا مطمئن شوید SMTP درست کار می‌کند.
  5. بررسی ووکامرس اگر فروشگاهی است؛ صفحه سبد، تسویه و ایمیل سفارش را تست کنید. مسیر کامل بکاپ فروشگاه در بکاپ ووکامرس آمده است.
  6. بررسی sitemap و robots؛ این دو باید با آدرس جدید بازسازی شوند. اگر اشتباه تنظیم مانده باشند، ایندکس‌شدن سایت ماه‌ها معطل می‌ماند. مسیر دقیق این مرحله در سئو تکنیکال از خزش تا ایندکس آمده است.
  7. پاک کردن کش مرورگر و کش سرور؛ برخی از هاست‌ها کش قدیمی را نگه می‌دارند و شما فکر می‌کنید سایت خراب است.

اشتباهات رایج در انتقال

سه اشتباهی که بیش از همه دیده‌ام: اول، انتقال بدون بکاپ از هاست فعلی — اگر هاست خالی نباشد، ممکن است فایل‌های مهمی را رونویسی کنید. دوم، فراموش کردن مجوز فایل‌ها؛ پوشه‌ها روی 755 و فایل‌ها روی 644 تنظیم شوند، مگر در موارد خاص. اگر مجوزها اشتباه باشند، تصویر آپلود نمی‌شود یا افزونه‌ها نمی‌توانند فایل بنویسند. سوم، جایگزینی دستی URL در دیتابیس بدون توجه به serialized data که منجر به شکستن ویجت‌ها و تنظیمات می‌شود. این سه اشتباه، بیشترین هزینه زمانی را در پشتیبانی به من تحمیل کرده‌اند.

پرسش‌های کوتاه

آیا می‌توانم از افزونه‌های مهاجرت استفاده کنم؟ بله، افزونه‌هایی مثل All-in-One WP Migration و Duplicator این مسیر را ساده می‌کنند، اما برای سایت‌های بزرگ، محدودیت حجم فایل روی هاست می‌تواند دام شما شود. برای سایت‌های بزرگ، انتقال دستی همچنان قابل اعتمادتر است.

اگر بعد از انتقال، سایت فقط صفحه سفید می‌دهد چه کنم؟ اول با تعریف WP_DEBUG true در wp-config.php خطا را ببینید. اگر خطا مربوط به PHP است، اغلب از ناسازگاری نسخه PHP می‌آید. اگر خطا مربوط به فایل قالب است، آن را دوباره آپلود کنید.

آیا باید قبل از انتقال، SSL را فعال کنم؟ بله. در هاست، پیش از هر چیز SSL فعال شود و سپس جایگزینی http به https در دیتابیس انجام شود. مراحل نصب در راه‌اندازی SSL و HTTPS در وردپرس آمده است.

نکته پایانی

در جمع‌بندی این مسیر، به‌نظرم مهم‌ترین چیزی که یک انتقال از لوکال به هاست را از فاجعه نجات می‌دهد، نظم است، نه ابزار. اگر مراحل را با ترتیب مشخص، بکاپ کامل، جایگزینی دقیق داده‌های سریالایز شده و آزمایش مرحله‌به‌مرحله انجام دهید، انتقال به یک عملیات معمول تبدیل می‌شود. در مقابل، اگر هر مرحله را حدسی و بدون توالی انجام دهید، حتی با بهترین ابزار هم بخشی از سایت جا می‌ماند و هفته‌ها عیب‌یابی می‌طلبد. تجربه من از صدها انتقال، همان چیزی است که در همان قدم اول، تفاوت یک فریلنسر حرفه‌ای با یک آماتور را نشان می‌دهد: هر دو می‌توانند انتقال دهند، اما یکی چند ساعت و یکی چند هفته زمان می‌برد.

اگر در انتقالی که انجام داده‌اید، به مرحله‌ای برخورده‌اید که به‌نظرتان کم‌تر گفته شده (مثلاً یک افزونه خاص که بعد از انتقال نیاز به بازتنظیم داشت)، در دیدگاه‌ها بنویسید؛ همان جزئیات کوچک، برای نفر بعدی از هر راهنمای عمومی مفیدتر است. 🚚