Screenshot 2016-08-29 22.20.38

ปัญหา URL ภาษาไทยของ WordPress

Print Friendly

ทุกข์

ในการติดตั้ง WordPress แบบโฮสต์เอง มักจะเกิดปัญหาขึ้นอย่างหนึ่งคือเวลากดดู post ทีมี title เป็นภาษาไทย จะพบกับหน้า error, not found แต่ปัญหานี้ไม่พบใน post ทีมี title เป็นภาษาอังกฤษ

หมุทัย

ถ้าผู้ใช้เขียน post title เป็นภาษาไทย WordPress มันจะสร้าง Permalink ให้อัตโนมัติโดยมีภาษาไทยอยู่ใน URL (ส่วนขวาสุดของ URL นี้เรียกว่า slug) นี่อาจจะเป็นสาเหตุให้เกิดความผิดพลาด เพราะมีบางอย่างในระบบไม่ชอบ URL ภาษาไทย ซึ่งอาจจะเป็นที่ browser, encoding ของ server, MySQL database ฯลฯ

นิโรธ

เป้าหมายการแก้ปัญหามีหลายระดับ เช่น

  1. แก้ขัด โดยแก้ไขให้ Permalink (URL) ที่สร้างอัตโนมัติโดย WordPress นั้นไม่เป็นภาษาไทย
  2. แต่ถ้าจะให้ดี ต้องแก้ให้สามารถใช้ URL ภาษาไทยได้

สำหรับบทความนี้ จะมุ่งเป้าง่ายๆ ที่ #1

ส่วน #2 นั้นคงจะมีทางทำได้ แต่ผู้เขียนยังไม่ทราบ ถ้าท่านทราบโปรดชี้แนะด้วย

มรรค

วิธีการแก้ไขมีอยู่หลายหนทาง หนทางหนึ่งที่ใช้แล้วได้ผลคือ

  1. มองหาไฟล์ formatting.php ซึ่งอยู่ใน wp-includes
  2. ทำการสำรองไฟล์ formatting.php (เช่น copy ให้เป็น formatting_original.php)
  3. แก้ไขไฟล์ formatting.php ดังนี้:
    1. เติมฟังก์ชั่นสามฟังก์ชั่นนี้ ตรงไหนก็ได้ (ท้ายไฟล์เลยก็ได้)
      function mockTitleLooksOK($title) { 
       $t = str_replace(' ', '', $title);
       $t = str_replace('-', '', $t);
       return !preg_match('/[^A-Za-z0-9]/', $t);
      }
      
      function mockRandChar() { 
       $t = "abcdefghijklmnopqrstuvwxyz"; #letters only
       $idx = rand(0, strlen($t)-1); 
       return substr($t, $idx, 1); 
      }
      
      function mockSanitizeTitle($title) { 
       if (mockTitleLooksOK($title)) return $title; 
       $title = mockRandChar().mockRandChar().rand(1000, 9999).mockRandChar().mockRandChar().rand(1000, 9999).mockRandChar().mockRandChar(); 
       return $title; 
      }
      Screenshot 2016-08-29 22.20.38
    2. มองหา function sanitize_title แล้วมองเข้าไปในฟังก์ชั่นนั้น
      1. มองหาบรรทัดที่เขียนว่า return $title;
      2. เติม code บรรทัดต่อไปนี้เข้าไปก่อนหน้าบรรทัดที่มีคำว่า return
        $title=mockSanitizeTitle($title); # by mock
        Screenshot 2016-08-29 22.25.13
  4. save ไฟล์ formatting.php
  5. refresh หน้า WordPress admin แล้วลองเขียน post ใหม่ที่มี title เป็นภาษาไทยได้เลย จะพบว่า slug (ท่อนขวาสุดบน Permalink) ที่ระบบสร้างให้กับคุณจะเป็นตัวอักษร+ตัวเลขแบบมั่วๆ เช่น ai3167sh1984pb
    Screenshot 2016-08-29 22.27.34
    แต่ถ้าคุณเขียน title เป็นภาษาอังกฤษล้วนๆ slug ก็จะเป็นภาษาอังกฤษคล้ายกับ title ของคุณแบบสวยๆ ตามเดิม
    Screenshot 2016-08-29 22.30.28
  6. คุณยังมีสิทธิเปลี่ยนแปลง slug เอง (เป็นภาษาอังกฤษและตัวเลข) อยู่ดี

เจริญพร


ตัวอย่างไฟล์

  • ไฟล์ formatting-php สำหรับ Version 4.6.1 (ระวังอย่างเผลอ copy ไปทับ version ที่ใหม่กว่า)