คำตอบสั้น ๆ: เปลี่ยนโดเมนหรือ URL ของ WordPress อย่างถูกวิธี แก้ค่า home และ siteurl แทนที่ URL เก่าในเนื้อหาด้วย WP-CLI และทำ 301 Redirect จากโดเมนเดิม
คู่มือนี้อธิบาย WordPress ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
การเปลี่ยน URL ของเว็บไซต์ WordPress เกิดขึ้นได้หลายกรณี เช่น เปลี่ยนชื่อโดเมนใหม่ ย้ายจาก http:// เป็น https:// เปลี่ยนจากมี www เป็นไม่มี หรือย้ายเว็บจากโดเมนทดสอบ (Staging) ขึ้นโดเมนจริง WordPress เก็บ URL ไว้ในฐานข้อมูลหลายตำแหน่ง ทั้งค่าตั้งค่าหลัก ลิงก์ในบทความ และข้อมูลของปลั๊กอิน การแก้แค่ที่เดียวจึงมักทำให้เว็บพัง หรือรูปภาพยังโหลดจากโดเมนเก่า
บทความนี้อธิบายการเปลี่ยน URL เป็น 2 ส่วน คือเปลี่ยนค่าหลัก (home และ siteurl) และแทนที่ URL เก่าที่ฝังอยู่ในเนื้อหา โดยถือว่าไฟล์และฐานข้อมูลอยู่บนเซิร์ฟเวอร์เดิม หากต้องย้ายไปเซิร์ฟเวอร์ใหม่ด้วย ให้ดู ย้ายเว็บไซต์ WordPress ไปโฮสต์ใหม่ ก่อน
สิ่งที่ต้องเตรียม
- ไฟล์สำรองฐานข้อมูลล่าสุด (บังคับ) เพราะการค้นหาแทนที่ย้อนกลับไม่ได้
- โดเมนใหม่ชี้มายังเซิร์ฟเวอร์แล้ว ดู ชี้โดเมนไปยังเซิร์ฟเวอร์ด้วย A Record หรือเปลี่ยน Name Server
- เว็บเซิร์ฟเวอร์รับโดเมนใหม่แล้ว (เพิ่มใน Server Block, Virtual Host หรือเพิ่มโดเมนใน Plesk/DirectAdmin) และมี SSL สำหรับโดเมนใหม่
- สิทธิ์ SSH พร้อม WP-CLI (แนะนำ) หรือสิทธิ์เข้า phpMyAdmin
สำรองฐานข้อมูลด้วย WP-CLI ก่อนเริ่ม
cd /var/www/example.com
wp db export ~/before-url-change.sql
ทำความเข้าใจค่า home และ siteurl
| ค่าในฐานข้อมูล | ชื่อในหน้า Settings > General | ความหมาย |
|---|---|---|
siteurl | WordPress Address (URL) | ที่อยู่ของไฟล์ WordPress (wp-admin, wp-includes) |
home | Site Address (URL) | ที่อยู่ที่ผู้เข้าชมพิมพ์เข้าเว็บ |
เว็บส่วนใหญ่ทั้งสองค่าเหมือนกัน ยกเว้นติดตั้ง WordPress ไว้ในโฟลเดอร์ย่อยแต่ให้หน้าแรกอยู่ที่โดเมนหลัก ห้ามใส่ / ปิดท้าย เช่น ให้ใช้ https://example.com ไม่ใช่ https://example.com/
ขั้นตอนที่ 1: เปลี่ยนค่าหลัก (เลือกวิธีใดวิธีหนึ่ง)
วิธี A: ผ่านหน้าหลังบ้าน
- ไปที่ Settings > General
- แก้ WordPress Address (URL) และ Site Address (URL) เป็นค่าใหม่
- คลิก Save Changes ระบบจะออกจากระบบ ให้เข้าสู่ระบบใหม่ผ่านโดเมนใหม่
ใช้วิธีนี้เมื่อโดเมนใหม่พร้อมใช้งานแล้วเท่านั้น หากโดเมนใหม่ยังเข้าไม่ได้ จะเข้าหลังบ้านไม่ได้ทั้งสองโดเมน หากช่องทั้งสองเป็นสีเทาแก้ไม่ได้ แปลว่ามีการกำหนดค่าไว้ใน wp-config.php แล้ว (วิธี C)
วิธี B: ผ่าน WP-CLI
wp option update home 'https://new-example.com'
wp option update siteurl 'https://new-example.com'
ผลที่ได้คือ Success: Updated 'home' option. และ Success: Updated 'siteurl' option.
วิธี C: กำหนดใน wp-config.php
เพิ่มก่อนบรรทัด /* That's all, stop editing! */
define( 'WP_HOME', 'https://new-example.com' );
define( 'WP_SITEURL', 'https://new-example.com' );
ค่านี้จะมีผลเหนือค่าในฐานข้อมูล เหมาะใช้เมื่อเข้าหลังบ้านไม่ได้ แต่ทำให้ช่องใน Settings > General แก้ไม่ได้ หลังแก้ฐานข้อมูลให้ถูกต้องแล้วจะลบออกหรือเก็บไว้ก็ได้
วิธี D: ผ่าน SQL (phpMyAdmin)
ใช้เมื่อไม่มี SSH ตรวจชื่อตารางก่อน เพราะ Prefix อาจไม่ใช่ wp_ (ดูค่า $table_prefix ใน wp-config.php)
UPDATE wp_options SET option_value = 'https://new-example.com'
WHERE option_name IN ('home', 'siteurl');
ใช้ SQL ได้เฉพาะสองค่านี้ ห้ามใช้ REPLACE() แก้เนื้อหาทั้งตาราง ดูเหตุผลในขั้นตอนถัดไป
ขั้นตอนที่ 2: แทนที่ URL เก่าในเนื้อหา
บทความ รูปภาพ เมนู วิดเจ็ต และข้อมูลของ Page Builder ยังมี URL เก่าฝังอยู่ ข้อมูลบางส่วนเก็บแบบ PHP Serialized ซึ่งระบุความยาวตัวอักษรไว้ด้วย เช่น s:22:"http://old-example.com" หากใช้ SQL REPLACE() เปลี่ยนเป็นโดเมนที่ยาวไม่เท่ากัน ตัวเลขความยาวจะผิด และ WordPress จะอ่านค่านั้นไม่ได้ ทำให้วิดเจ็ตหรือการตั้งค่าธีมหายไป wp search-replace แก้ปัญหานี้ให้อัตโนมัติ
ทดลองดูก่อนด้วย --dry-run
wp search-replace 'https://old-example.com' 'https://new-example.com' \
--skip-columns=guid --dry-run
ผลลัพธ์เป็นตารางแสดงจำนวนรายการที่จะถูกแทนที่ในแต่ละตาราง บรรทัดสุดท้ายเป็น Success: 1284 replacements to be made. (ตัวเลขขึ้นกับเว็บ) หากตัวเลขสมเหตุสมผล ให้รันจริงโดยตัด --dry-run ออก
wp search-replace 'https://old-example.com' 'https://new-example.com' --skip-columns=guid
ข้อควรรู้
--skip-columns=guidข้ามคอลัมน์ GUID ตามคำแนะนำของ WordPress เพราะ GUID เป็นรหัสประจำบทความที่ RSS Reader ใช้ ไม่ใช่ลิงก์- หากเดิมมีทั้ง
http://และwwwปนกัน ให้รันเพิ่มสำหรับแต่ละรูปแบบ เช่น'http://old-example.com'และ'https://www.old-example.com' - ปลั๊กอินบางตัวเก็บข้อมูลในตารางที่ไม่ได้ลงทะเบียนกับ WordPress ให้เพิ่ม
--all-tables-with-prefixเพื่อรวมตารางเหล่านั้น - หากไม่มี SSH ให้ใช้ปลั๊กอิน Better Search Replace ซึ่งจัดการ Serialized Data ได้เช่นกัน
หลังแทนที่เสร็จ ล้าง Cache ทุกชั้น
wp cache flush
wp rewrite flush
และล้าง Cache ของปลั๊กอิน Cache หรือ CDN ที่ใช้อยู่ด้วย