微信客服
Telegram:guangsuan
电话联系:18928809533
发送邮件:[email protected]

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

    Don Jiang
    Don Jiang

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

    最新解读
    滚动至顶部