My Geeky Weekends #3
ย้อนความเดิม เราต้องการเปลี่ยน WordPress จาก single site samplesite.dev/store/
เป็น multisite แต่เราไม่ต้องการให้ site ลูก ๆ เข้าไปอยู่ใต้ site หลัก คือ อยากได้ samplesite.dev/talk/
ไม่ใช่ samplesite.dev/store/talk/
ทีนี้ด้วย requirement ที่ลูกค้าไม่ต้องการ URL ซ้อนสอง เพราะฉะนั้น /store/talk/
ใช้ไม่ได้ วิธีง่ายสุดที่คิดได้คือ ย้าย WordPress installation ออกจาก /store/
directory แต่ถ้าทำแค่นี้ พังนะครับ นอกจากนี้แล้วต้องแก้ข้อมูลแบบ manually อีกดังนี้
- แก้
wp-config.php
ไปบอกว่าPATH_CURRENT_SITE
ตอนนี้เป็น/
- แก้
.htaccess
เปลี่ยนRewriteBase
เป็น/
- แก้ table ชื่อ
wp_sites
เปลี่ยน path เป็น/
- แก้ table ชื่อ
wp_blogs
เปลี่ยน path ของ site 1 เป็น/
และ site 2 เป็น/talk/
- แก้ table ชื่อ
wp_options
เปลี่ยนsite_url
และhome
เป็น (ในที่นี้)http://samplesite.dev
- แก้ table ชื่อ
wp_2_options
เปลี่ยนsite_url
และhome
เป็นhttp://samplesite.dev/talk
ทำแบบง่าย ๆ ก็เข้าไปแก้ใน MySQL ทีละบรรทัด อันนี้จะแน่นอนกว่า แต่ถ้าขี้เกียจและมั่นใจ ก็เขียน query รวม ๆ แล้ว update ทีเดียวเลยก็ได้ อันนี้แล้วแต่ถนัด ถ้าจากตัวอย่างที่ใช้ query คร่าว ๆ ก็ประมาณนี้
[sql] UPDATE wp_sites SET path = ‘/’; UPDATE wp_blogs SET path = REPLACE(path, ‘/store’, ”); UPDATE wp_options SET option_value = REPLACE(option_value, ‘/store’, ”); UPDATE wp_2_options SET option_value = REPLACE(option_value, ‘/store’, ”); [/sql]
หมายเหตุ: อย่า copy/paste นะครับ อันตรายมาก!
เท่านี้ก็จะได้ samplesite.dev/
และ samplesite.dev/talk/
มาใช้งาน
พอถึงเวลาส่งงาน ปรากฎว่าลูกค้าอยากให้แบ่งส่วนของหน้าร้านไว้ที่ samplesite.dev/store/
เหมือนเดิม และส่วนของ blog ไว้ที่ samplesite.dev/talk/
(หลังแก้ไขแล้ว หน้าร้านจะไปอยู่ที่ samplesite.dev/
เลย)
ยังไงหละทีนี้ เปิดเข้าไปดูใน Network Admin ก็เห็นว่า path ของแต่ละ site มันแก้ไขไม่ได้ นั่งคิดอยู่พักใหญ่เลยตัดสินใจทดลองว่า
- สร้าง site ใหม่ขึ้นมาอีก 1 อัน ใช้ path อะไรก็ได้ (เช่น
/test/
) - ไปเปลี่ยน URL ในฐานข้อมูล (
wp_blogs
,wp_options
และwp_3_options
)- โดยเปลี่ยน URL ของ site 1 (
/
เดิม) ให้เป็น/store/
- แล้วค่อยเปลี่ยน URL ของ site 3 (
/test/
เดิม) ให้เป็น/
แทน
- โดยเปลี่ยน URL ของ site 1 (
ก็จะได้รูปร่างหน้าตาของ site ทั้ง 3 ใน Network Admin เป็นดังนี้
Renamed Paths
พอทดสอบดูแล้วปรากฎว่า ใช้ได้!! URL ทั้ง 3 ไม่ว่าจะเป็น /store/
, /talk/
และ /
ใช้งานได้ตามที่ต้องการ แต่ทีนี้กลายเป็นว่า เราต้องมีหน้าเพิ่มขึ้นมาสำหรับ /
ซึ่งก่อนหน้านี้ใช้ redirect ไปที่ /store/
แต่ด้วยความที่มันเป็นหน้าหนึ่งของ WordPress แล้วที่นี้จะทำยังไง?
ครุ่นคิดอยู่พักใหญ่ ตัดสินใจขี้โกงว่า WordPress สามารถกำหนด template ของแต่ละหน้า (Page) ได้ ถ้าเราเขียน template ให้ในนั้นมีแต่คำสั่ง redirect หละ? ว่าแล้วก็เขียน redirect.php
เพิ่มเข้าไปใน template directory ดังนี้
” <?php ” /* ” * Template Name: Redirect ” */ ” header(‘Location: /store/’);
PHP Redirect
แล้วก็ไปแก้ Sample Page เดิมเค้า ลบข้อมูลเดิมออก เปลี่ยนชื่อเป็น Redirect แล้วเลือก template เป็น Redirect และท้ายที่สุด ไปเปลี่ยน Settings > Reading
ตรงที่กำหนด Front page displays
ให้แสดง static page แล้วเลือกหน้า Redirect … แล้วก็ลองเปิด samplesite.dev/
สำเร็จ!!
ยาวแล้ว เดี๋ยวพรุ่งนี้มาเก็บตกครับ