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 อีกดังนี้

  1. แก้ wp-config.php ไปบอกว่า PATH_CURRENT_SITE ตอนนี้เป็น /
  2. แก้ .htaccess เปลี่ยน RewriteBase เป็น /
  3. แก้ table ชื่อ wp_sites เปลี่ยน path เป็น /
  4. แก้ table ชื่อ wp_blogs เปลี่ยน path ของ site 1 เป็น / และ site 2 เป็น /talk/
  5. แก้ table ชื่อ wp_options เปลี่ยน site_url และ home เป็น (ในที่นี้) http://samplesite.dev
  6. แก้ 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 มันแก้ไขไม่ได้ นั่งคิดอยู่พักใหญ่เลยตัดสินใจทดลองว่า

  1. สร้าง site ใหม่ขึ้นมาอีก 1 อัน ใช้ path อะไรก็ได้ (เช่น /test/)
  2. ไปเปลี่ยน URL ในฐานข้อมูล (wp_blogs, wp_options และ wp_3_options)
    1. โดยเปลี่ยน URL ของ site 1 (/ เดิม) ให้เป็น /store/
    2. แล้วค่อยเปลี่ยน URL ของ site 3 (/test/ เดิม) ให้เป็น / แทน

ก็จะได้รูปร่างหน้าตาของ site ทั้ง 3 ใน Network Admin เป็นดังนี้

Renamed PathsRenamed 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 RedirectPHP Redirect

แล้วก็ไปแก้ Sample Page เดิมเค้า ลบข้อมูลเดิมออก เปลี่ยนชื่อเป็น Redirect แล้วเลือก template เป็น Redirect และท้ายที่สุด ไปเปลี่ยน Settings > Reading ตรงที่กำหนด Front page displays ให้แสดง static page แล้วเลือกหน้า Redirect … แล้วก็ลองเปิด samplesite.dev/

สำเร็จ!!

ยาวแล้ว เดี๋ยวพรุ่งนี้มาเก็บตกครับ