وردپرس و ووکامرس
انتقال سایت وردپرس به هاست جدید بدون قطعی و افت سئو
برای انتقال سایت وردپرس بدون قطعی، از فایل ها و دیتابیس بکاپ بگیرید، سایت را روی هاست جدید بالا بیاورید و با فایل hosts تست کنید، بعد DNS را عوض کنید و هاست قدیم را تا چند روز روشن نگه دارید.
خیلی از خرابی های انتقال سایت وردپرس از ترتیب اشتباه کارها می آید. DNS قبل از تست سایت روی هاست جدید عوض می شود، یا حساب هاست قدیم زودتر از موعد بسته می شود. اگر هاست قدیم تا آخر کار روشن بماند، در مدتی که DNS به روز می شود هر بازدیدکننده یکی از دو نسخه سالم سایت را می بیند.
مثال ها برای انتقال بین دو هاست cPanel است. در کنترل پنل های دیگر اسم بخش ها کمی فرق می کند، ولی ترتیب کار همین است.
برنامه ریزی قبل از انتقال سایت وردپرس
پیش از شروع باید به cPanel هاست قدیم و هاست جدید دسترسی داشته باشید و بدانید DNS دامنه کجا مدیریت می شود: روی هاست قدیم، در پنل ثبت دامنه یا در سرویسی مثل Cloudflare.
اگر هنوز هاست مقصد را انتخاب نکرده اید، اول ببینید بازدیدکننده های سایت کجا هستند. برای مخاطب داخل ایران هاست وردپرس ایران نزدیک تر است و برای مخاطب خارج از ایران هاست وردپرس با سرور در اروپا. اگر سایت وردپرسی نیست یا کنار آن اسکریپت دیگری هم دارید، هاست لینوکس ایران را ببینید. بقیه معیارها، از سقف منابع تا بکاپ، در چک لیست انتخاب هاست وردپرس در ایران آمده است.
طراح سایتی که چند سایت مشتری را یک جا منتقل می کند، معمولا بهتر است برای هر مشتری اکانت cPanel جدا بسازد. ساخت پکیج و اکانت مشتری در WHM را در راهنمای نمایندگی هاست و WHM توضیح داده ایم و مراحل پایین را برای هر اکانت جدا انجام می دهید.
TTL رکوردها را از قبل کم کنید
TTL تعیین می کند سرورهای DNS دیگر جواب قبلی را تا چه مدت نگه دارند. در پنلی که DNS دامنه در آن است، مثلا Zone Editor در cPanel، TTL رکورد A دامنه و www را ببینید. اگر ۱۴۴۰۰ ثانیه (چهار ساعت) است، دست کم چهار ساعت قبل از انتقال آن را به ۳۰۰ ثانیه برسانید تا مقدار قبلی از کش همه سرورها خارج شود. راهنمای Google Search Central برای جابه جایی هاست محتاطانه تر است و پیشنهاد می کند TTL دست کم یک هفته قبل از انتقال پایین بیاید.
کم کردن TTL فقط برای تغییر رکورد A اثر دارد. اگر قرار است نیم سرورهای دامنه را عوض کنید، سرعت اعمال به TTL رکوردهای NS در رجیستری دامنه بستگی دارد و با تنظیم Zone Editor سریع تر نمی شود.
تغییرات سایت را متوقف کنید
از لحظه گرفتن بکاپ تا تغییر DNS، هر مطلب یا سفارشی که روی هاست قدیم ثبت شود در نسخه جدید نیست. برای وبلاگ کافی است در این چند ساعت مطلبی منتشر نکنید. فروشگاه ووکامرس را در ساعت کم بازدید منتقل کنید و اگر افزونه حالت تعمیر دارید، از قبل از بکاپ دیتابیس تا تغییر DNS فروشگاه را در این حالت بگذارید. با TTL پایین این فاصله کوتاه است. تنظیم حالت تعمیر همراه دیتابیس به هاست جدید هم می رود، پس بعد از تست آنجا خاموشش کنید.
اگر درگاه مستقیم بانکی دارید که IP سرور در آن ثبت شده، IP هاست جدید را از قبل به بانک یا شرکت پرداخت اعلام کنید. در غیر این صورت ممکن است پرداخت ها بعد از تغییر DNS خطا بدهند.
بکاپ وردپرس در cPanel هاست قدیم
برای انتقال دستی دو چیز لازم دارید: فایل های پوشه وردپرس و خروجی SQL دیتابیس. هر دو را از cPanel هاست قدیم می گیرید.
فایل ها
در File Manager هاست قدیم وارد public_html یا پوشه ای شوید که وردپرس در آن نصب است. از دکمه Settings بالای صفحه گزینه Show Hidden Files (dotfiles) را روشن کنید تا فایل .htaccess هم دیده شود. همه فایل ها را انتخاب کنید، Compress را بزنید و فرمت Zip را انتخاب کنید. فایل زیپ را دانلود کنید و یک نسخه روی سیستم خودتان نگه دارید.
دیتابیس
اسم دیتابیس را از خط DB_NAME در فایل wp-config.php بردارید. در phpMyAdmin همان دیتابیس را از ستون سمت چپ انتخاب کنید، به تب Export بروید و با روش Quick و فرمت SQL خروجی بگیرید. برای دیتابیس بزرگ روش Custom را انتخاب کنید و در بخش Output فشرده سازی gzipped را بزنید تا فایل کوچک تر شود.
Backup Wizard و بکاپ کامل حساب
Backup Wizard در cPanel از پوشه home، دیتابیس های MySQL و فورواردرها و فیلترهای ایمیل بکاپ جزئی می گیرد و این بکاپ ها را خودتان در cPanel هاست جدید بازگردانی می کنید. بکاپ کامل حساب این طور نیست. طبق مستندات Backup Wizard در cPanel، بازگردانی خودکار بکاپ کامل فقط از WHM ممکن است و باید از پشتیبانی هاست جدید بخواهید انجامش دهد. اگر مقصد پیکوهاست است، طبق صفحه درباره پیکوهاست برای انتقال هاست تیکت بدهید تا مراحلش با شما هماهنگ شود.
انتقال با افزونه Duplicator یا All-in-One WP Migration
این افزونه ها فایل ها و دیتابیس را در یک بسته جمع می کنند و روی مقصد باز می کنند و برای سایت کوچک راه سریعی اند. نسخه رایگان بعضی از آن ها برای حجم بسته محدودیت دارد و سقف آپلود و زمان اجرای PHP هاست هم روی ساختن و باز کردن بسته اثر می گذارد. در سایت های چند گیگابایتی کار ممکن است وسط راه متوقف شود و روش دستی قابل اعتمادتر است.
راه اندازی فایل ها و دیتابیس روی هاست جدید
آپلود و باز کردن فایل ها
در File Manager هاست جدید به public_html بروید. اگر فایل پیش فرضی مثل index.html آنجاست پاکش کنید، چون ممکن است به جای index.php وردپرس نمایش داده شود. فایل زیپ را با دکمه Upload بارگذاری کنید و بعد روی آن Extract بزنید. مراحل آپلود با تصویر در آموزش آپلود سورس داخل هاست cPanel آمده است. اگر آپلود فایل بزرگ در مرورگر قطع شد، از FTP استفاده کنید.
بعد از باز شدن فایل ها دسترسی ها را نگاه کنید. پوشه ها معمولا 755 و فایل ها 644 هستند.
ساخت دیتابیس و انتقال دیتابیس وردپرس
در cPanel هاست جدید بخش Manage My Databases را باز کنید (در نسخه های قدیمی تر cPanel اسمش MySQL Databases است):
- یک دیتابیس بسازید. cPanel نام کاربری حساب را به اول اسم اضافه می کند، مثلا
cpuser_wpdb. - یک کاربر دیتابیس با رمز قوی بسازید.
- در بخش Add User To Database کاربر را به دیتابیس وصل کنید و ALL PRIVILEGES را بدهید.
- در phpMyAdmin دیتابیس جدید را انتخاب کنید، به تب Import بروید و فایل
.sqlیا.sql.gzرا انتخاب کنید.
صفحه Import حداکثر حجم مجاز فایل را نشان می دهد. اگر فایل بزرگ تر است و به SSH دسترسی دارید، از خط فرمان ایمپورت کنید. در غیر این صورت از پشتیبانی هاست بخواهید این کار را انجام دهد.
mysql -u cpuser_wpuser -p cpuser_wpdb < backup.sql
اگر هنگام ایمپورت خطای #1044 - Access denied for user دیدید، فایل SQL احتمالا دستور CREATE DATABASE دارد. آن خط را از فایل پاک کنید، چون دیتابیس را قبلا خودتان ساخته اید.
ویرایش wp-config.php
فایل wp-config.php روی هاست جدید هنوز اطلاعات دیتابیس قدیم را دارد. در File Manager با Edit بازش کنید و این مقدارها را با اطلاعات دیتابیس جدید عوض کنید:
define( 'DB_NAME', 'cpuser_wpdb' );
define( 'DB_USER', 'cpuser_wpuser' );
define( 'DB_PASSWORD', 'your-new-password' );
define( 'DB_HOST', 'localhost' );
$table_prefix = 'wp_';
روی cPanel مقدار DB_HOST معمولا localhost است. $table_prefix باید با پیشوند جدول هایی که در phpMyAdmin می بینید یکی باشد. اگر جدول ها مثلا با wp8x_ شروع می شوند، همین را بنویسید.
تا زمان تغییر DNS این خط را هم اضافه کنید تا کارهای زمان بندی شده روی دو هاست هم زمان اجرا نشوند و مثلا ایمیل خبرنامه دو بار فرستاده نشود:
define( 'DISABLE_WP_CRON', true );
در پوشه wp-content دو فایل دیگر را هم بررسی کنید. اگر object-cache.php به Redis یا Memcached هاست قبلی وصل بوده، روی هاستی که این سرویس را ندارد ممکن است صفحه سفید یا خطای اتصال بدهد. advanced-cache.php هم مال افزونه کش است. اگر مطمئن نیستید، اسم هر دو را عوض کنید و بعد از انتقال کش را از تنظیمات خود افزونه دوباره فعال کنید.
تست سایت با فایل hosts قبل از تغییر DNS
فایل hosts به سیستم شما می گوید دامنه را به IP دلخواه وصل کند، بدون اینکه DNS واقعی تغییر کند. با این کار فقط سیستم شما نسخه جدید را می بیند و بقیه بازدیدکننده ها هنوز به هاست قدیم می رسند.
IP هاست جدید را از بخش General Information در ستون کناری cPanel بردارید و این خط را به فایل hosts اضافه کنید:
203.0.113.10 example.com www.example.com
| سیستم عامل | مسیر فایل | ویرایش و خالی کردن کش DNS |
|---|---|---|
| ویندوز | C:\Windows\System32\drivers\etc\hosts | Notepad را با Run as administrator باز کنید، بعد در cmd دستور ipconfig /flushdns را بزنید |
| macOS | /etc/hosts | sudo nano /etc/hosts و بعد sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder |
| لینوکس | /etc/hosts | sudo nano /etc/hosts؛ اگر systemd-resolved دارید resolvectl flush-caches |
برای اینکه مطمئن شوید واقعا نسخه جدید را می بینید، یک فایل متنی مثل new-host.txt فقط روی هاست جدید بسازید و آدرسش را در مرورگر باز کنید. اگر باز شد، مرورگر به سرور جدید وصل است. فیلترشکن و پراکسی را در این مدت خاموش کنید، چون بعضی از آن ها دامنه را روی سرور خودشان resolve می کنند و فایل hosts را نادیده می گیرند.
SSL هنوز روی هاست جدید صادر نشده و مرورگر احتمالا هشدار گواهی نشان می دهد. برای تست می توانید از هشدار عبور کنید و این موارد را امتحان کنید:
- ورود به پیشخوان و باز کردن چند نوشته و برگه
- باز کردن صفحه های داخلی؛ اگر فقط صفحه اصلی باز شد، .htaccess منتقل نشده است
- نمایش تصاویر و ارسال فرم تماس
- در فروشگاه، افزودن محصول به سبد و رسیدن به صفحه پرداخت، بدون ثبت سفارش واقعی
خط hosts را تا بعد از تغییر DNS نگه دارید و بعد حتما پاکش کنید. تا وقتی این خط هست، نمی توانید ببینید دامنه برای بقیه به کجا اشاره می کند.
تغییر آدرس سایت فقط وقتی دامنه عوض می شود
اگر دامنه و پروتکل (http یا https) مثل قبل است، به آدرس های داخل دیتابیس دست نزنید. آدرس ها فقط وقتی باید عوض شوند که دامنه جدید است یا سایت از http به https می رود.
وردپرس و افزونه ها بخشی از تنظیمات را به شکل داده سریالایز PHP ذخیره می کنند که طول هر رشته در آن ثبت شده است. اگر آدرس را با دستور REPLACE در phpMyAdmin عوض کنید، طول رشته ها با مقدار ثبت شده جور درنمی آید و تنظیمات ابزارک ها یا قالب از دست می رود. راهنمای جابه جایی وردپرس در developer.wordpress.org به همین دلیل ابزارهایی مثل WP-CLI و افزونه Better Search Replace را پیشنهاد می کند.
با WP-CLI اول بکاپ بگیرید و تغییر را آزمایشی اجرا کنید:
wp db export before-replace.sql
wp search-replace 'https://old-domain.com' 'https://new-domain.com' --skip-columns=guid --dry-run
wp search-replace 'https://old-domain.com' 'https://new-domain.com' --skip-columns=guid
wp cache flush
خروجی --dry-run تعداد جایگزینی ها را در هر جدول نشان می دهد و چیزی ذخیره نمی کند. search-replace داده سریالایز را درست مدیریت می کند. ستون guid را کنار بگذارید، چون مستندات وردپرس صریحا گفته محتوای آن هرگز نباید تغییر کند. اگر به SSH دسترسی ندارید، Better Search Replace همین کار را از پیشخوان انجام می دهد.
تغییر DNS بدون قطعی و فعال کردن SSL
برای اشاره دامنه به هاست جدید یا رکورد A را در پنل فعلی DNS عوض می کنید یا نیم سرورهای دامنه را. تغییر رکورد A با TTL پایین چند دقیقه ای اعمال می شود، ولی تغییر نیم سرور ممکن است تا ۴۸ ساعت طول بکشد.
| روش | کجا تغییر می دهید | زمان اعمال | چه چیزی را فراموش نکنید |
|---|---|---|---|
| تغییر رکورد A | پنل فعلی DNS، مثلا Zone Editor یا Cloudflare | به اندازه TTL، که اگر کمش کرده باشید چند دقیقه است | رکورد www و ساب دامین هایی که به سایت اشاره می کنند |
| تغییر نیم سرورها | پنل ثبت دامنه | ممکن است تا ۴۸ ساعت طول بکشد | همه رکوردهای DNS قدیم باید در Zone Editor هاست جدید هم ساخته شوند |
اگر نیم سرورها را عوض می کنید، قبلش Zone Editor هاست قدیم را با هاست جدید مقایسه کنید. رکوردهای MX ایمیل، رکوردهای TXT مثل SPF و تایید مالکیت Search Console و ساب دامین هایی که به سرویس دیگری اشاره می کنند باید روی هاست جدید هم باشند. اگر ایمیل های دامنه روی هاست قدیم است، صندوق ها را در هاست جدید هم بسازید تا ایمیل هایی که بعد از تغییر می رسند جایی برای تحویل داشته باشند.
برای دیدن اینکه دامنه الان به کجا اشاره می کند، خط hosts را پاک کنید و از چند DNS عمومی بپرسید:
nslookup example.com 8.8.8.8
nslookup example.com 1.1.1.1
صدور SSL بعد از رسیدن DNS
AutoSSL در cPanel معمولا مالکیت دامنه را با یک درخواست HTTP به خود دامنه بررسی می کند، پس تا وقتی دامنه به IP هاست جدید اشاره نکند، گواهی صادر نمی شود. بعد از به روز شدن DNS، در cPanel هاست جدید به SSL/TLS Status بروید و Run AutoSSL را بزنید. اگر دامنه پشت پروکسی Cloudflare است و AutoSSL خطای اعتبارسنجی داد، رکورد را موقتا روی DNS only بگذارید و بعد از صدور گواهی دوباره پروکسی را روشن کنید.
بعد از صدور گواهی، در Cloudflare حالت SSL/TLS را روی Full (strict) بگذارید. در حالت Flexible، کلودفلر با HTTP به سرور وصل می شود و اگر وردپرس یا .htaccess درخواست را به HTTPS برگرداند، طبق مستندات Cloudflare درباره خطای too many redirects حلقه ریدایرکت ایجاد می شود.
بررسی های بعد از انتقال سایت وردپرس
وقتی دامنه به هاست جدید رسید و SSL فعال شد، این موارد را یکی یکی چک کنید:
- در Settings > Permalinks بدون تغییر چیزی Save Changes را بزنید تا قواعد بازنویسی آدرس دوباره ساخته شوند.
- خط موقت
DISABLE_WP_CRONرا از wp-config.php هاست جدید بردارید و همان خط را در wp-config.php هاست قدیم بگذارید، چون تا چند روز هنوز بازدیدهایی به آنجا می رسد. اگر روی هاست جدید کرون واقعی سرور می خواهید، خط را نگه دارید و طبق راهنمای تنظیم کرون جاب در cPanel کرون بسازید. - از فرم تماس و فرم بازیابی رمز یک ایمیل آزمایشی بفرستید. اگر افزونه SMTP دارید تنظیماتش را چک کنید. اگر ایمیل از خود سرور ارسال می شود، رکورد SPF را با IP سرور جدید به روز کنید.
- در فروشگاه یک خرید واقعی با مبلغ کم انجام دهید و ببینید بعد از برگشت از بانک، وضعیت سفارش درست تغییر می کند.
- ریدایرکت های قدیمی را امتحان کنید. ریدایرکت های .htaccess همراه فایل ها آمده اند و ریدایرکت های افزونه ای مثل Redirection همراه دیتابیس.
- کش افزونه کش را خالی کنید. اگر هاست جدید لایت اسپید است و قبلا افزونه کش دیگری داشتید، تنظیمات کش را از نو بررسی کنید. برای فروشگاه، روش اندازه گیری و رفع کندی ووکامرس نشان می دهد از کجا شروع کنید.
حفظ سئو بعد از جابه جایی هاست
وقتی آدرس صفحه ها عوض نمی شود، کار سئو بعد از انتقال بیشتر بررسی است: تیک جلوگیری از ایندکس، فایل robots.txt و نقشه سایت. راهنمای Google Search Central برای جابه جایی هاست بدون تغییر آدرس می گوید طبیعی است سرعت خزیدن Googlebot بلافاصله بعد از انتقال کم شود و در چند روز بعد دوباره بالا برود. پس افت موقت خزیدن در Search Console به تنهایی نشانه مشکل نیست.
در Settings > Reading مطمئن شوید تیک Discourage search engines from indexing this site خاموش است. این تیک در نسخه های آزمایشی زیاد روشن می ماند و گاهی با انتقال به سایت اصلی هم می رسد. فایل robots.txt را باز کنید و ببینید خط Disallow: / در آن نباشد.
نقشه سایت را باز کنید، مثلا /wp-sitemap.xml در خود وردپرس یا /sitemap_index.xml در Yoast، و اگر خطا نداد در Search Console دوباره ثبتش کنید. چند صفحه مهم را با URL Inspection بررسی کنید و چند روز بعد گزارش Pages را ببینید. اگر دامنه عوض شده، از هر آدرس قدیم ریدایرکت 301 به همان آدرس روی دامنه جدید بگذارید و ابزار Change of Address را در Search Console اجرا کنید.
خطاهای رایج بعد از انتقال وردپرس و راه حل
| خطا یا نشانه | علت رایج | راه حل |
|---|---|---|
| Error establishing a database connection | اطلاعات DB_NAME، DB_USER، DB_PASSWORD یا DB_HOST اشتباه است یا کاربر به دیتابیس اضافه نشده | مقدارها را با Manage My Databases مقایسه کنید و کاربر را با ALL PRIVILEGES به دیتابیس اضافه کنید |
| خطای 500 Internal Server Error | خطی در .htaccess که مخصوص هاست قبلی بود، مثل AddHandler برای نسخه PHP، یا ناسازگاری با نسخه PHP | اسم .htaccess را موقتا عوض کنید، از Settings > Permalinks دوباره بسازیدش و نسخه PHP را در MultiPHP Manager یا Select PHP Version تنظیم کنید |
| صفحه سفید یا پیام Allowed memory size exhausted | کمبود حافظه PHP یا افزونه ای که با نسخه PHP جدید سازگار نیست | WP_DEBUG و WP_DEBUG_LOG را روشن کنید، wp-content/debug.log را بخوانید، WP_MEMORY_LIMIT را بالا ببرید یا با تغییر اسم پوشه افزونه آن را غیرفعال کنید |
| صفحه سفید یا خطای اتصال به Redis | فایل object-cache.php به سرویس کش هاست قبلی اشاره می کند | اسم wp-content/object-cache.php را عوض کنید |
| ERR_TOO_MANY_REDIRECTS پشت Cloudflare | حالت SSL روی Flexible است و سرور HTTP را به HTTPS ریدایرکت می کند | بعد از صدور SSL روی سرور، حالت SSL/TLS را Full (strict) کنید |
| هشدار Not secure یا mixed content | آدرس های http در دیتابیس یا تنظیمات قالب مانده اند | بکاپ، wp search-replace از http به https اول با --dry-run، بعد بررسی تنظیمات قالب و صفحه ساز |
| صفحه اصلی باز می شود ولی بقیه صفحه ها 404 می دهند | .htaccess منتقل نشده یا قواعد بازنویسی ساخته نشده اند | نمایش فایل های مخفی در File Manager و ذخیره دوباره Settings > Permalinks |
#1273 - Unknown collation: 'utf8mb4_0900_ai_ci' هنگام ایمپورت | خروجی معمولا از MySQL 8 گرفته شده و دیتابیس مقصد این collation را ندارد | روی یک کپی از فایل SQL این collation را با utf8mb4_unicode_ci جایگزین کنید و دوباره ایمپورت کنید |
| سایت هنوز نسخه قدیم را نشان می دهد | DNS هنوز به روز نشده یا خط hosts باقی مانده | خط hosts را پاک کنید، کش DNS را خالی کنید و با nslookup بررسی کنید |
هاست قدیم را چند روز بعد از انتقال نگه دارید
حساب هاست قدیم را همان روز انتقال نبندید. راهنمای گوگل هم می گوید لاگ هر دو سرور را زیر نظر بگیرید و هاست قدیم را وقتی خاموش کنید که دیگر ترافیکی به آن نمی رسد.
در cPanel هاست قدیم از بخش Metrics و گزینه های Visitors یا Raw Access ببینید هنوز بازدید تازه ثبت می شود یا نه. بازدید تازه روی هاست قدیم یعنی بخشی از سرورهای DNS هنوز IP قبلی را برمی گردانند.
در فروشگاه، فهرست سفارش های هاست قدیم را چک کنید و سفارش هایی را که در این فاصله ثبت شده اند دستی به سایت جدید منتقل کنید. اگر ایمیل دامنه روی هاست قدیم بود، صندوق ها را هم چند روز از طریق وب میل قدیم نگاه کنید.
قبل از بستن حساب، یک بکاپ نهایی از فایل ها و دیتابیس بگیرید و روی سیستم خودتان نگه دارید. بعد TTL رکوردها را در پنلی که DNS دامنه در آن است به مقدار قبلی برگردانید.