ข้อผิดพลาด hreflang ในเว็บไซต์หลายภาษา|7 สาเหตุทางเทคนิคที่ทำให้แท็กใช้ไม่ได้

本文作者:Don jiang

ตัวอย่างเช่น หากมีปัญหาด้านรูปแบบรหัสภาษา หรือเส้นทางลิงก์ไม่สมบูรณ์ อาจทำให้เครื่องมือค้นหาไม่สามารถระบุภาษา หรือภูมิภาคของหน้าเว็บได้อย่างถูกต้อง ส่งผลให้หน้าเว็บไซต์หลายภาษามาแย่งชิงทราฟฟิกกันเอง และพลาดกลุ่มเป้าหมายได้

บทความนี้จะสรุป 7 ข้อผิดพลาดที่พบบ่อยที่สุดในการตั้งค่า hreflang จากมุมมองทางเทคนิค พร้อมแนะนำให้ตรวจสอบเป็นประจำด้วยเครื่องมือ เพื่อป้องกันความผิดพลาดเล็กน้อยที่อาจทำให้ประสิทธิภาพ SEO โดยรวมลดลง

ข้อผิดพลาด hreflang ของเว็บไซต์หลายภาษา

Table of Contens

ข้อผิดพลาดรูปแบบรหัสภาษา หรือรหัสภูมิภาค

ตัวอย่างเช่น ใช้ตัวอักษรใหญ่ (เช่น EN-US) หรือสะกดผิด (เช่น เขียน zh-CN เป็น zh-CH) อาจทำให้เครื่องมือค้นหาไม่สามารถอ่านข้อมูลได้ถูกต้อง และถือว่าแท็กไม่ถูกต้อง

แม้รหัสจะดูเหมือนถูกต้อง (เช่น ใช้ es-ES แทน es) แต่บางครั้งข้อมูลส่วนเกินก็ทำให้ระบบสับสนได้

ผลกระทบค่อนข้างรุนแรง เช่น ทราฟฟิกจากผู้ใช้ในสเปนอาจถูกส่งไปยังหน้าภาษาโปรตุเกสแทน

กฎของรหัสตามมาตรฐาน ISO

  • รหัสภาษา: ต้องใช้รหัสอักษรพิมพ์เล็ก 2 ตัวตามมาตรฐาน ISO 639-1 (เช่น en, es, zh).
  • รหัสภูมิภาค: ไม่จำเป็นเสมอไป ใช้อักษรพิมพ์ใหญ่ 2 ตัวตามมาตรฐาน ISO 3166-1 (เช่น US, GB, CN).
  • รูปแบบรวมกัน: เชื่อมด้วยเครื่องหมายขีดกลาง เช่น en-US (ภาษาอังกฤษแบบอเมริกัน) หรือ zh-CN (ภาษาจีนตัวย่อ).

กรณียกเว้น:

  • หากใช้เฉพาะรหัสภาษา (เช่น fr) จะหมายถึงผู้ใช้ที่พูดภาษานั้นทั้งหมด ไม่จำกัดภูมิภาค
  • กรณีภาษาจีนตัวเต็ม ให้ใช้ zh-Hant (ภาษาจีนตัวเต็ม) หรือ zh-Hant-TW (ภาษาจีนตัวเต็มในไต้หวัน) แทน zh-TW เพื่อป้องกันความสับสนกับภาษาจีนตัวย่อของไต้หวัน

กรณีข้อผิดพลาดทั่วไปและผลกระทบ

ข้อผิดพลาด 1: ใช้ตัวพิมพ์เล็ก/ใหญ่สลับกัน

  • ตัวอย่างผิด: EN-us (รหัสภาษาเป็นตัวพิมพ์ใหญ่ + รหัสภูมิภาคเป็นตัวพิมพ์เล็ก), Zh-cn (ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่)
  • ผลกระทบ: เครื่องมือค้นหาอาจไม่อ่านแท็กเลย ทำให้หน้าเว็บไม่แสดงกับผู้ใช้งานเป้าหมาย

ข้อผิดพลาด 2: สะกดผิด หรือใช้รหัสสมมุติ

  • ตัวอย่างผิด: pt-BZ (รหัสบราซิลที่ถูกต้องคือ BR), eu (ภาษาบาสก์ อาจไม่รองรับในบางระบบ)
  • ผลกระทบ: รหัสที่ผิดหรือภาษาหายากจะทำให้ไม่ถูกจัดอันดับ และทราฟฟิกไหลไปหน้าภาษาหลัก

ข้อผิดพลาด 3: ใช้รหัสซ้ำซ้อน หรือผิดรูปแบบ

  • ตัวอย่างผิด: es-ES (ภาษาสเปน + สเปน, จริงๆ ใช้แค่ es ก็พอ), en-US-UK (รูปแบบรวมหลายภูมิภาคที่ไม่ถูกต้อง)
  • ผลกระทบ: ข้อมูลส่วนเกินทำให้ระบบสับสน หน้าเว็บที่รหัสสั้นกว่าจะถูกแสดงก่อน

เครื่องมือแนะนำและวิธีตรวจสอบ

  • Google hreflang Testing Tool: ใส่ URL เพื่อตรวจว่ารหัส hreflang ถูกต้องหรือไม่ (แนะนำใช้ร่วมกับ Search Console)
  • Screaming Frog: ตรวจสอบ hreflang ขณะ Crawl เว็บไซต์ และส่งออกข้อผิดพลาดเป็นชุด (เวอร์ชันเสียเงิน)
  • Hreflang Validator (เครื่องมือบุคคลที่สาม): ตรวจสอบออนไลน์ฟรี แสดงข้อผิดพลาดหรือความขัดแย้ง

ขั้นตอนแก้ไขจริง

ตรวจสอบโค้ดปัจจุบัน: หากใช้ WordPress ให้ใช้ปลั๊กอิน (เช่น Yoast SEO) หรือดู Source Code โดยตรงเพื่อค้นหาแท็ก <link rel="alternate" hreflang="..." />

การแทนที่โค้ดที่ผิดพลาดแบบกลุ่ม

  1. หากใช้ปลั๊กอินหลายภาษา (เช่น WPML) ให้แก้ไข “รหัสภาษา” โดยตรงในตั้งค่าภาษา
  2. หากแก้ไขเอง ให้แน่ใจว่าทุกหน้ามีรูปแบบเดียวกัน (เช่น แทนที่ EN เป็น en ทั้งเว็บไซต์)

การเพิ่มรหัสภูมิภาค (ไม่บังคับ)

  • เพิ่มเฉพาะเมื่อจำเป็นต้องแบ่งภูมิภาคอย่างละเอียด (เช่น en-GB สำหรับผู้ใช้สหราชอาณาจักร) หากไม่จำเป็นให้ใช้เฉพาะรหัสภาษา (เช่น fr)

ตรวจสอบอีกครั้ง:ใช้เครื่องมือตรวจสอบอีกครั้ง เพื่อให้แน่ใจว่าหน้าเพจที่แก้ไขแล้วแสดงสถานะ 200 และไม่มีข้อผิดพลาดในการรวบรวมข้อมูล

ไม่ใช้ URL แบบสัมบูรณ์อย่างครบถ้วน

เจ้าของเว็บไซต์หลายคนเข้าใจผิดว่าการใช้เส้นทางสัมพัทธ์ (เช่น /de/page) หรือการละเว้นโปรโตคอล (เช่น example.com/de) จะทำให้การตั้งค่าง่ายขึ้น แต่จริงๆ แล้วอาจทำให้เกิดปัญหาร้ายแรง

ตัวอย่างเช่น หากมีทั้ง http และ https บนหน้าเดียวกัน การไม่ระบุโปรโตคอลอาจทำให้เครื่องมือค้นหาคิดว่าเป็นสองหน้าแยกกัน ส่งผลให้คะแนน SEO แยกออกจากกัน

หรือถ้าเว็บไซต์มีโครงสร้างแบบซับโดเมนหรือซับไดเรกทอรี การไม่ใช้ URL แบบสัมบูรณ์อย่างครบถ้วน อาจทำให้เครื่องมือค้นหาตีความผิด (เช่น ใช้ URL เดียวกันทั้งมือถือและเดสก์ท็อป)

นิยามและความสำคัญของ URL แบบสัมบูรณ์

URL แบบสัมบูรณ์ ต้องประกอบด้วย โปรโตคอล (เช่น http:// หรือ https://) ชื่อโดเมนแบบเต็ม และเส้นทาง (เช่น https://www.example.com/de/page)

ความสำคัญ

  1. เครื่องมือค้นหาต้องสามารถแยกแยะหน้าแต่ละหน้าได้อย่างชัดเจน หากใช้เส้นทางสัมพัทธ์ (เช่น /de/page) อาจทำให้สับสนระหว่าง http และ https ส่งผลให้เกิดปัญหาคอนเทนต์ซ้ำ
  2. หากมีซับโดเมนหรือซับไดเรกทอรี การไม่ใช้ URL แบบเต็มอาจทำให้เครื่องมือค้นหาตีความผิดว่าหน้าอยู่คนละที่ (เช่น de.example.com/page กับ www.example.com/de/page)

สถานการณ์ปัญหาทั่วไป

  • มีทั้ง http และ https แต่ใน hreflang ไม่ระบุโปรโตคอล ทำให้คะแนน SEO แยกกัน
  • ใช้คอนเทนต์เดียวกันทั้งมือถือและเดสก์ท็อป แต่โครงสร้าง URL ต่างกัน (เช่น m.example.com/de และ example.com/de) โดยไม่ใช้ URL แบบสัมบูรณ์

ตัวอย่างข้อผิดพลาดและผลกระทบ

ข้อผิดพลาดที่ 1: ใช้เส้นทางสัมพัทธ์หรือไม่ระบุโปรโตคอล

ตัวอย่างผิด

  1. <link hreflang="de" href="/de/page" /> (เส้นทางสัมพัทธ์)
  2. <link hreflang="es" href="www.example.com/es/page" /> (ไม่ระบุ https://)

ผลกระทบ

  • เครื่องมือค้นหาอาจตีความ /de/page เป็น http://example.com/de/page ทั้งที่จริงๆ แล้วเป็น https ทำให้แท็กไม่ทำงาน
  • หน้า HTTP และ HTTPS ถูกมองว่าเป็นคนละหน้า ทำให้คอนเทนต์ซ้ำและคะแนน SEO กระจายตัว

ข้อผิดพลาดที่ 2: ซับโดเมนไม่สอดคล้องกัน

  • ตัวอย่างผิด: โฮมเพจใช้ https://example.com/fr/page แต่ซับไซต์ภาษาฝรั่งเศสใช้ URL อื่น
  • https://fr.example.com/page โดยที่ hreflang ไม่ได้เชื่อมโยงกันด้วย URL แบบสมบูรณ์ (Absolute URL)
  • ผลกระทบ: เครื่องมือค้นหาไม่สามารถเชื่อมโยงหน้าของซับโดเมนกับหน้าเว็บไซต์หลักได้ ทำให้ผู้ใช้ภาษาฝรั่งเศสอาจถูกนำไปยังหน้าภาษาเริ่มต้น
  • ข้อผิดพลาดที่ 3: พารามิเตอร์แบบไดนามิกไม่ได้มาตรฐาน

    • ตัวอย่างข้อผิดพลาด: <link hreflang="ja" href="https://example.com/page?lang=ja" /> (มีพารามิเตอร์ติดตาม)
    • ผลกระทบ: เครื่องมือค้นหาอาจมองว่าเป็นหน้าต่างกัน (เช่น ?lang=ja กับ ?lang=ja&utm=ads) ทำให้แท็ก hreflang ไม่ครอบคลุมครบถ้วน

    วิธีตรวจสอบด้วยเครื่องมือ

    • Google Search Console:
      ตรวจสอบ “รายงานความครอบคลุม” เพื่อค้นหาข้อผิดพลาดเกี่ยวกับ “หน้าเนื้อหาซ้ำ” หรือ “ไม่ได้ตั้งค่า hreflang” เพื่อหาลิงก์ URL ที่ไม่สมบูรณ์
    • Screaming Frog:
      ทำการ Crawl เว็บไซต์ แล้วกรอง hreflang เพื่อตรวจสอบว่า href ทุกตัวเป็น Absolute URL หรือไม่ (ตัวกรอง: //example.com หรือ /path)
    • Sitebulb:
      รายงาน “การตรวจสอบ SEO ระหว่างประเทศ” จะแจ้งเตือน “hreflang URL ไม่สมบูรณ์” พร้อมคำแนะนำการแก้ไข

    แนวทางแก้ไขและขั้นตอนปฏิบัติ

    ระบบ CMS (เช่น WordPress):

    การตั้งค่าปลั๊กอิน:
    ถ้าใช้ปลั๊กอิน เช่น Yoast SEO ให้เปิดใช้งาน “สร้าง URL แบบสมบูรณ์” ในการตั้งค่าภาษา (มักต้องปิดตัวเลือก “เส้นทางแบบสัมพัทธ์”)

    การแทนที่ข้อมูลในฐานข้อมูลแบบกลุ่ม:
    ใช้คำสั่ง SQL หรือปลั๊กอิน เช่น Better Search Replace เพื่อแทนที่ href="/ ด้วย href="https://www.example.com/

    การแก้ไขโค้ดด้วยตนเอง:
    ใน HTML หรือระบบ Render ฝั่งเซิร์ฟเวอร์ ตรวจสอบให้แน่ใจว่า hreflang ทุกลิงก์เป็น Absolute URL เช่น:

    <link rel="alternate" hreflang="de" href="<?php echo site_url('/de/page'); ?>" />

    การตั้งค่าเซิร์ฟเวอร์:

    • บังคับให้ใช้โปรโตคอลเดียวกัน: ใช้ .htaccess หรือ Nginx เพื่อ Redirect จาก http ไป https เพื่อหลีกเลี่ยงเนื้อหาผสม
    • ทำให้ URL เป็นแบบคงที่: เพิ่มการ Redirect 301 ระหว่างเส้นทางต่างๆ (เช่น /de กับ /de/) เพื่อใช้ URL แบบ Absolute เพียงหนึ่งเดียว

    ขาดแท็ก hreflang อ้างอิงตนเอง

    ตัวอย่างเช่น หน้าเว็บภาษาฝรั่งเศสที่มีลิงก์ไปยังภาษาอังกฤษหรือสเปน แต่ไม่มี hreflang="fr" ที่ชี้กลับมาหาตนเอง

    เครื่องมือค้นหาอาจไม่สามารถระบุภาษาเจ้าของของหน้าได้ ทำให้ไม่แสดงในผลการค้นหาสำหรับผู้ใช้ภาษาฝรั่งเศส

    บทบาทและความสำคัญของแท็กอ้างอิงตนเอง

    แท็กอ้างอิงตนเอง คือ การเพิ่มแท็ก hreflang ที่อ้างอิงกลับมาที่หน้าเดิม (เช่น หน้าเว็บภาษาฝรั่งเศสต้องมี <link rel="alternate" hreflang="fr" href="URL ของตนเอง"/>)

    บทบาทสำคัญ:

    • ช่วยบอกเครื่องมือค้นหาให้รู้ว่า หน้านี้เป็นของภาษา/ภูมิภาคใดอย่างชัดเจน เพื่อป้องกันความเข้าใจผิด
    • สร้าง การเชื่อมโยงแบบวงปิด ระหว่างหน้าในหลายภาษา เพื่อส่งผ่านค่าความสำคัญอย่างถูกต้อง

    ผลกระทบเมื่อขาดแท็กนี้

    • เครื่องมือค้นหาอาจมองว่าหน้าเว็บ “ไม่ได้ระบุภาษา” และจัดไปยังโฟลเดอร์ภาษาหลักโดยอัตโนมัติ ส่งผลให้สูญเสียทราฟฟิกจากผู้ใช้เป้าหมาย
    • ในกรณีแข่งขันกันหลายภาษา (เช่น ทั้งหน้าภาษาอังกฤษและภาษาสเปนไม่มี hreflang อ้างอิงตัวเอง) อาจเกิดปัญหาเนื้อหาซ้ำซ้อนภายในเว็บไซต์

    ตัวอย่างข้อผิดพลาดทั่วไปและกรณีศึกษา

    ข้อผิดพลาด 1: ใช้ hreflang ผิดในเว็บไซต์ภาษาเดียว

    • สถานการณ์: หน้าเว็บมีแค่ภาษาเดียว แต่กลับเพิ่ม hreflang ไปยังหน้าภาษาอื่นที่ไม่มีอยู่จริง
    • ตัวอย่าง: เว็บภาษาอังกฤษล้วนใส่ hreflang="en" ชี้กลับมาหาตัวเอง แต่ดันใส่ hreflang="es" ที่ชี้ไปยังหน้าที่ไม่มีอยู่จริง ทำให้เครื่องมือค้นหาสับสน

    ข้อผิดพลาด 2: ลืมตั้งค่าปลั๊กอินหลายภาษา

    • ตัวอย่าง: ใช้ปลั๊กอิน WPML แต่ไม่ได้เลือกตัวเลือก “สร้าง hreflang อ้างอิงตัวเองอัตโนมัติ”
    • ผลลัพธ์: ระบบสร้างแท็กเฉพาะลิงก์ภาษาต่างๆ แต่ขาดลิงก์ของหน้าปัจจุบัน

    ข้อผิดพลาด 3: หน้าเว็บแบบไดนามิกไม่ใส่แท็กครบถ้วน

    • ตัวอย่าง: เว็บไซต์ที่ใช้ React หรือ Vue เรนเดอร์ด้วย JavaScript แต่ไม่ได้แทรก hreflang อย่างถูกต้องใน <head>
    • ผลลัพธ์: บอทเครื่องมือค้นหาอาจอ่านไม่เจอแท็ก hreflang ที่สร้างแบบไดนามิก

    เครื่องมือและวิธีการตรวจสอบ

    ขั้นตอนที่ 1: ตรวจโค้ดด้วยตนเอง

    • กด Ctrl+U เพื่อดูซอร์สโค้ด แล้วค้นคำว่า hreflang="xx" ตรวจว่ามีแท็กที่ชี้กลับมาหน้าปัจจุบันหรือไม่ (xx คือรหัสภาษาของหน้า)

    ขั้นตอนที่ 2: ตรวจผ่าน Google Search Console

    • ใช้ “เครื่องมือตรวจสอบ URL” ใส่ลิงก์หน้า แล้วดูรายงาน “การกำหนดเป้าหมายระหว่างประเทศ” ว่ามีแจ้งว่า “ขาดแท็ก hreflang ของตัวเอง” หรือไม่

    ขั้นตอนที่ 3: ใช้ Hreflang Validator

    • กรอก URL หน้าเว็บ ระบบจะแสดงลิงก์ hreflang ทั้งหมด ถ้าขาดแท็กอ้างอิงตัวเองจะขึ้นแจ้งเตือนเป็นสีแดง

    แนวทางแก้ไขและวิธีทำจริง

    แก้ไขผ่าน CMS (เช่น WordPress)

    แก้ไขการตั้งค่าปลั๊กอิน

    • ถ้าใช้ Yoast SEO: เข้า “การตั้งค่าขั้นสูง” แล้วเปิดตัวเลือก “เพิ่ม hreflang อ้างอิงตัวเอง”
    • ถ้าใช้ WPML: เข้า “ตั้งค่าภาษา” → “ตัวเลือก SEO” แล้วติ๊ก “ใส่ลิงก์หน้าตัวเองด้วย”

    แก้ไขด้วยตนเอง (เว็บ Static หรือ Custom Code)

    เพิ่มโค้ดนี้ใน <head> (ตัวอย่างหน้าเว็บภาษาฝรั่งเศส):

    <link rel="alternate" hreflang="fr" href="https://www.example.com/fr/page-actuelle" />
    <link rel="alternate" hreflang="x-default" href="https://www.example.com/" />

    การแก้ไขหน้าเรนเดอร์แบบไดนามิก (เช่น React)

    ในตรรกะการเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR) สร้างแท็กอ้างอิงตนเองตามภาษาของหน้าปัจจุบันอย่างไดนามิก:

    const hreflangSelf = `<link rel="alternate" hreflang="${currentLang}" href="${currentURL}"/>`;
    document.head.insertAdjacentHTML('beforeend', hreflangSelf);

    หน้าหลายภาษาไม่มีการเชื่อมโยงกัน

    ตัวอย่างเช่น หน้าเยอรมันเชื่อมโยงไปยังเวอร์ชันภาษาอังกฤษ แต่หน้าอังกฤษไม่ได้ลิงก์กลับไปยังหน้าเยอรมัน

    การเชื่อมโยงทางเดียวทำให้เครื่องมือค้นหาไม่สามารถยืนยันความสัมพันธ์ของเวอร์ชันหลายภาษาได้ และอาจทำให้มีการจัดทำดัชนีเพียงบางหน้า หรือเข้าใจผิดว่าเป็นเนื้อหาซ้ำกัน

    หลักการและความจำเป็นของการเชื่อมโยงแบบวงปิด

    กฎสำคัญของ hreflang คือ หน้าที่เชื่อมโยงกันทั้งหมดต้องชี้ไปหากันและกัน เพื่อสร้างวงปิดที่สมบูรณ์ เช่น:

    • หน้าภาษาเยอรมัน (de) ต้องชี้ไปยังหน้าภาษาอังกฤษ (en), ภาษาฝรั่งเศส (fr) และเวอร์ชันภาษาอื่น ๆ;
    • หน้าภาษาอังกฤษและภาษาฝรั่งเศสต้องชี้กลับไปยังหน้าเยอรมันด้วย

    ความจำเป็น:

    • การส่งต่อคะแนน SEO: การเชื่อมโยงแบบวงปิดช่วยให้เครื่องมือค้นหาเข้าใจว่าหน้าหลายภาษาคือเวอร์ชันที่เท่าเทียมกัน ป้องกันการกระจายคะแนน SEO
    • ป้องกันเนื้อหาซ้ำซ้อน: หากมีการเชื่อมโยงทางเดียว (เช่น หน้าอังกฤษชี้ไปยังหน้าเยอรมันแต่หน้าเยอรมันไม่ชี้กลับ) เครื่องมือค้นหาอาจมองว่าเป็นเนื้อหาที่แยกจากกันและอาจถูกลงโทษเรื่องเนื้อหาซ้ำซ้อน

    กรณียกเว้น:

    • หน้าเว็บไซต์ภาษาเดียว (เช่น มีแค่ภาษาอังกฤษ) ไม่จำเป็นต้องเชื่อมโยงแบบวงปิด แต่ต้องมีการอ้างอิงตนเอง
    • รูปแบบภาษาท้องถิ่น (เช่น en-US และ en-GB) ควรชี้หากันและกัน แต่ไม่จำเป็นต้องเชื่อมโยงกับภาษาอื่น

    กรณีที่เกิดการขาดลิงก์และผลกระทบที่พบบ่อย

    กรณี 1: การเพิ่มเวอร์ชันภาษาใหม่โดยไม่อัปเดตหน้าเดิม

    • ตัวอย่าง: เว็บไซต์ข่าวเพิ่มหน้าภาษาญี่ปุ่น (ja) แต่หน้าอังกฤษและจีนเดิมไม่ได้เพิ่มแท็ก hreflang ชี้ไปยังหน้าภาษาญี่ปุ่น
    • ผลกระทบ: หน้าภาษาญี่ปุ่นกลายเป็น “หน้าที่โดดเดี่ยว” เครื่องมือค้นหาจะจัดทำดัชนีเฉพาะหน้าอื่น ๆ ที่ไม่มีการเชื่อมโยงเท่านั้น

    กรณี 2: ข้อบกพร่องในตรรกะของปลั๊กอิน CMS

    • ตัวอย่าง: ปลั๊กอินหลายภาษาของ WordPress (เช่น Polylang) ไม่ได้เพิ่มลิงก์ภาษาใหม่ให้กับเนื้อหาเก่าโดยอัตโนมัติเมื่อสร้างหน้าจำนวนมาก
    • ผลกระทบ: การเชื่อมโยงบางหน้าถูกตัดขาด ผู้ใช้ไม่สามารถสลับไปยังเวอร์ชันภาษาใหม่จากเนื้อหาเก่าได้

    กรณี 3: พารามิเตอร์ไดนามิกทำให้การเชื่อมโยงล้มเหลว

    • ตัวอย่าง: URL ของหน้าภาษาเสปนมีพารามิเตอร์ (เช่น ?lang=es) แต่หน้าในภาษาอื่นไม่ได้รวมพารามิเตอร์นี้ใน hreflang
    • ผลกระทบ: เครื่องมือค้นหาจะมองว่า URL ที่มีพารามิเตอร์ es เป็นเนื้อหาที่ไม่เกี่ยวข้อง

    เครื่องมือและวิธีการตรวจสอบ

    เครื่องมือ 1: Screaming Frog

    • ในผลการรวบรวมข้อมูล ไปที่แท็บ “Hreflang” แล้วกรอง “Missing Reciprocal Links” (ลิงก์ตอบกลับที่หายไป)
    • ขั้นตอน: ส่งออกรายการข้อผิดพลาดเพื่อตรวจสอบกลุ่ม URL ที่ไม่มีการเชื่อมโยงแบบวงปิด

    เครื่องมือ 2: Sitebulb

    • ในรายงาน “International SEO Audit” ดูคำเตือน “Unreciprocated hreflang links” ซึ่งแสดงหน้าที่ขาดลิงก์และภาษาที่ขาด

    เครื่องมือ 3: DeepCrawl

    • ตั้งกฎกำหนดเองเพื่อตรวจสอบความสัมพันธ์ระหว่างหน้าหลายภาษา และรายงานปัญหาลิงก์ขาดแบบอัตโนมัติทุกสัปดาห์

    วิธีแก้ไขและขั้นตอนปฏิบัติ

    วิธีที่ 1: แก้ไขแบบกลุ่มผ่านปลั๊กอิน CMS (ตัวอย่าง Shopify)

    เข้าไปที่การตั้งค่าปลั๊กอินหลายภาษา (เช่น Langify) แล้วเปิดใช้งานตัวเลือก “เชื่อมโยงเวอร์ชันภาษาทุกภาษาโดยอัตโนมัติ”

    ใน “การตั้งค่าเทมเพลต” ให้ตรวจสอบว่าโค้ด hreflang มีการวนลูปครอบคลุมทุกภาษา:

    {% for language in shop.languages %}
    <link rel="alternate" hreflang="{{ language.iso_code }}" href="{{ canonical_url | replace: shop.domain, language.domain }}" />
    {% endfor %}

    วิธีที่ 2: แก้ไขโค้ดด้วยตนเอง (เว็บไซต์แบบ Static)

    สร้างรายการ URL สำหรับแต่ละภาษา (เช่น Excel) เพื่อระบุ URL ที่ต้องการเชื่อมโยงถึงกัน

    เพิ่มแท็กลงในหน้าเว็บไซต์ตามรายการที่เตรียมไว้ เช่น:


    <link rel="alternate" hreflang="en" href="https://example.com/en/page" />
    <link rel="alternate" hreflang="de" href="https://example.com/de/page" />
    <link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />

    อย่าลืมเพิ่มลิงก์กลับไปยังหน้าอังกฤษในหน้าภาษาเยอรมันและฝรั่งเศสด้วย

    วิธีที่ 3: อัตโนมัติผ่านเซิร์ฟเวอร์ (เช่น Nginx)

    ใช้ Reverse Proxy และกฎ Mapping เพื่อสร้าง hreflang tag แบบอัตโนมัติ:

    location / {
    add_header Link "<https://$host/en$uri>; rel=alternate; hreflang=en";
    add_header Link "<https://$host/de$uri>; rel=alternate; hreflang=de";
    }

    ปัญหาความขัดแย้งกับ Canonical tag

    ตัวอย่างเช่น หากหน้าเยอรมันมี Canonical tag ที่ชี้ไปยังหน้าอังกฤษหลัก Google อาจมองว่าหน้าเยอรมันเป็นสำเนาของหน้าอังกฤษ และไม่แสดงผลแก่ผู้ใช้ชาวเยอรมัน

    ปัญหาที่พบบ่อยคือ CMS หลายตัวจะตั้ง Canonical ของทุกภาษาชี้ไปที่หน้าเริ่มต้น (เช่น x-default) ส่งผลให้หน้าแต่ละภาษาถูกมองเป็นเนื้อหาซ้ำกัน

    กลไกความขัดแย้งและลำดับความสำคัญ

    ลำดับการประมวลผลของ Google ระหว่าง hreflang และ Canonical tag:

    Canonical มาก่อน: ถ้า Canonical ของหน้า A ชี้ไปหน้า B หน้า A จะถูกมองเป็นสำเนาของหน้า B และ hreflang จะถูกเพิกเฉย

    กรณีที่ hreflang ไม่ทำงาน:

    1. หน้าเว็บภาษาฝรั่งเศสมี Canonical ชี้ไปหน้าอังกฤษ → หน้าเว็บภาษาฝรั่งเศสจะไม่แสดงต่อผู้ใช้ชาวฝรั่งเศส
    2. ทุกหน้าภาษามี Canonical ชี้ไปหน้าแรกเหมือนกัน → ถูกมองเป็น Duplicate Content ทั้งหมด

    ข้อยกเว้น:

    • หาก Canonical tag ชี้กลับมาที่ตัวเอง (เช่น <link rel="canonical" href="URL ของหน้าปัจจุบัน"/>) hreflang จะทำงานได้ตามปกติ

    สถานการณ์ข้อผิดพลาดทั่วไปและผลลัพธ์

    ข้อผิดพลาด 1: ความขัดแย้งของการตั้งค่าปลั๊กอินหลายภาษาเริ่มต้น

    • กรณีตัวอย่าง: ปลั๊กอิน Yoast SEO ของ WordPress ตั้งค่า Canonical ของหน้าหลายภาษาโดยค่าเริ่มต้นให้ชี้ไปยังหน้าภาษาหลัก เช่น หน้าเวอร์ชันภาษาเยอรมันมีแท็ก Canonical เป็น <link rel="canonical" href="https://example.com/en/page"/>
    • ผลลัพธ์: หน้าเวอร์ชันภาษาเยอรมันถูกมองว่าเป็นสำเนาของหน้าภาษาอังกฤษ ส่งผลให้ไม่แสดงผลในผลการค้นหาภาษาเยอรมัน และการเข้าชมลดลงมากกว่า 50%

    ข้อผิดพลาด 2: การรบกวนจากพารามิเตอร์แบบไดนามิก

    • กรณีตัวอย่าง: URL ที่มีพารามิเตอร์ เช่น example.com/page?lang=de มี Canonical ชี้ไปยังเวอร์ชันที่ไม่มีพารามิเตอร์ (example.com/page) แต่เวอร์ชันหลังไม่ได้ตั้งค่า hreflang
    • ผลลัพธ์: หน้าเวอร์ชันภาษาเยอรมันที่มีพารามิเตอร์จะไม่ถูกจัดทำดัชนี และผู้ใช้จะเห็นเฉพาะหน้าภาษาหลักในการค้นหา

    ข้อผิดพลาด 3: การไม่ประกาศเวอร์ชันตามภูมิภาคอย่างเป็นอิสระ

    • กรณีตัวอย่าง: หน้า en-US มี Canonical ชี้ไปยังหน้าภาษาอังกฤษทั่วไป (en) ทำให้เครื่องมือค้นหามองว่าเวอร์ชันภาษาอังกฤษแบบสหรัฐฯ ไม่มีความแตกต่าง
    • ผลลัพธ์: ผู้ใช้ในสหรัฐฯ ถูกเปลี่ยนเส้นทางไปยังหน้า en (เช่น ภาษาอังกฤษแบบอังกฤษ) ทำให้ประสบการณ์ที่ปรับตามท้องถิ่นลดลง

    เครื่องมือตรวจสอบและวิธีแก้ไข

    เครื่องมือ 1: Google Search Console

    • เข้าไปที่รายงาน “การครอบคลุม” เลือกแท็บ “ยกเว้น” แล้วกรองดู “หน้าซ้ำกัน” หรือ “ส่งแล้วแต่ไม่ได้จัดทำดัชนี” เพื่อตรวจสอบว่า hreflang ถูกปิดใช้งานเนื่องจากความขัดแย้งของ Canonical หรือไม่

    เครื่องมือ 2: Screaming Frog

    • หลังจากการครอลเว็บไซต์แล้ว ให้กรองหน้าที่มีทั้งแท็ก hreflang และ Canonical จากนั้นตรวจสอบว่า Canonical ชี้ไปยัง URL ของหน้าเองหรือหน้าอื่น
    • ส่งออกข้อมูลแล้วกรองด้วยเงื่อนไข Canonical != Self-URL

    เครื่องมือ 3: DeepCrawl

    • ตั้งค่ากฎแจ้งเตือนแบบกำหนดเอง เพื่อแจ้งเตือนเมื่อเป้าหมายของ hreflang และ Canonical ไม่ตรงกัน

    แนวทางแก้ไขและขั้นตอนปฏิบัติ

    แนวทาง 1: แก้ไขปลั๊กอิน CMS (กรณี Yoast SEO)

    1. เข้าไปที่การตั้งค่าหลายภาษา และปิดใช้งานตัวเลือก “รวม Canonical ไปยังภาษาหลัก”
    2. เปิดใช้งาน “สร้าง Canonical แยกตามแต่ละภาษา” ในการตั้งค่าขั้นสูง

    แนวทาง 2: แก้ไขโค้ดด้วยตนเอง

    ในส่วน <head> ของหน้า ให้แก้ไขแท็ก Canonical ให้ชี้ไปยัง URL ของหน้าเอง เช่น:

    <!-- หน้าเวอร์ชันภาษาเยอรมันตั้ง Canonical ชี้ไปยังตัวเอง -->
    <link rel="canonical" href="https://example.com/de/page" />

    แนวทาง 3: การตั้งค่าฝั่งเซิร์ฟเวอร์ (ตัวอย่างเช่น Nginx)

    สร้างแท็ก Canonical แบบไดนามิกตามภาษาปัจจุบัน:

    location /de/ {
    add_header Link "<https://example.com/de/$uri>; rel=canonical";
    }

    ข้อผิดพลาดของเซิร์ฟเวอร์หรือไม่รองรับคำขอ HTTP

    เช่น หน้าแบบไดนามิกที่สร้างขึ้นอาจไม่สามารถโหลด HTML ได้สมบูรณ์เนื่องจากเซิร์ฟเวอร์หมดเวลา ทำให้แท็ก hreflang ในส่วน <head> หายไป

    นอกจากนี้ หากหน้าเวอร์ชันมือถือส่งสถานะ 302 แทนที่จะเป็น 200 เครื่องมือค้นหาอาจไม่ทำการครอลหน้าเหล่านั้น

    บาง CDN หรือกฎไฟร์วอลล์อาจบล็อกคำขอของเครื่องมือค้นหา ทำให้ไม่สามารถเข้าถึงหน้าภาษาในบางภูมิภาคได้

    ประเภทข้อผิดพลาดของเซิร์ฟเวอร์และผลกระทบ

    รหัสสถานะสำคัญและผลกระทบ:
    404 Not Found

    • สถานการณ์:หน้าภาษาฝรั่งเศสถูกลิงก์ผ่าน hreflang จากหน้าภาษาอื่น แต่ URL จริงถูกลบหรือพิมพ์ผิด
    • ผลกระทบ:เสิร์ชเอนจินจะถือว่า hreflang ใช้ไม่ได้ หน้าภาษาฝรั่งเศสไม่ถูกจัดทำดัชนี และลดความน่าเชื่อถือของหน้าอื่นๆ ด้วย

    500 Internal Error

    • สถานการณ์:เซิร์ฟเวอร์ล่ม ทำให้แท็ก hreflang ที่สร้างแบบไดนามิกโหลดไม่ขึ้น
    • ผลกระทบ:หน้าเว็บจะขึ้น 500 Error ทำให้ hreflang ใช้ไม่ได้ทั้งหมด เสิร์ชเอนจินอาจพักการเข้าถึงเว็บไซต์ชั่วคราว

    302 Temporary Redirect

    • สถานการณ์:หน้ามือถือเปลี่ยนเส้นทางชั่วคราวไป URL เดสก์ท็อป แต่ไม่ได้ส่งต่อ hreflang
    • ผลกระทบ:เสิร์ชเอนจินอาจเก็บเฉพาะ hreflang ของหน้าเดสก์ท็อปและไม่สนใจเวอร์ชันมือถือ

    ปัญหาการโหลดหน้าไดนามิก

    ข้อบกพร่องของ JavaScript Rendering

    • ตัวอย่าง:เว็บ SPA ที่สร้างด้วย React/Vue ใส่ hreflang ผ่าน JS แบบไดนามิก แต่ไม่ได้ prerender
    • ผลกระทบ:เสิร์ชเอนจินบางตัวอาจไม่รัน JS ทำให้ไม่เห็น hreflang

    การตั้งค่า CDN/Cache ที่ผิดพลาด

    • ตัวอย่าง:CDN ตั้งค่า cache โดยไม่สนใจ <head> หรือ cache หน้าเว็บผิดภาษา
    • ผลกระทบ:ผู้ใช้อาจเห็นหน้า cache ต่างภาษากันบน URL เดียวกัน ทำให้ hreflang สับสน

    เซิร์ฟเวอร์ Timeout และปัญหาด้านประสิทธิภาพ

    • ตัวอย่าง:โหลดหน้าเว็บนานเกิน 5 วินาที เสิร์ชเอนจินหยุด crawl ก่อนอ่าน hreflang
    • ผลกระทบ:อาจเสีย hreflang บางภาษา โดยเฉพาะเว็บใหญ่หลายภาษา

    เครื่องมือตรวจสอบและวิธีแก้ไข

    Google Search Console

    • เช็ค “รายงาน Coverage” เพื่อหาหน้าโดน 404/500 โดยเฉพาะ URL หลายภาษา

    Screaming Frog

    1. เปิดตัวเลือก “ตรวจสอบ hreflang” ก่อน crawl
    2. กรองหน้า “Server Error” (4xx, 5xx) แล้วดู hreflang ที่เกี่ยวข้อง

    การวิเคราะห์ Log File

    • กรอง Log Server (เช่น Nginx access.log) หา User-Agent ที่มี Googlebot แล้วเช็ค URL ที่เจอ error บ่อย

    วิธีแก้ไขและขั้นตอนปฏิบัติจริง

    แก้ไข Server Error

    404 Problem

    • ตรวจสอบว่า URL ทั้งหมดใน hreflang ใช้งานได้ ลบลิงก์เสีย
    • ถ้า URL ถูกลบ ต้องลบออกจาก hreflang ของหน้าอื่นด้วย

    500 Problem

    • เพิ่มทรัพยากรเซิร์ฟเวอร์ (เช่น RAM, DB Pool) เพื่อป้องกันล่ม
    • ตั้งระบบ monitor (เช่น New Relic) แจ้งเตือนทันทีเมื่อมีปัญหา

    ปรับแต่งหน้า Dynamic

    ใช้ Prerender

    • ใช้ Next.js, Nuxt.js (SSR) เพื่อใส่ hreflang ตั้งแต่ HTML แรก
    • ใช้ Prerender.io สร้างเวอร์ชัน static ให้เสิร์ชเอนจิน

    แก้ CDN Settings

    1. ตั้ง CDN ให้ path ภาษาเช่น /de/, /fr/ ไม่ cache หรือ cache สั้นๆ เช่น 1 ชั่วโมง
    2. ห้าม CDN ตัดหรือแก้ไข <head> ต้องส่งครบ

    เพิ่มประสิทธิภาพ

    • บีบอัดไฟล์ (เช่น รูป, CSS/JS) ให้โหลดภายใน 3 วินาที
    • ใช้ Google Lighthouse ตรวจสอบปัญหาที่ทำให้โหลดช้า

    ปัญหา Duplicate Content จาก URL ที่มี Parameter

    พารามิเตอร์ไดนามิก (เช่น ?utm_source=ads หรือ ?sessionid=123) เป็นสาเหตุซ่อนเร้นของปัญหา duplicate content ในเว็บหลายภาษา

    เช่น หน้าเว็บภาษาสเปนมีพารามิเตอร์ต่างกัน (/es/page?ref=facebook กับ /es/page?ref=email) เสิร์ชเอนจินจะเห็นเป็น 2 หน้าต่างหาก ส่งผลให้มี duplicate content

    ผลกระทบและประเภทของพารามิเตอร์

    พารามิเตอร์ที่ต้องเก็บไว้:

    1. พารามิเตอร์การแบ่งหน้า (เช่น ?page=2): ใช้แยกส่วนเนื้อหาต่างๆ ต้องเก็บไว้แต่ต้องทำให้เป็นมาตรฐาน (เช่น ใช้ rel="canonical" ชี้ไปยังหน้าแรก).
    2. พารามิเตอร์ภาษา/ภูมิภาค (เช่น ?lang=de): หาก URL ไม่แยกภาษาโดยใช้พาธ (เช่น /de/) ต้องเก็บไว้และตรงกับ hreflang.

    พารามิเตอร์ที่ต้องลบ:

    1. พารามิเตอร์ติดตาม (เช่น ?utm_source, ?ref=social): ไม่เปลี่ยนเนื้อหา ต้องลบออกจาก hreflang.
    2. Session ID (เช่น ?sessionid=123): ใช้ติดตามพฤติกรรมผู้ใช้ อาจสร้าง URL ซ้ำจำนวนมาก.

    ข้อผิดพลาดที่พบบ่อยและผลกระทบ

    ข้อผิดพลาด 1: พารามิเตอร์ไม่เป็นมาตรฐาน

    • ตัวอย่าง: หน้าเดียวกันภาษาฝรั่งเศสมีหลาย URL ที่มีพารามิเตอร์ติดตาม เช่น /fr/page?utm=ads และ /fr/page?utm=email ซึ่งทั้งหมดถูกประกาศเป็นหน้าแยกใน hreflang.
    • ผลกระทบ: เสิร์ชเอนจินรวบรวมหน้าแบบซ้ำ ส่งผลให้คะแนน SEO กระจาย อันดับลดลง.

    ข้อผิดพลาด 2: hreflang ขาดพารามิเตอร์

    • ตัวอย่าง: หน้าอังกฤษชี้ hreflang ไปที่ /de/page แต่ URL เยอรมันจริงคือ /de/page?lang=de เชื่อมโยงไม่สมบูรณ์.
    • ผลกระทบ: หน้าเยอรมันถูกมองว่าเป็นเนื้อหาแยก ไม่สามารถเชื่อมกับหน้าอังกฤษ.

    ข้อผิดพลาด 3: พารามิเตอร์การแบ่งหน้า รบกวนเนื้อหาหลัก

    • ตัวอย่าง: หน้าแสดงสินค้ารายการ /es/products?page=2 ใน hreflang ไม่ชี้กลับไปยังหน้าแรก /es/products.
    • ผลกระทบ: หน้าแบ่งหน้าอาจถูกเข้าใจผิดว่าเป็นหน้าเนื้อหาภาษาอื่น แข่งขันกับหน้าแรก.

    วิธีตรวจสอบด้วยเครื่องมือ

    Google Search Console:

    • เข้า “รายงานการจัดทำดัชนี” กรอง URL ที่ “ส่งแล้วแต่ไม่จัดทำดัชนี” ตรวจสอบว่าถูกกรองเพราะพารามิเตอร์ซ้ำหรือไม่.

    Screaming Frog:

    1. ขณะครอว์ล เปิดตัวเลือก “Ignore URL Parameters” เปรียบเทียบความเหมือนเนื้อหาระหว่าง URL ที่มีและไม่มีพารามิเตอร์.
    2. กรองแท็ก hreflang ตรวจสอบว่ามีปัญหาขาดพารามิเตอร์หรือไม่.

    ใช้ Regex:

    • ในเครื่องมือวิเคราะห์ Log เช่น ELK Stack ใช้ Regex กรองพารามิเตอร์เฉพาะ เช่น utm_* ตรวจสอบจำนวนครั้งที่ถูกครอว์ล.

    แนวทางแก้ไขและขั้นตอนปฏิบัติ

    แนวทาง 1: ทำพารามิเตอร์ให้เป็นมาตรฐาน (ตั้งค่าเซิร์ฟเวอร์)

    ตัวอย่าง Apache:

    RewriteCond %{QUERY_STRING} ^utm_
    RewriteRule ^(.*)$ /$1? [R=301,L]
    • หน้าที่: ลบพารามิเตอร์ utm_ ทั้งหมดอัตโนมัติ และ Redirect 301 ไปยัง URL ที่ไม่มีพารามิเตอร์.

    แนวทาง 2: เชื่อม hreflang กับ Canonical

    • ใน hreflang ใช้เฉพาะ URL ที่ไม่มีพารามิเตอร์ (เช่น /de/page).
    • ใน URL ที่มีพารามิเตอร์ ให้ใส่ Canonical ชี้กลับ URL ที่ไม่มีพารามิเตอร์:
    <link rel="canonical" href="https://example.com/de/page" />

    แนวทาง 3: ตั้งค่า URL Parameters ใน Google Search Console

    1. เข้า “URL Parameters” ตั้ง utm_, sessionid เป็น “No effect on page content”.
    2. พารามิเตอร์แบ่งหน้า (เช่น page) ตั้งเป็น “Paginates” เพื่อช่วยให้เสิร์ชเอนจินเข้าใจบทบาท.

    การปรับ hreflang ของเว็บไซต์หลายภาษานั้น ไม่ใช่แค่ทำครั้งเดียวแล้วจบ
    การแก้ไขรายละเอียดเล็กน้อย มักเริ่มจากการหลีกเลี่ยง “ข้อผิดพลาดทางเทคนิคเล็กๆ” เหล่านี้

    Picture of Don Jiang
    Don Jiang

    SEO本质是资源竞争,为搜索引擎用户提供实用性价值,关注我,带您上顶楼看透谷歌排名的底层算法。

    最新解读
    滚动至顶部