Filikod 1.2.0: อัปเดตระบบตรวจจับภาพซ้ำใน WordPress
นักพัฒนา Filikod เผยเบื้องหลังการเพิ่มฟีเจอร์ตรวจจับภาพซ้ำใน WordPress 3,099 ไฟล์ พร้อมวิธีแก้ปัญหาไฟล์แปลภาษา WPML ที่ถูกเข้าใจผิด

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- Filikod เพิ่มฟีเจอร์สแกนหาไฟล์รูปภาพซ้ำในคลังมีเดีย WordPress
- เว็บไซต์หลายภาษาที่ใช้ WPML มักสร้างไฟล์แนบซ้ำต่อภาษาแม้ใช้ไฟล์จริงอันเดียวกัน
- ระบบต้องกรองการแปลภาษาและตรวจสอบไฟล์ที่ถูกลบออกไปจากฮาร์ดดิสก์
- ปลั๊กอินเลือกที่จะแสดงผลและเตือนผู้ใช้แทนการลบไฟล์อัตโนมัติเพื่อความปลอดภัย
การจัดการคลังมีเดียบน WordPress มักมีปัญหาเรื่องไฟล์รูปภาพที่ถูกอัปโหลดซ้ำซ้อนโดยไม่รู้ตัว นักพัฒนาปลั๊กอินสแกน Alt Text ฟรีอย่าง Filikod ได้แชร์ประสบการณ์การพัฒนาฟีเจอร์ค้นหาไฟล์ภาพที่เหมือนกันทุกประการ (Exact-Duplicate Detection) หลังจากนำไปทดสอบจริงบนเว็บไซต์ของลูกค้าที่มีรูปภาพจำนวน 3,099 ไฟล์ และมีการใช้งานปลั๊กอินแปลภาษา WPML ร่วมด้วยถึงสามภาษา ซึ่งทำให้พบข้อจำกัดและปัญหาที่ไม่คาดคิดหลายประการ
ในความเป็นจริง ไฟล์รูปภาพที่ซ้ำกันมักไม่ได้ใช้ชื่อไฟล์เดียวกันเสมอไป เช่น photo.jpg และ photo-1.jpg แต่ภาพหน้าจอแดชบอร์ดเดียวกันอาจถูกอัปโหลดในเดือนกรกฎาคม สิงหาคม และกันยายน โดยทีมงานสามคนที่มีชื่อไฟล์ ชื่อเรื่อง และข้อความอัปเดต (Alt Text) แตกต่างกันโดยสิ้นเชิง ทำให้ระบบหลังบ้านของ WordPress ไม่สามารถเชื่อมโยงไฟล์เหล่านี้เข้าหากันได้ การระบุความซ้ำซ้อนจึงต้องใช้การตรวจสอบเนื้อหาข้อมูลภายในไฟล์ (Byte Fingerprint) แทนการดูที่ชื่อไฟล์
นอกจากนี้ ยังมีรายละเอียดปลีกย่อยที่นักพัฒนาต้องคำนึงถึง เช่น ตั้งแต่ WordPress 5.3 เป็นต้นมา ระบบจะย่อขนาดภาพขนาดใหญ่อัตโนมัติและให้ไฟล์แนบชี้ไปที่ภาพที่ย่อแล้ว ขณะที่ไฟล์ต้นฉบับยังคงอยู่บนดิสก์ หากเว็บไซต์เคยเปลี่ยนไลบรารีรูปภาพระหว่างการอัปโหลด ไบต์ของไฟล์อาจไม่ตรงกัน การคำนวณลายนิ้วมือจึงต้องทำกับไฟล์ต้นฉบับเมื่อ WordPress ยังเก็บรักษาไว้ และต้องอัปเดตลายนิ้วมือใหม่ทุกครั้งที่มีการปรับแต่งขนาดหรือใช้งานเครื่องมือแก้ไขภาพในระบบ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ปัญหาสำคัญที่เกิดขึ้นระหว่างการสแกนเว็บไซต์หลายภาษาคือ ปลั๊กอินแปลภาษาอย่าง WPML, Polylang และ Bogo จะสร้างไฟล์แนบแยกต่างหากสำหรับแต่ละภาษา แม้ว่าจะชี้ไปที่ไฟล์จริงอันเดียวกันบนดิสก์ก็ตาม ผลลัพธ์คือระบบตรวจจับภาพซ้ำมองเห็นไฟล์เหล่านี้เป็นภาพซ้ำที่ต้องจัดการ ทั้งที่หากลบออกจะทำให้หน้าเว็บในภาษาอื่นแสดงผลภาพไม่ถูกต้อง นอกจากนี้ระบบตรวจสอบ Alt Text ยังเคยทำงานผิดพลาดโดยนับข้อความแบรนด์เดียวกันในแต่ละภาษาเป็นข้อผิดพลาดซ้ำซ้อน
การพัฒนาปลั๊กอินสำหรับระบบ WordPress ที่รองรับหลายภาษา (Multilingual) มักมีความซับซ้อนสูง เนื่องจากสถาปัตยกรรมของปลั๊กอินแปลภาษาแต่ละตัวจัดเก็บความสัมพันธ์ของข้อมูลไม่เหมือนกัน นักพัฒนาจึงไม่สามารถใช้คำสั่งคิวรีฐานข้อมูลแบบมาตรฐานทั่วไปได้ มิฉะนั้นระบบจะมองข้ามข้อมูลของภาษาอื่น หรือดึงข้อมูลที่ไม่เกี่ยวข้องเข้ามาปะปน ซึ่งเป็นจุดที่ต้องอาศัยความเข้าใจเชิงลึกเกี่ยวกับโครงสร้างตารางข้อมูลของแต่ละปลั๊กอิน
แนวทางแก้ไขคือการกำหนดกฎว่าชุดการแปลภาษาทั้งหมด (Translation Set) ให้ถือเป็นรูปภาพเดียว โดยปลั๊กอินแปลภาษาแต่ละตัวจะมีตารางหรือตารางเสริมที่เก็บความสัมพันธ์นี้ไว้ เมื่อดึงข้อมูลแผนผังดังกล่าวมาได้ กลุ่มไฟล์ที่มีไบต์เหมือนกันจะถูกยุบเหลือเพียงรายการเดียวต่อหนึ่งชุดการแปลภาษา รวมถึงกฎของ Alt Text ที่จะนับว่าซ้ำก็ต่อเมื่ออยู่บนรูปภาพที่แตกต่างกันอย่างแท้จริงเท่านั้น ส่วนปลั๊กอินประเภทแปลแบบสดอย่าง Weglot หรือ TranslatePress จะไม่สร้างไฟล์แนบเพิ่ม จึงไม่มีปัญหานี้
"Rewriting every reference to a file across post content, page builder JSON, custom fields and widgets is where duplicate cleaners earn their one-star reviews"
ผู้พัฒนา Filikod
หลังจากปรับปรุงระบบเรียบร้อยแล้ว ผลการสแกนบนคลังมีเดียเดิมลดลงเหลือเพียง 29 กลุ่ม และมีไฟล์ส่วนเกิน 30 ไฟล์ ซึ่งทั้งหมดเป็นภาพซ้ำที่ใช้งานจริงบนหน้าเว็บ นอกจากนี้ยังพบไฟล์ตกค้างจากการย้ายเว็บไซต์อีก 232 ไฟล์ที่ไม่มีไฟล์อยู่บนดิสก์แล้วแต่ยังมีชื่อปรากฏในระบบ ทำให้ผู้เข้าชมเห็นเป็นภาพเสีย นักพัฒนาจึงได้เพิ่มแท็บแยกสำหรับตรวจสอบไฟล์เหล่านี้โดยเฉพาะ พร้อมระบุเส้นทางและหน้าที่ใช้งานเพื่อให้ผู้ดูแลระบบจัดการได้ง่ายขึ้น
ประเด็นทางเทคนิคอีกจุดหนึ่งคือ การกรองคิวรีของผู้ดูแลระบบตามภาษาปัจจุบัน ทำให้การสแกนข้ามข้อมูลไปถึงสองในสามส่วน จนกว่าจะมีการกำหนดคำสั่งให้ละเว้นตัวกรองของบุคคลที่สามด้วยคำสั่ง 'suppress_filters' => true ซึ่งนักพัฒนาซอฟต์แวร์ควรตรวจสอบยอดนับข้อมูลกับ SQL ดิบเสมอ ฟีเจอร์ทั้งหมดนี้ได้ถูกรวมไว้ใน Filikod เวอร์ชัน 1.2.0 ซึ่งเปิดให้ใช้งานฟรีภายใต้สัญญาอนุญาต GPL บน WordPress.org
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น