บทนำ — ทำไม International SEO ถึงเป็นเรื่องที่ผิดพลาดง่ายที่สุดในวงการ SEO
ถ้าคุณกำลังทำเว็บไซต์ที่ต้องรองรับลูกค้าจากหลายประเทศ ไม่ว่าจะเป็นโรงแรมในภูเก็ตที่ต้องเสิร์ฟนักท่องเที่ยวจีน ญี่ปุ่น รัสเซีย และยุโรป หรือเป็น SaaS ที่ขายให้ตลาดโลก คุณจะรู้ทันทีว่า International SEO ไม่ใช่แค่การแปลภาษาเว็บไซต์ แล้วใส่ flag icon ที่มุมขวาบน
ในประสบการณ์ของเราที่ทำ Technical SEO ให้กับเว็บไซต์ภูเก็ตที่ทำตลาดต่างประเทศมากว่า 6 ปี เราเห็นความผิดพลาดเดียวกันซ้ำแล้วซ้ำเล่า — เว็บที่ใส่ hreflang ผิดทิศทาง ทำให้ Google จัด index หน้าภาษาจีนไปแสดงในผลค้นหาของประเทศไทย ขณะที่ผู้ใช้ในจีนกลับเห็นหน้าภาษาอังกฤษ และผลสุดท้ายคือ Bounce Rate พุ่งสูงถึง 80% และยอดจองห้องพักจากตลาดต่างประเทศหายไปเกือบครึ่ง
International SEO ปี 2026 มีความซับซ้อนกว่าเดิม เพราะ Google ใช้ Machine Learning ในการตีความ hreflang ที่เข้มงวดขึ้น, Bing เริ่มสนใจ multi-region signal มากขึ้น, และผู้ใช้คาดหวัง experience ที่ localized จริง ๆ ไม่ใช่แค่การแปลคำต่อคำ
บทความนี้จะพาคุณเดินทางตั้งแต่การเลือกโครงสร้าง URL ที่ถูกต้อง (ccTLD vs Subdomain vs Subdirectory), การ implement hreflang ทั้ง 3 วิธี, การหลีกเลี่ยงความผิดพลาด 10 ข้อที่พบบ่อย, การตั้งค่าใน WordPress (WPML, Polylang, TranslatePress) และ Astro, ไปจนถึง case study จริงของเว็บโรงแรมภูเก็ตที่รายได้เพิ่ม 180% หลังทำ International SEO ใหม่ทั้งระบบ
ถ้าคุณจริงจังกับการขยายเว็บไซต์ไปสู่ตลาดต่างประเทศ บทความนี้คือคู่มือที่คุณต้องอ่านให้จบ และถ้าคุณต้องการความช่วยเหลือเฉพาะทาง คุณสามารถดู บริการ Technical SEO ของเราได้ หรือ ติดต่อทีมงาน เพื่อปรึกษาฟรี
1. International SEO 3 รูปแบบ — เลือกโครงสร้าง URL ที่เหมาะสม
ก่อนที่คุณจะเริ่มใส่ hreflang หรือคิดเรื่อง translation คุณต้องตัดสินใจเรื่องที่สำคัญที่สุดก่อน — โครงสร้าง URL ที่จะใช้สำหรับแต่ละภาษา/ประเทศ การตัดสินใจนี้จะอยู่กับคุณไปอีกหลายปี และเปลี่ยนทีหลังจะเจ็บปวดมาก เพราะหมายถึงการ 301 redirect ทุก URL พร้อมเสี่ยงเสีย ranking ที่สะสมมา
มี 3 โครงสร้างหลักที่คุณเลือกได้:
1.1 ccTLD (Country Code Top-Level Domain)
ccTLD คือการใช้โดเมนระดับประเทศแยกกัน เช่น:
example.co.thสำหรับประเทศไทยexample.jpสำหรับญี่ปุ่นexample.cnสำหรับจีนexample.ruสำหรับรัสเซียexample.comสำหรับ default (อังกฤษ/global)
ข้อดี:
- Geo-targeting signal ที่ชัดเจนที่สุด — Google เข้าใจทันทีว่าโดเมนนี้ targeting ประเทศไหน
- Trust กับผู้ใช้ในประเทศนั้น ๆ สูง (ผู้ใช้ญี่ปุ่นเชื่อถือ .jp มากกว่า .com)
- แต่ละโดเมนแยกขาดกัน ทำ marketing แยกได้ง่าย
- กฎหมายบางประเทศ (เช่น จีน) อาจต้องการ ccTLD เพื่อขอ ICP license
ข้อเสีย:
- ค่าใช้จ่ายสูง — ต้องจดและต่ออายุหลายโดเมน
- Domain Authority แยกกัน — backlink ที่ได้ใน .co.th จะไม่ช่วย .jp
- ต้องตั้งค่า hosting, SSL, analytics แยกกัน
- การจัดการเนื้อหายากขึ้น
- จดทะเบียน ccTLD บางประเทศต้องมีตัวตนในประเทศนั้น (เช่น .cn ต้องมี ICP)
1.2 Subdomain
Subdomain คือการใช้ prefix หน้าโดเมนหลัก เช่น:
th.example.comสำหรับไทยen.example.comสำหรับอังกฤษcn.example.comสำหรับจีนjp.example.comสำหรับญี่ปุ่นru.example.comสำหรับรัสเซีย
ข้อดี:
- ใช้โดเมนเดียว ค่าใช้จ่ายต่ำกว่า ccTLD
- แยก hosting/server location ได้ (เช่น cn.example.com ใช้ server ในจีน)
- Geo-targeting ใน Google Search Console ได้
- Subdomain ถือเป็น “site” แยกจาก main domain ในมุมมองของ Google
ข้อเสีย:
- Domain Authority ยังคงแยกระหว่าง subdomain (เป็นที่ถกเถียง แต่ในทางปฏิบัติยังเป็นอย่างนั้น)
- ต้องตั้งค่า DNS แยก
- ผู้ใช้อาจสับสนว่าเป็นเว็บเดียวกันหรือไม่
1.3 Subdirectory (Subfolder)
Subdirectory คือการใช้ path บนโดเมนหลัก เช่น:
example.com/th/สำหรับไทยexample.com/en/สำหรับอังกฤษexample.com/cn/สำหรับจีนexample.com/jp/สำหรับญี่ปุ่นexample.com/ru/สำหรับรัสเซีย
ข้อดี:
- Domain Authority รวมกันทั้งหมด — backlink ทุกอันช่วย ranking ทั้งเว็บ
- ค่าใช้จ่ายต่ำที่สุด — โดเมนเดียว hosting เดียว
- Setup ง่ายที่สุด
- เหมาะกับเว็บที่เริ่มต้น International ครั้งแรก
ข้อเสีย:
- Geo-targeting signal อ่อนกว่า ccTLD
- ทุก locale ใช้ server location เดียวกัน (ผู้ใช้จีนต้องโหลดจาก server ไทย ถ้า main hosting อยู่ไทย)
- Geo-targeting ใน GSC ทำได้ยากกว่า ต้องตั้งค่าแยก property
- ถ้าโดเมนหลักโดน penalty จะกระทบทุกภาษา
ตารางเปรียบเทียบ ccTLD vs Subdomain vs Subdirectory
| คุณสมบัติ | ccTLD | Subdomain | Subdirectory |
|---|---|---|---|
| Geo-targeting signal | แข็งแรงที่สุด | ปานกลาง | อ่อน (ต้องตั้งใน GSC) |
| Domain Authority | แยกขาด | แยกบางส่วน | รวมกันทั้งหมด |
| ค่าใช้จ่าย | สูง | ปานกลาง | ต่ำ |
| Trust กับผู้ใช้ท้องถิ่น | สูง | ปานกลาง | ต่ำ |
| Server location flexibility | เต็มที่ | เต็มที่ | จำกัด |
| ความยากในการ setup | ยาก | ปานกลาง | ง่าย |
| ความยากในการ maintain | ยาก | ปานกลาง | ง่าย |
| เหมาะกับ | บริษัทใหญ่, ตลาดสำคัญ | ตลาดที่ต้องการ server แยก | เริ่มต้น, ตลาดทดลอง |
| ตัวอย่างเว็บ | amazon.co.jp, ebay.co.uk | jobs.example.com | apple.com/jp/ |
คำแนะนำของเรา
สำหรับเว็บไซต์ส่วนใหญ่ในประเทศไทยที่ทำ International SEO ครั้งแรก เราแนะนำให้ใช้ Subdirectory เพราะ:
- ค่าใช้จ่ายต่ำที่สุด
- ได้ประโยชน์จาก Domain Authority รวมกัน
- Maintain ง่ายที่สุด — ทีมเดียว, hosting เดียว, CMS เดียว
- ถ้าใช้ CDN ดี ๆ เช่น Cloudflare ปัญหา server location จะลดลงมาก (อ่านเพิ่มเติม คู่มือ Cloudflare ครบทุกขั้นตอน)
ยกเว้นกรณีที่คุณเข้าตลาดจีน — เพราะ Google ถูก block ในจีน คุณจะต้อง optimize สำหรับ Baidu ซึ่งชอบ ccTLD .cn มากกว่า และคุณจะต้องมี ICP license ซึ่งบังคับให้ใช้ host ในจีน — กรณีนี้ ccTLD เป็นทางเลือกที่ดีกว่า
2. hreflang คืออะไร และทำไมมันจึงสำคัญมาก
hreflang คือ HTML attribute หรือ HTTP header ที่บอก Google ว่า:
“หน้านี้มีเวอร์ชันสำหรับภาษา/ประเทศนี้อยู่ที่ URL นี้”
มันช่วยให้ Google แสดงผลค้นหาที่เหมาะกับภาษาและประเทศของผู้ใช้ที่กำลัง search
ตัวอย่างเช่น ถ้าคุณมีหน้า “About Us” 5 ภาษา:
example.com/en/about/— อังกฤษexample.com/th/about/— ไทยexample.com/cn/about/— จีนexample.com/jp/about/— ญี่ปุ่นexample.com/ru/about/— รัสเซีย
ถ้าไม่มี hreflang Google อาจจัด index ทั้ง 5 หน้า แต่:
- มองว่าเป็น duplicate content (เพราะ structure เหมือนกัน)
- ไม่รู้ว่าหน้าไหนควรแสดงให้ใคร
- อาจเลือกแสดงหน้าที่ไม่ตรงภาษา ทำให้ user experience แย่และ Bounce Rate สูง
hreflang คือคำตอบของปัญหานี้
2.1 hreflang ผ่าน HTML xhtml:link tag
วิธีที่นิยมที่สุด — ใส่ <link> tag ใน <head> ของทุกหน้า ตัวอย่างหน้า English:
<!DOCTYPE html>
<html lang="en">
<head>
<title>About Us | Example</title>
<link rel="canonical" href="https://example.com/en/about/" />
<!-- hreflang tags - ต้องครบทุกเวอร์ชันรวมถึงตัวเอง -->
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
<link rel="alternate" hreflang="ja" href="https://example.com/jp/about/" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/about/" />
</head>
กฎสำคัญ:
- ทุกหน้าต้องอ้างอิงตัวเองด้วย (self-referencing hreflang)
- ทุกหน้าต้องอ้างอิงทุกเวอร์ชัน (ครบ 5 ในตัวอย่างนี้ + x-default)
- URL ต้องเป็น absolute URL (เริ่มด้วย https://)
- ถ้าใช้ภาษา-ประเทศ ต้องใช้ format
xx-XX(เช่นzh-CN,en-US,pt-BR)
2.2 hreflang ผ่าน XML Sitemap
สำหรับเว็บที่มีหน้าหลายพันหน้า การใส่ hreflang ใน HTML ทุกหน้าอาจทำให้ HTML ใหญ่เกินไป — ใช้ XML sitemap แทนได้
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<!-- English version -->
<url>
<loc>https://example.com/en/about/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<xhtml:link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/jp/about/" />
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/about/" />
</url>
<!-- Thai version -->
<url>
<loc>https://example.com/th/about/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<xhtml:link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/jp/about/" />
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/about/" />
</url>
<!-- Chinese version -->
<url>
<loc>https://example.com/cn/about/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<xhtml:link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<xhtml:link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/jp/about/" />
<xhtml:link rel="alternate" hreflang="ru" href="https://example.com/ru/about/" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/about/" />
</url>
<!-- ทำซ้ำสำหรับ jp และ ru version -->
</urlset>
2.3 hreflang ผ่าน HTTP Header (สำหรับ Non-HTML)
ถ้าเป็นไฟล์ที่ไม่ใช่ HTML เช่น PDF, Image คุณใส่ใน <head> ไม่ได้ — ต้องใช้ HTTP Header Link แทน
HTTP/2 200 OK
Content-Type: application/pdf
Link: <https://example.com/en/brochure.pdf>; rel="alternate"; hreflang="en",
<https://example.com/th/brochure.pdf>; rel="alternate"; hreflang="th",
<https://example.com/cn/brochure.pdf>; rel="alternate"; hreflang="zh-CN",
<https://example.com/jp/brochure.pdf>; rel="alternate"; hreflang="ja",
<https://example.com/ru/brochure.pdf>; rel="alternate"; hreflang="ru",
<https://example.com/en/brochure.pdf>; rel="alternate"; hreflang="x-default"
ตั้งค่าใน Nginx:
location ~ \.pdf$ {
add_header Link '<https://example.com/en/brochure.pdf>; rel="alternate"; hreflang="en", <https://example.com/th/brochure.pdf>; rel="alternate"; hreflang="th"';
}
ตั้งค่าใน Apache .htaccess:
<FilesMatch "brochure\.pdf$">
Header add Link '<https://example.com/en/brochure.pdf>; rel="alternate"; hreflang="en"'
Header add Link '<https://example.com/th/brochure.pdf>; rel="alternate"; hreflang="th"'
</FilesMatch>
ควรเลือกวิธีไหน?
- HTML xhtml:link — เหมาะกับเว็บขนาดเล็ก-กลาง (น้อยกว่า 1,000 หน้า), implement ง่ายที่สุด, debug ง่าย
- XML Sitemap — เหมาะกับเว็บใหญ่, HTML ไม่ pollute, แต่ debug ยากกว่า
- HTTP Header — เฉพาะ Non-HTML files
ในประสบการณ์ของเรา การใช้ทั้ง HTML xhtml:link + XML Sitemap (combined approach) ให้ผลดีที่สุด เพราะถ้า Google fetch sitemap ช้า มันยังเห็น hreflang จาก HTML ได้
3. Language Code (ISO 639-1) และ Country Code (ISO 3166-1)
หนึ่งในความผิดพลาดที่พบบ่อยที่สุดของ hreflang คือการใช้ code ภาษาผิด มาดู reference ที่ครบถ้วน
ตาราง Language Code (ISO 639-1) ที่ใช้บ่อย
| ภาษา | Code | ตัวอย่าง hreflang |
|---|---|---|
| English | en | hreflang=“en” |
| Thai | th | hreflang=“th” |
| Chinese (Simplified) | zh-Hans | hreflang=“zh-Hans” หรือ zh-CN |
| Chinese (Traditional) | zh-Hant | hreflang=“zh-Hant” หรือ zh-TW |
| Japanese | ja | hreflang=“ja” (ไม่ใช่ jp!) |
| Korean | ko | hreflang=“ko” |
| Russian | ru | hreflang=“ru” |
| Spanish | es | hreflang=“es” |
| French | fr | hreflang=“fr” |
| German | de | hreflang=“de” |
| Portuguese | pt | hreflang=“pt” |
| Italian | it | hreflang=“it” |
| Arabic | ar | hreflang=“ar” |
| Hindi | hi | hreflang=“hi” |
| Indonesian | id | hreflang=“id” |
| Vietnamese | vi | hreflang=“vi” |
| Malay | ms | hreflang=“ms” |
| Tagalog | tl | hreflang=“tl” |
| Dutch | nl | hreflang=“nl” |
| Polish | pl | hreflang=“pl” |
| Turkish | tr | hreflang=“tr” |
| Hebrew | he (ไม่ใช่ iw!) | hreflang=“he” |
ข้อควรระวัง:
- ภาษาญี่ปุ่นใช้
jaไม่ใช่jp(jp คือ country code) - ภาษาฮีบรูใช้
he(ปัจจุบัน) ไม่ใช่iw(legacy) - จีนแบบ Simplified ใช้
zh-Hansหรือzh-CNก็ได้ แต่ต้อง consistent ทั้งเว็บ - จีนแบบ Traditional ใช้
zh-Hantหรือzh-TW(สำหรับไต้หวัน) /zh-HK(สำหรับฮ่องกง)
ตาราง Country Code (ISO 3166-1) ที่ใช้บ่อย
| ประเทศ | Code | ตัวอย่าง hreflang |
|---|---|---|
| Thailand | TH | hreflang=“th-TH” |
| United States | US | hreflang=“en-US” |
| United Kingdom | GB (ไม่ใช่ UK!) | hreflang=“en-GB” |
| China | CN | hreflang=“zh-CN” |
| Hong Kong | HK | hreflang=“zh-HK” |
| Taiwan | TW | hreflang=“zh-TW” |
| Japan | JP | hreflang=“ja-JP” |
| Korea (South) | KR | hreflang=“ko-KR” |
| Russia | RU | hreflang=“ru-RU” |
| Germany | DE | hreflang=“de-DE” |
| France | FR | hreflang=“fr-FR” |
| Spain | ES | hreflang=“es-ES” |
| Mexico | MX | hreflang=“es-MX” |
| Brazil | BR | hreflang=“pt-BR” |
| Portugal | PT | hreflang=“pt-PT” |
| Australia | AU | hreflang=“en-AU” |
| Canada | CA | hreflang=“en-CA” (อังกฤษ) หรือ fr-CA (ฝรั่งเศส) |
| India | IN | hreflang=“en-IN” หรือ hi-IN |
| Singapore | SG | hreflang=“en-SG” |
| Malaysia | MY | hreflang=“en-MY” หรือ ms-MY |
| Indonesia | ID | hreflang=“id-ID” |
| Vietnam | VN | hreflang=“vi-VN” |
| Philippines | PH | hreflang=“en-PH” หรือ tl-PH |
| United Arab Emirates | AE | hreflang=“ar-AE” หรือ en-AE |
| Saudi Arabia | SA | hreflang=“ar-SA” |
ข้อควรระวัง:
- UK ในความหมายภาษา = GB ในความหมาย code (United Kingdom of Great Britain)
- ใช้ country code เป็นตัวพิมพ์ใหญ่: ✅
en-US❌en-us
ใช้ language-only หรือ language-country?
นี่คือคำถามที่ถามกันบ่อย — เมื่อไรควรใช้ en (language-only) เมื่อไรควรใช้ en-US (language-country)?
ใช้ language-only เมื่อ:
- คุณ target ผู้พูดภาษานั้นทั่วโลก ไม่เจาะจงประเทศ
- เนื้อหาเหมือนกันสำหรับทุกประเทศที่พูดภาษานี้
- ตัวอย่าง:
hreflang="en"สำหรับเนื้อหาภาษาอังกฤษกลาง ๆ ที่ใช้ทั้งใน US, UK, AU ได้
ใช้ language-country เมื่อ:
- คุณมีเนื้อหาเฉพาะสำหรับประเทศนั้น (currency, shipping, legal info ต่างกัน)
- คุณต้องการให้ Google แสดงเฉพาะในประเทศนั้น
- ตัวอย่าง:
hreflang="en-US"(ราคาเป็น USD, shipping USA),hreflang="en-GB"(ราคา GBP, shipping UK)
ตัวอย่างการใช้ผสม
<!-- เว็บโรงแรมภูเก็ตที่มี English version แบบกลาง ๆ + version แยกสำหรับ Australia (เพราะมีดีลพิเศษ) -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="en-AU" href="https://example.com/en-au/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/" />
<link rel="alternate" hreflang="ja" href="https://example.com/jp/" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/" />
4. x-default — กุญแจสำคัญที่ทุกคนลืม
x-default เป็นค่าพิเศษของ hreflang ที่ใช้บอก Google ว่า:
“ถ้าผู้ใช้ไม่ตรงกับ language/country ใน hreflang ที่เรามี ให้แสดงหน้านี้แทน”
มันคือ fallback page ของคุณ
4.1 ใช้ x-default เพื่อ language selector page
วิธีที่ “ถูกต้องตามตำรา” ที่สุด — สร้างหน้า language selector ที่ root และใช้เป็น x-default
<!-- example.com (homepage with language selector) -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/" />
<link rel="alternate" hreflang="ja" href="https://example.com/jp/" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
ในกรณีนี้ https://example.com/ คือหน้าที่มีให้เลือกภาษา ไม่ใช่หน้าภาษาใดภาษาหนึ่งโดยตรง
4.2 ใช้ x-default เพื่อ default language (วิธีที่นิยมกว่า)
ในทางปฏิบัติ คนส่วนใหญ่ใช้ x-default ชี้ไปที่หน้าภาษาอังกฤษ (เพราะเป็นภาษาสากล)
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/" />
<link rel="alternate" hreflang="ja" href="https://example.com/jp/" />
<link rel="alternate" hreflang="ru" href="https://example.com/ru/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/" />
วิธีนี้บอก Google ว่า “ถ้าไม่ใช่ผู้ใช้จาก TH/CN/JP/RU ก็แสดงเวอร์ชัน English ให้”
4.3 x-default + redirect logic
ถ้าคุณมี middleware ที่ detect language จาก browser และ redirect อัตโนมัติ คุณควรชี้ x-default ไปที่ root URL ที่มี logic นี้
// Astro middleware - src/middleware.ts
import { defineMiddleware } from 'astro:middleware';
export const onRequest = defineMiddleware(async (context, next) => {
const url = new URL(context.request.url);
// ถ้าเข้ามาที่ / (root) ให้ redirect ตาม Accept-Language
if (url.pathname === '/') {
const acceptLanguage = context.request.headers.get('accept-language') || 'en';
const lang = acceptLanguage.split(',')[0].split('-')[0].toLowerCase();
const supportedLangs = ['en', 'th', 'cn', 'jp', 'ru'];
const targetLang = supportedLangs.includes(lang) ? lang : 'en';
return Response.redirect(`${url.origin}/${targetLang}/`, 302);
}
return next();
});
ข้อควรระวัง:
- ใช้ 302 (temporary redirect) ไม่ใช่ 301 — เพราะ Google จะ crawl ในฐานะ Googlebot-US แล้วได้ /en/ ตลอด แต่ถ้าผู้ใช้จริงเข้ามา จะได้ภาษาตาม browser
- ใส่ option “เปลี่ยนภาษา” ที่ชัดเจนในหน้าเว็บ ถ้า detect ผิด ผู้ใช้จะแก้ได้
4.4 x-default คือ OPTIONAL แต่ควรใส่
Google ไม่ได้บังคับว่าต้องมี x-default แต่ถ้าไม่ใส่ ผู้ใช้ที่ภาษาไม่ตรงกับที่คุณ list ไว้อาจไม่เห็นเว็บคุณในผลค้นหาเลย
5. Common hreflang Mistakes 10 ข้อ — เช็คก่อนพังทั้งเว็บ
ในประสบการณ์ audit กว่า 200 เว็บไซต์ multi-language เราพบความผิดพลาดซ้ำ ๆ 10 รายการนี้
ตารางสรุป 10 hreflang Mistakes
| # | ความผิดพลาด | ผลกระทบ | วิธีแก้ |
|---|---|---|---|
| 1 | ใช้ language code ผิด (เช่น jp แทน ja) | Google ignore hreflang | ใช้ ISO 639-1 ที่ถูกต้อง |
| 2 | ใช้ country code ผิด (เช่น en-uk แทน en-GB) | Google ignore | ใช้ ISO 3166-1 alpha-2 |
| 3 | ขาด self-referencing hreflang | hreflang ไม่ทำงาน | ทุกหน้าต้อง link หาตัวเอง |
| 4 | hreflang ไม่ reciprocal (page A link หา B แต่ B ไม่ link กลับหา A) | hreflang invalid | ทุก link ต้องมี return link |
| 5 | ใช้ relative URL (เช่น /en/about/) | hreflang ไม่ทำงาน | ใช้ absolute URL เสมอ |
| 6 | hreflang ชี้ไปยัง URL ที่ redirect | dilute signal | ชี้ไปยัง final URL |
| 7 | hreflang ชี้ไปยัง 404 หรือ noindex | ทำลายทั้ง cluster | เช็คทุก URL ว่ายังมีอยู่ |
| 8 | canonical conflict กับ hreflang | สับสน Google | canonical ต้องชี้ตัวเอง |
| 9 | hreflang สำหรับ HTTP/HTTPS หรือ www/non-www ไม่ตรงกัน | Google มองเป็นคนละ URL | normalize URL ให้ตรงกัน |
| 10 | ใช้ underscore แทน hyphen (en_US แทน en-US) | invalid format | ใช้ hyphen เสมอ |
รายละเอียดของแต่ละความผิดพลาด
Mistake #1 — Language code ผิด
<!-- ผิด -->
<link rel="alternate" hreflang="jp" href="https://example.com/jp/" />
<link rel="alternate" hreflang="cn" href="https://example.com/cn/" />
<link rel="alternate" hreflang="kr" href="https://example.com/kr/" />
<!-- ถูก -->
<link rel="alternate" hreflang="ja" href="https://example.com/jp/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/" />
<link rel="alternate" hreflang="ko" href="https://example.com/kr/" />
หลายคนคิดว่า code ของภาษาญี่ปุ่นคือ jp (เพราะมาจาก Japan) แต่ที่จริง jp คือ country code ภาษาคือ ja (Japanese)
Mistake #2 — Country code ผิด
<!-- ผิด: uk ไม่ใช่ ISO 3166-1 -->
<link rel="alternate" hreflang="en-uk" href="https://example.com/en-uk/" />
<!-- ถูก: ใช้ GB (Great Britain) -->
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/" />
Mistake #3 — ขาด Self-referencing
<!-- ผิด: หน้า /en/about/ ไม่ list ตัวเอง -->
<!-- บนหน้า https://example.com/en/about/ -->
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
<!-- ถูก: list ตัวเองด้วย -->
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<link rel="alternate" hreflang="zh-CN" href="https://example.com/cn/about/" />
Mistake #4 — ไม่ Reciprocal
หน้า A บอก “ภาษาไทยอยู่ที่ B” แต่หน้า B ไม่ได้ list หน้า A เป็น English version — Google จะ ignore ทั้งคู่
Mistake #5 — Relative URL
<!-- ผิด -->
<link rel="alternate" hreflang="en" href="/en/about/" />
<!-- ถูก -->
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
Mistake #6 — hreflang ชี้ไป redirect
<!-- ผิด: /en/about ต้อง redirect ไป /en/about/ -->
<link rel="alternate" hreflang="en" href="https://example.com/en/about" />
<!-- ถูก: ชี้ไปยัง final URL ตรง ๆ -->
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
Mistake #7 — ชี้ไป 404 หรือ noindex
ถ้า URL ใดใน hreflang cluster ส่งคืน 404 หรือมี <meta name="robots" content="noindex"> Google จะมองว่า cluster ทั้งกลุ่มผิดพลาด
Mistake #8 — Canonical conflict
<!-- ผิด: canonical ชี้ไปหน้าอื่น -->
<!-- บนหน้า https://example.com/th/about/ -->
<link rel="canonical" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<!-- ถูก: canonical ต้องเป็น self -->
<link rel="canonical" href="https://example.com/th/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
Mistake #9 — HTTP/HTTPS หรือ www/non-www ไม่ตรง
<!-- ผิด: ผสม www และ non-www -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="th" href="https://www.example.com/th/" />
<!-- ถูก: ใช้ format เดียวกันตลอด -->
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/" />
Mistake #10 — Underscore แทน hyphen
<!-- ผิด -->
<link rel="alternate" hreflang="en_US" href="..." />
<!-- ถูก -->
<link rel="alternate" hreflang="en-US" href="..." />
6. hreflang Reciprocity Rule — กฎที่สำคัญที่สุด
นี่คือกฎที่ฟังดูง่าย แต่ทำผิดมากที่สุด
Reciprocity Rule: ถ้าหน้า A อ้างอิงหน้า B ด้วย hreflang หน้า B ก็ต้องอ้างอิงหน้า A กลับด้วย hreflang ที่สอดคล้อง
6.1 ตัวอย่างผิด
หน้า A (English):
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
หน้า B (Thai):
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
<!-- ขาด hreflang="en" ชี้ไปหน้า A -->
ผลคือ Google จะ ignore hreflang ทั้งคู่ — ไม่มี return link
6.2 ตัวอย่างถูก
หน้า A (English):
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
หน้า B (Thai):
<link rel="alternate" hreflang="en" href="https://example.com/en/about/" />
<link rel="alternate" hreflang="th" href="https://example.com/th/about/" />
ทั้งสองหน้าต้องมี hreflang ของกันและกัน
6.3 วิธีตรวจสอบ Reciprocity ใน Google Search Console
- เข้า Google Search Console
- ไปที่ Coverage Report
- Search “hreflang” ในตัวกรอง — ถ้ามี error จะแสดง:
- “No return tags” — หน้าหนึ่งไม่ link กลับ
- “Invalid language code” — ใช้ code ผิด
- “Inconsistent hreflang” — URL ในกลุ่มไม่ตรงกัน
6.4 Tool ที่แนะนำสำหรับเช็ค hreflang
- Screaming Frog SEO Spider — มี hreflang report ที่ละเอียดมาก แสดง missing return tags
- Sitebulb — visualize hreflang clusters
- Merkle hreflang Tags Testing Tool — เช็คหน้าทีละหน้า (ฟรี)
- Ahrefs Site Audit — มี hreflang errors section
- Google Search Console — ข้อมูลตรงจาก Google เอง
6.5 ทำไม Reciprocity ถึงสำคัญมาก
Google ต้องการ “confirm” จากทั้งสองฝ่าย ว่า “ใช่ ทั้งสองหน้านี้เป็นเวอร์ชันของกันและกันจริง ๆ” ถ้าไม่ confirm กัน Google จะกลัวว่าคุณ inject hreflang เข้าไปแบบไม่ได้รับอนุญาต (เพื่อขโมย ranking ของเว็บอื่น)
7. hreflang ใน WordPress — WPML, Polylang, TranslatePress
ถ้าคุณใช้ WordPress มี plugin หลักที่นิยมสำหรับ multilingual:
7.1 WPML (WordPress Multilingual Plugin) — Premium
WPML เป็น plugin ที่ comprehensive ที่สุด เหมาะกับเว็บใหญ่
ข้อดี:
- Support ทุกประเภท content (post, page, custom post type, taxonomy, menu, theme strings, plugin strings)
- มี translation management dashboard
- Auto-generate hreflang อัตโนมัติ
- Support String Translation, Media Translation
- Integration กับ WooCommerce, Elementor, Yoast SEO
ข้อเสีย:
- ราคาแพง (เริ่ม $39/year)
- Database overhead สูง (สร้าง table เพิ่มหลายตัว)
- ทำให้เว็บช้าถ้าไม่ optimize
ตั้งค่า WPML:
// wp-config.php - เพิ่มก่อน "/* That's all */"
define('WP_MEMORY_LIMIT', '512M');
define('WPML_USE_NEW_MENU_SYNC', true);
// functions.php - บังคับใส่ hreflang ใน <head>
function wpml_force_hreflang() {
if (function_exists('icl_get_languages')) {
$languages = icl_get_languages('skip_missing=0');
if (!empty($languages)) {
foreach ($languages as $lang) {
echo '<link rel="alternate" hreflang="' . esc_attr($lang['language_code']) . '" href="' . esc_url($lang['url']) . '" />' . "\n";
}
// เพิ่ม x-default
echo '<link rel="alternate" hreflang="x-default" href="' . esc_url($languages['en']['url']) . '" />' . "\n";
}
}
}
add_action('wp_head', 'wpml_force_hreflang');
WPML Configuration ที่แนะนำ:
- WPML > Languages > URL format: เลือก “Different languages in directories” (subdirectory)
- WPML > SEO > เปิด “Add hreflang to HTML head”
- WPML > SEO > เปิด “Add hreflang to sitemap”
- WPML > Languages > Browser language redirect: ตั้งเป็น “First visit only”
7.2 Polylang — Free + Pro
Polylang เป็นทางเลือกฟรีที่ดี เหมาะกับเว็บขนาดเล็ก-กลาง
ข้อดี:
- มี free version
- เบากว่า WPML
- Integration กับ Yoast SEO ดี
ข้อเสีย:
- ไม่ comprehensive เท่า WPML
- ต้องแปล string manually หรือใช้ Loco Translate
ตั้งค่า Polylang สำหรับ hreflang:
// functions.php
function add_polylang_hreflang() {
if (function_exists('pll_the_languages')) {
$languages = pll_the_languages(array('raw' => 1));
foreach ($languages as $lang) {
echo '<link rel="alternate" hreflang="' . esc_attr($lang['locale']) . '" href="' . esc_url($lang['url']) . '" />' . "\n";
}
}
}
add_action('wp_head', 'add_polylang_hreflang');
Polylang + Yoast SEO: ติดตั้ง “Polylang Connect for Elementor” หรือใช้ “Yoast SEO Multilingual” สำหรับ auto-hreflang
7.3 TranslatePress — Visual Translation
TranslatePress ใช้ visual editor ในการแปล เหมาะกับคนที่ไม่ technical
ข้อดี:
- UI ใช้งานง่ายมาก
- แปลทีละคำในหน้าจริง
- Support DeepL API สำหรับ auto-translate
- Free version มีให้ใช้
ข้อเสีย:
- Performance overhead สูง (translate on-the-fly)
- ไม่เหมาะกับเว็บใหญ่มาก
TranslatePress + hreflang: เปิดในตั้งค่า “Add hreflang information” ใน Settings > TranslatePress > SEO Pack (Pro only)
7.4 เปรียบเทียบ 3 plugin
| คุณสมบัติ | WPML | Polylang | TranslatePress |
|---|---|---|---|
| ราคา | $39-199/yr | ฟรี + $99/yr Pro | ฟรี + $89/yr Pro |
| Performance | กลาง | ดี | กลาง |
| Auto hreflang | ✅ | ✅ Pro | ✅ Pro |
| Translation method | Manual + Translator | Manual + Translator | Visual + Auto (DeepL/Google) |
| WooCommerce support | ✅ ดีที่สุด | ✅ Pro | ✅ Pro |
| เหมาะกับ | เว็บใหญ่, e-commerce | เว็บกลาง | เว็บเล็ก, non-technical |
8. hreflang ใน Astro — Manual และ Auto-generated
Astro เป็น framework ที่นิยมมากในปี 2026 เพราะ performance ดีและ output เป็น static HTML ทำให้ SEO friendly สุด ๆ — รายละเอียดเพิ่มเติม คู่มือ Astro Framework
8.1 Astro Configuration สำหรับ multi-locale
// astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
i18n: {
defaultLocale: 'en',
locales: ['en', 'th', 'cn', 'jp', 'ru'],
routing: {
prefixDefaultLocale: true, // /en/ instead of /
},
fallback: {
th: 'en',
cn: 'en',
jp: 'en',
ru: 'en',
}
},
integrations: [
sitemap({
i18n: {
defaultLocale: 'en',
locales: {
en: 'en-US',
th: 'th-TH',
cn: 'zh-CN',
jp: 'ja-JP',
ru: 'ru-RU',
}
}
})
]
});
8.2 Manual hreflang Component
สร้าง component ที่ generate hreflang tags อัตโนมัติ
---
// src/components/Hreflang.astro
const { currentPath } = Astro.props;
const locales = ['en', 'th', 'cn', 'jp', 'ru'];
const localeMapping = {
en: 'en-US',
th: 'th-TH',
cn: 'zh-CN',
jp: 'ja-JP',
ru: 'ru-RU',
};
const siteUrl = 'https://example.com';
// ลบ locale prefix ออกจาก path ปัจจุบัน
const cleanPath = currentPath.replace(/^\/(en|th|cn|jp|ru)\//, '/');
---
{locales.map(locale => (
<link
rel="alternate"
hreflang={localeMapping[locale]}
href={`${siteUrl}/${locale}${cleanPath}`}
/>
))}
<link
rel="alternate"
hreflang="x-default"
href={`${siteUrl}/en${cleanPath}`}
/>
ใช้ใน layout:
---
// src/layouts/BaseLayout.astro
import Hreflang from '../components/Hreflang.astro';
const { title, description } = Astro.props;
const currentPath = Astro.url.pathname;
---
<!DOCTYPE html>
<html lang={Astro.currentLocale || 'en'}>
<head>
<meta charset="UTF-8" />
<title>{title}</title>
<meta name="description" content={description} />
<link rel="canonical" href={`https://example.com${currentPath}`} />
<Hreflang currentPath={currentPath} />
</head>
<body>
<slot />
</body>
</html>
8.3 Auto-generated Sitemap with hreflang
ใช้ @astrojs/sitemap ที่ตั้งค่า i18n ไว้ มันจะ generate sitemap.xml พร้อม hreflang อัตโนมัติ — แต่คุณต้องมีโครงสร้าง URL ตรงกันทุก locale (เช่น มี /en/about/, /th/about/, /cn/about/ ครบ)
8.4 Custom Sitemap Script (สำหรับ multi-region complex)
ถ้าโครงสร้าง URL ไม่ตรงกัน 100% (เช่นบาง page มีแค่บาง language) คุณต้องเขียน custom sitemap script
// scripts/generate-sitemap.mjs
import { writeFileSync, readdirSync, statSync } from 'fs';
import { join } from 'path';
const SITE_URL = 'https://example.com';
const LOCALES = ['en', 'th', 'cn', 'jp', 'ru'];
const LOCALE_MAPPING = {
en: 'en-US',
th: 'th-TH',
cn: 'zh-CN',
jp: 'ja-JP',
ru: 'ru-RU',
};
function getAllPages(dir = 'dist', basePath = '') {
const pages = [];
const entries = readdirSync(dir);
for (const entry of entries) {
const fullPath = join(dir, entry);
const stat = statSync(fullPath);
if (stat.isDirectory()) {
pages.push(...getAllPages(fullPath, `${basePath}/${entry}`));
} else if (entry === 'index.html') {
pages.push(basePath + '/');
}
}
return pages;
}
function groupPagesByCanonical(pages) {
const groups = {};
for (const page of pages) {
// path เช่น /en/about/ -> canonical key = /about/
const match = page.match(/^\/(en|th|cn|jp|ru)(\/.+)$/);
if (!match) continue;
const locale = match[1];
const canonical = match[2];
if (!groups[canonical]) groups[canonical] = {};
groups[canonical][locale] = page;
}
return groups;
}
function generateSitemap(groups) {
let xml = '<?xml version="1.0" encoding="UTF-8"?>\n';
xml += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"\n';
xml += ' xmlns:xhtml="http://www.w3.org/1999/xhtml">\n';
for (const [canonical, localePages] of Object.entries(groups)) {
for (const [currentLocale, currentPath] of Object.entries(localePages)) {
xml += ' <url>\n';
xml += ` <loc>${SITE_URL}${currentPath}</loc>\n`;
// เพิ่ม hreflang สำหรับทุก locale ที่มี
for (const [locale, path] of Object.entries(localePages)) {
const hreflangCode = LOCALE_MAPPING[locale];
xml += ` <xhtml:link rel="alternate" hreflang="${hreflangCode}" href="${SITE_URL}${path}" />\n`;
}
// x-default ชี้ไป English (ถ้ามี)
if (localePages.en) {
xml += ` <xhtml:link rel="alternate" hreflang="x-default" href="${SITE_URL}${localePages.en}" />\n`;
}
xml += ' </url>\n';
}
}
xml += '</urlset>';
return xml;
}
const pages = getAllPages();
const groups = groupPagesByCanonical(pages);
const sitemap = generateSitemap(groups);
writeFileSync('dist/sitemap.xml', sitemap);
console.log(`Generated sitemap with ${pages.length} URLs`);
รัน script หลัง build:
// package.json
{
"scripts": {
"build": "astro build && node scripts/generate-sitemap.mjs"
}
}
9. Geo-targeting in Google Search Console + Bing Webmaster
9.1 Google Search Console — International Targeting
เริ่มแรก Google ใช้ “International Targeting” report ในการระบุประเทศเป้าหมาย — แต่ Google ลบ feature นี้ออกในปี 2022 และพึ่งพา ccTLD + hreflang แทน
ปัจจุบัน (2026) คุณยังสามารถ:
- Verify property แต่ละ subdomain/subdirectory แยกกัน — ทำให้ Google เห็น performance ของแต่ละ locale แยก
- ตรวจสอบ hreflang errors — Coverage Report > International Targeting (sub-section)
- Submit sitemap แยกตาม locale — ช่วยให้ Google crawl ได้เร็วขึ้น
ขั้นตอนการตั้งค่า GSC สำหรับ multi-locale:
1. เข้า Google Search Console
2. Add Property (Domain Property แนะนำกว่า URL Property)
3. Verify domain ผ่าน DNS TXT record
4. Submit sitemap.xml ที่ root: https://example.com/sitemap.xml
5. (Optional) Submit sitemap แยกตาม locale:
- https://example.com/sitemap-en.xml
- https://example.com/sitemap-th.xml
- https://example.com/sitemap-cn.xml
6. ตรวจสอบ Coverage > International Targeting
9.2 Bing Webmaster Tools — Geo-targeting ยังมี
Bing ยังคงมี geo-targeting feature ใน Webmaster Tools (Google เลิก แต่ Bing ยังเก็บไว้)
ขั้นตอน:
1. เข้า Bing Webmaster Tools (https://www.bing.com/webmasters)
2. Add Site
3. Verify ผ่าน meta tag, XML file, หรือ DNS
4. ไปที่ Configure My Site > Geo-Targeting
5. เลือก:
- Whole Site → ระบุประเทศหลัก
- หรือ Subdomain/Subdirectory → ระบุประเทศแยกตาม
6. Save
ตัวอย่างการตั้งค่า:
example.com/en/ → United States
example.com/th/ → Thailand
example.com/cn/ → China
example.com/jp/ → Japan
example.com/ru/ → Russia
9.3 Yandex Webmaster (สำหรับตลาดรัสเซีย)
ถ้า target รัสเซีย คุณต้อง submit ใน Yandex.Webmaster ด้วย เพราะ Yandex มี market share เกือบ 60% ในรัสเซีย
1. เข้า https://webmaster.yandex.com
2. Add site
3. Verify ผ่าน meta tag หรือ DNS
4. ตั้งค่า "Region" ใน Settings > Site Information
5. Submit sitemap.xml
9.4 Baidu Webmaster Tools (สำหรับตลาดจีน)
Baidu เป็น search engine #1 ในจีน Google ถูก block ในจีน
1. เข้า https://ziyuan.baidu.com (ต้องมีบัญชี Baidu)
2. Add site (ต้องมี ICP license ถ้า host ในจีน)
3. Verify
4. Submit URLs ผ่าน API หรือ manual
5. Use Baidu Sitemap protocol (คล้าย sitemap.xml ทั่วไป)
10. Hosting + Server Location Strategy
Server location มีผลกับ:
- Load time สำหรับผู้ใช้ในพื้นที่นั้น
- SEO signal — Google ใช้ server location เป็นหนึ่งใน geo signal
- Compliance — บางประเทศ (จีน, รัสเซีย) มีกฎหมายข้อมูล local
10.1 ทางเลือกที่ดีที่สุด — CDN + Multi-region
ใช้ CDN เช่น Cloudflare, AWS CloudFront, Fastly เพื่อ cache content ใกล้กับผู้ใช้ทั่วโลก — รายละเอียดดู คู่มือ Cloudflare
โครงสร้างที่แนะนำ:
Origin Server: AWS Singapore (เร็วสำหรับ TH, SG, MY)
CDN: Cloudflare (300+ POPs ทั่วโลก)
DNS: Cloudflare DNS
Performance สำหรับผู้ใช้แต่ละประเทศ:
- TH: ~10ms (โดยตรงจาก origin)
- SG: ~5ms (origin)
- JP: ~50ms (cache จาก Tokyo POP)
- CN: ~150ms (cache จาก Hong Kong POP, Cloudflare ไม่มี POP ในจีน)
- RU: ~80ms (cache จาก Moscow POP)
10.2 พิเศษสำหรับจีน — China Performance
Cloudflare ไม่มี POP ในจีนแผ่นดินใหญ่ (ต้องใช้ Cloudflare Enterprise + ICP license)
ทางเลือก:
- Cloudflare China Network — Enterprise tier, ต้องการ ICP, ผ่านพาร์ทเนอร์ JD Cloud
- Aliyun (Alibaba Cloud) CDN — มี global POPs + จีนแผ่นดินใหญ่
- Tencent Cloud — alternative ของ Alibaba
- CN2 GIA connection — premium routing สำหรับ China
ถ้าคุณจริงจังกับตลาดจีน ต้อง:
1. จด domain .cn ผ่าน Aliyun หรือ Tencent
2. ขอ ICP license (ใช้เวลา 2-4 สัปดาห์, ต้องมี business entity ในจีน)
3. Host บน Aliyun China region
4. ใช้ Aliyun CDN
5. Optimize สำหรับ Baidu (ไม่ใช่ Google)
10.3 พิเศษสำหรับรัสเซีย — Data Localization Law
ตั้งแต่ปี 2015 รัสเซียมีกฎหมาย Personal Data Localization (Federal Law 152-FZ) ที่กำหนดว่าข้อมูลส่วนตัวของพลเมืองรัสเซียต้อง store บน server ในรัสเซีย
ถ้าคุณเก็บข้อมูล user รัสเซีย ต้อง:
- ใช้ hosting ในรัสเซีย เช่น Selectel, Yandex Cloud, VK Cloud, Beget
- Register กับ Roskomnadzor (หน่วยงานกำกับ)
- มี Privacy Policy ที่ระบุ data localization
10.4 Multi-region setup ตัวอย่าง
# Cloud configuration (Pulumi/Terraform style pseudo-code)
regions:
- name: ap-southeast-1 (Singapore)
locales: [en, th, ms]
origin: ec2-instance-sg
cdn: cloudflare
- name: ap-northeast-1 (Tokyo)
locales: [ja, ko]
origin: ec2-instance-tokyo
cdn: cloudflare
- name: cn-hangzhou (China)
locales: [zh-CN]
origin: alibaba-cloud-hz
cdn: aliyun
icp_license: required
- name: ru-moscow (Russia)
locales: [ru]
origin: yandex-cloud-moscow
cdn: ngenix
data_localization: required
11. Currency, Date, Address Format Localization
International SEO ไม่ใช่แค่ภาษา — formatting ก็สำคัญ
11.1 Currency Localization
// src/utils/currency.js
export function formatCurrency(amount, locale) {
const currencyMap = {
'en-US': { code: 'USD', symbol: '$', format: 'before' },
'en-GB': { code: 'GBP', symbol: '£', format: 'before' },
'th-TH': { code: 'THB', symbol: '฿', format: 'before' },
'zh-CN': { code: 'CNY', symbol: '¥', format: 'before' },
'ja-JP': { code: 'JPY', symbol: '¥', format: 'before' },
'ru-RU': { code: 'RUB', symbol: '₽', format: 'after' },
'de-DE': { code: 'EUR', symbol: '€', format: 'after' },
};
const config = currencyMap[locale] || currencyMap['en-US'];
return new Intl.NumberFormat(locale, {
style: 'currency',
currency: config.code,
minimumFractionDigits: config.code === 'JPY' ? 0 : 2,
}).format(amount);
}
// Usage
formatCurrency(1500, 'en-US'); // "$1,500.00"
formatCurrency(1500, 'th-TH'); // "฿1,500.00"
formatCurrency(1500, 'ja-JP'); // "¥1,500"
formatCurrency(1500, 'ru-RU'); // "1 500,00 ₽"
formatCurrency(1500, 'de-DE'); // "1.500,00 €"
11.2 Date Localization
// src/utils/date.js
export function formatDate(date, locale, options = {}) {
const defaultOptions = {
year: 'numeric',
month: 'long',
day: 'numeric',
...options,
};
return new Intl.DateTimeFormat(locale, defaultOptions).format(date);
}
const today = new Date('2026-06-20');
formatDate(today, 'en-US'); // "June 20, 2026"
formatDate(today, 'en-GB'); // "20 June 2026"
formatDate(today, 'th-TH'); // "20 มิถุนายน 2569" (Buddhist Era!)
formatDate(today, 'zh-CN'); // "2026年6月20日"
formatDate(today, 'ja-JP'); // "2026年6月20日"
formatDate(today, 'ru-RU'); // "20 июня 2026 г."
ข้อควรระวัง: ภาษาไทยใช้ปี พ.ศ. (Buddhist Era) เป็น default ถ้าต้องการ ค.ศ. ต้องระบุ calendar:
new Intl.DateTimeFormat('th-TH-u-ca-gregory', {
year: 'numeric',
month: 'long',
day: 'numeric',
}).format(today);
// "20 มิถุนายน 2026"
11.3 Address Format
แต่ละประเทศมี format address ต่างกัน:
USA:
Name
Street Address
City, State ZIP
USA
UK:
Name
Street Address
Town/City
County
Postcode
United Kingdom
Japan:
〒Postcode
Prefecture City
District/Street
Name
China:
China
Province City District
Street Address
Name (Postcode)
Russia:
Country
Postcode, City
Street, Building, Apt
Name
Thailand:
Name
Street Address, Sub-district
District, Province Postcode
Thailand
11.4 Phone Number Format
import { parsePhoneNumber, formatPhoneNumber } from 'libphonenumber-js';
const phone = parsePhoneNumber('+66812345678');
phone.formatInternational(); // "+66 81 234 5678"
phone.formatNational(); // "081 234 5678"
phone.country; // "TH"
11.5 Number Format
new Intl.NumberFormat('en-US').format(1234567.89); // "1,234,567.89"
new Intl.NumberFormat('th-TH').format(1234567.89); // "1,234,567.89"
new Intl.NumberFormat('de-DE').format(1234567.89); // "1.234.567,89"
new Intl.NumberFormat('fr-FR').format(1234567.89); // "1 234 567,89"
12. Cultural Content Adaptation — อย่าแปลตรง ๆ
นี่คือสิ่งที่ทำให้ International SEO ระดับ pro แตกต่างจากมือสมัครเล่น — localization ไม่ใช่แค่ translation
12.1 ตัวอย่างความผิดพลาดจากการแปลตรง ๆ
ตัวอย่าง 1: Slogan ที่ตลกในต่างประเทศ
- KFC ตอนเข้าตลาดจีน แปล “Finger-Lickin’ Good” เป็น “吃手指” (กินนิ้วของคุณ) — น่ากลัวมากในวัฒนธรรมจีน
- Pepsi ตอนเข้าตลาดจีน แปล “Pepsi Brings You Back to Life” เป็น “百事可乐让你的祖先从坟墓里复活” (Pepsi ทำให้บรรพบุรุษคุณฟื้นจากหลุมศพ) — กลายเป็นเรื่องสยอง
ตัวอย่าง 2: สีและสัญลักษณ์
- สีขาวในไทย = บริสุทธิ์, ความสะอาด
- สีขาวในจีน = ความตาย, งานศพ
- สีแดงในจีน = โชคดี, มงคล
- สีแดงในตะวันตก = อันตราย, ความรัก
ถ้าคุณทำเว็บโรงแรมแล้วใช้สีขาวเป็น dominant color คนจีนอาจรู้สึกไม่สบายใจ
12.2 Localize ตามวัฒนธรรม
สำหรับเว็บโรงแรมภูเก็ตที่ target จีน:
ปกติ (English):
"Beautiful beach view from your balcony"
แปลตรง ๆ:
"从您的阳台欣赏美丽的海滩景色"
Localized (เพิ่มมุมมองที่จีนชอบ):
"您可以从私人阳台上欣赏到普吉岛安达曼海的金色日落,
是您与家人共度团圆时光的理想之地。"
(สามารถชมพระอาทิตย์ตกสีทองของทะเลอันดามันภูเก็ตจากระเบียงส่วนตัว
เป็นสถานที่ที่ดีสำหรับใช้เวลาร่วมกันกับครอบครัว)
ความแตกต่าง:
- พูดถึง “family togetherness” — สำคัญในวัฒนธรรมจีน
- ระบุ “private balcony” — สำคัญสำหรับ premium feel
- ใช้ “golden sunset” — สีทอง = มงคลในจีน
สำหรับ target ญี่ปุ่น:
ปกติ:
"Best price guarantee"
Localized:
"安心の最低価格保証 — お客様にご満足いただけるよう
24時間以内に対応いたします"
(การรับประกันราคาต่ำสุดที่อุ่นใจ — เราจะตอบกลับภายใน 24 ชั่วโมง
เพื่อให้ลูกค้าพึงพอใจ)
ความแตกต่าง:
- ใส่คำว่า “ご満足” (ความพึงพอใจ) — สำคัญในการบริการของญี่ปุ่น
- ระบุ time-frame ที่ชัดเจน — ญี่ปุ่นชอบความแน่นอน
- ใช้ honorific language
สำหรับ target รัสเซีย:
ปกติ:
"Affordable luxury"
Localized:
"Премиум-отдых по разумной цене — для тех,
кто знает толк в путешествиях"
(การพักผ่อนระดับพรีเมียมในราคาที่สมเหตุสมผล —
สำหรับผู้ที่รู้จักการเดินทาง)
12.3 Cultural Calendar & Holidays
- จีน: Chinese New Year (มกราคม/กุมภาพันธ์), Golden Week (ตุลาคม), Mid-Autumn Festival
- ญี่ปุ่น: Golden Week (ปลายเมษายน-ต้นพฤษภาคม), Obon (สิงหาคม), New Year (มกราคม)
- รัสเซีย: New Year (1-8 มกราคม), Victory Day (9 พฤษภาคม), Russia Day (12 มิถุนายน)
ทำ promotion ตาม cultural calendar ของแต่ละประเทศ — ไม่ใช่แค่ Christmas และ Black Friday
12.4 Cultural Imagery
- จีน: หลีกเลี่ยงสีดำกับขาวร่วมกัน (เกี่ยวกับงานศพ), ใช้สีแดง+ทอง, รูปคนต้องดูมีความสุข
- ญี่ปุ่น: หลีกเลี่ยง 4 (เลขนำโชคร้าย), ใช้รูปธรรมชาติ, minimalism
- รัสเซีย: ใช้รูปครอบครัว, อาหารร้อน, ความอบอุ่น (อากาศหนาว)
- ไทย: ใช้รูป tropical, sunshine, สีสันสดใส
12.5 SEO Keyword Research per Locale
อย่าใช้แค่ Google Translate กับ keyword — ทำ keyword research ใหม่ในแต่ละภาษา
ตัวอย่าง:
- ภาษาอังกฤษ: “Phuket hotel”
- แปลตรง: “ภูเก็ตโรงแรม”
- จริง ๆ คนไทย search: “โรงแรมภูเก็ต” (ลำดับคำสลับกัน)
ตัวอย่างจีน:
- ภาษาอังกฤษ: “luxury beach resort Phuket”
- แปลตรง: “豪华海滩度假村普吉岛”
- จริง ๆ คนจีน search ใน Baidu: “普吉岛海景酒店” (สั้นกว่า)
ใช้ tool:
- Google Keyword Planner (เปลี่ยน language + location)
- Baidu Index สำหรับจีน
- Yandex Wordstat สำหรับรัสเซีย
- Ahrefs / SEMrush ที่ support multi-locale
13. Multi-region Schema — Organization with Multiple Addresses
JSON-LD Schema ช่วยให้ Google เข้าใจว่าธุรกิจของคุณมีหลาย location
13.1 Organization Schema with Multiple Locations
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Southern Whale Hotel",
"alternateName": ["南方鲸鱼酒店", "サザンホエールホテル", "Отель Южный Кит"],
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"sameAs": [
"https://www.facebook.com/southernwhale",
"https://www.instagram.com/southernwhale",
"https://twitter.com/southernwhale",
"https://weibo.com/southernwhale",
"https://line.me/R/ti/p/@southernwhale"
],
"contactPoint": [
{
"@type": "ContactPoint",
"telephone": "+66-76-123-4567",
"contactType": "reservations",
"availableLanguage": ["English", "Thai"],
"areaServed": ["TH", "SG", "MY"]
},
{
"@type": "ContactPoint",
"telephone": "+86-400-123-4567",
"contactType": "reservations",
"availableLanguage": ["Chinese"],
"areaServed": "CN"
},
{
"@type": "ContactPoint",
"telephone": "+81-3-1234-5678",
"contactType": "reservations",
"availableLanguage": "Japanese",
"areaServed": "JP"
},
{
"@type": "ContactPoint",
"telephone": "+7-495-123-4567",
"contactType": "reservations",
"availableLanguage": "Russian",
"areaServed": "RU"
}
],
"address": [
{
"@type": "PostalAddress",
"streetAddress": "123 Beach Road",
"addressLocality": "Patong",
"addressRegion": "Phuket",
"postalCode": "83150",
"addressCountry": "TH"
}
],
"areaServed": ["TH", "CN", "JP", "RU", "US", "GB", "AU"]
}
</script>
13.2 Hotel Schema สำหรับเว็บโรงแรม
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Hotel",
"@id": "https://example.com/#hotel",
"name": "Southern Whale Hotel",
"description": "Luxury beachfront hotel in Patong, Phuket",
"url": "https://example.com",
"telephone": "+66-76-123-4567",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Beach Road",
"addressLocality": "Patong",
"addressRegion": "Phuket",
"postalCode": "83150",
"addressCountry": "TH"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 7.8965,
"longitude": 98.2966
},
"starRating": {
"@type": "Rating",
"ratingValue": 5
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.7,
"reviewCount": 1247,
"bestRating": 5,
"worstRating": 1
},
"priceRange": "$$$",
"amenityFeature": [
{"@type": "LocationFeatureSpecification", "name": "Free WiFi", "value": true},
{"@type": "LocationFeatureSpecification", "name": "Swimming Pool", "value": true},
{"@type": "LocationFeatureSpecification", "name": "Spa", "value": true},
{"@type": "LocationFeatureSpecification", "name": "Beachfront", "value": true}
],
"checkinTime": "14:00",
"checkoutTime": "12:00"
}
</script>
13.3 LocalBusiness with Multiple Languages
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://example.com/#business",
"name": "Southern Whale",
"image": "https://example.com/hotel.jpg",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Beach Road",
"addressLocality": "Patong",
"addressRegion": "Phuket",
"postalCode": "83150",
"addressCountry": "TH"
},
"openingHoursSpecification": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
"opens": "00:00",
"closes": "23:59"
},
"knowsLanguage": ["en", "th", "zh-CN", "ja", "ru"]
}
</script>
13.4 WebSite Schema with Multiple Languages
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com",
"name": "Southern Whale",
"inLanguage": ["en", "th", "zh-CN", "ja", "ru"],
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://example.com/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
}
</script>
14. Case Study — เว็บโรงแรมภูเก็ต TH/EN/CN/RU/JP รายได้เพิ่ม 180%
ปลายปี 2024 เราได้รับงาน Technical SEO Audit สำหรับเว็บโรงแรม 5 ดาวในป่าตอง ภูเก็ต ที่ชื่อเล่นเราเรียก “Hotel X” (ขอไม่เปิดเผยชื่อจริง)
14.1 สภาพก่อนเริ่ม
- เว็บไซต์ใช้ WordPress + Avada theme + WPML
- มี 5 ภาษา: TH, EN, CN, RU, JP
- โครงสร้าง URL:
hotelx.com/[lang]/ - Traffic ต่อเดือน: 18,000 sessions (90% มาจาก Direct + Booking.com referral)
- Organic traffic: 2,100 sessions
- Bounce rate: 72%
- Average session duration: 1:23 นาที
- Direct bookings ผ่านเว็บ: 38 bookings/เดือน ($24,000 revenue)
14.2 ปัญหาที่เราเจอ
Technical Issues:
- hreflang ผิด — ใช้
hreflang="jp"แทนja,hreflang="cn"แทนzh-CN - Missing self-referencing hreflang — หน้า /en/ ไม่ list ตัวเอง
- Canonical conflict — หน้า /th/ มี canonical ชี้ไป /en/
- No x-default — ผู้ใช้ที่ไม่ตรงภาษาไม่เห็นเว็บในผลค้นหา
- Slow Time to First Byte — TTFB 2.8 วินาที (server ใน UK!)
- Mixed www and non-www URLs ใน hreflang
- Sitemap ไม่มี hreflang annotations
Content Issues:
- Auto-translated content — ใช้ Google Translate API แปลทุกหน้า คุณภาพแย่
- เนื้อหาไม่ localized — ราคาเป็น USD ทุกภาษา
- ไม่มี cultural adaptation — รูปและ messaging เดียวทั้งเว็บ
- Date format ผิด — แสดง MM/DD/YYYY ในทุกภาษา (รัสเซียและจีนใช้ DD/MM/YYYY)
- ไม่มี currency switcher
SEO Issues:
- Keyword research ไม่ทำใหม่ในแต่ละภาษา — ใช้ keyword ภาษาอังกฤษแปลตรง ๆ
- ไม่ submit ใน Yandex (ทำ RU แต่ไม่ submit) และ Baidu (ทำ CN แต่ไม่ submit)
- Title และ Meta Description ซ้ำกันในหลายภาษา (เพราะแปลตรง ๆ)
- ไม่มี Hotel Schema
- GSC ไม่ได้ verify subdirectory แยก
14.3 แผนการแก้ไข — 4 เดือน
เดือนที่ 1: Technical Foundation
Week 1: hreflang fix
- แก้ language codes (jp → ja, cn → zh-CN, etc.)
- เพิ่ม self-referencing hreflang ทุกหน้า
- แก้ canonical conflict
- เพิ่ม x-default ชี้ไป /en/
Week 2: URL normalization
- 301 redirect www → non-www
- 301 redirect HTTP → HTTPS
- Trailing slash consistency
Week 3: Sitemap rebuild
- เขียน custom sitemap script ที่มี hreflang annotations
- Submit sitemap แยกตาม locale ใน GSC
Week 4: Server migration
- ย้าย hosting จาก UK ไปยัง AWS Singapore (close to majority of users)
- ติดตั้ง Cloudflare Pro
- Setup APO (Automatic Platform Optimization) for WordPress
- TTFB ลดจาก 2.8s → 280ms
เดือนที่ 2: Content Localization
Week 5-6: จ้าง native translator
- 1 person ต่อภาษา (TH ไม่ต้อง เพราะเป็น native ของเจ้าของ)
- แปลใหม่ทุก page (ประมาณ 80 หน้า x 4 ภาษา = 320 หน้า)
- ทำ Style Guide เพื่อ consistency
Week 7-8: Cultural adaptation
- เปลี่ยนรูปภาพให้เหมาะกับแต่ละ market
* จีน: เพิ่มรูปครอบครัว, สีแดง+ทอง
* รัสเซีย: เน้น sunshine, beach
* ญี่ปุ่น: minimalism, รายละเอียดการบริการ
- เพิ่ม currency switcher (THB, USD, CNY, JPY, RUB)
- Date format ตาม locale
เดือนที่ 3: Keyword & Content Strategy
Week 9: Keyword research ใหม่
- ใช้ Baidu Index สำหรับจีน
- Yandex Wordstat สำหรับรัสเซีย
- Google Keyword Planner สำหรับ TH/EN/JP
Week 10-11: Content creation
- เขียน blog ใหม่ 20 บทความ ต่อภาษา (focus on long-tail)
- เช่น "ภูเก็ตช่วงไหนดีที่สุดสำหรับครอบครัวจีน"
- "Лучшие отели на Пхукете для русских туристов" (โรงแรมที่ดีที่สุดในภูเก็ตสำหรับนักท่องเที่ยวรัสเซีย)
Week 12: Internal linking + Topic clusters
- สร้าง topic cluster สำหรับแต่ละ market
- เพิ่ม internal links ระหว่าง related content
เดือนที่ 4: Schema + Verification
Week 13: JSON-LD Schema
- เพิ่ม Hotel Schema with aggregateRating
- LocalBusiness with multiple language support
- BreadcrumbList ทุกหน้า
- FAQ Schema ในหน้า booking
Week 14: Verification
- Submit ใน Yandex.Webmaster
- Submit ใน Baidu (ผ่าน ICP partner)
- Submit ใน Bing
- Setup geo-targeting ใน Bing
Week 15-16: Monitoring + Tuning
- ตรวจสอบ rankings ทุกสัปดาห์
- A/B test currency display
- Fix Coverage Report issues
14.4 ผลลัพธ์หลัง 6 เดือน
Traffic:
| Metric | ก่อน | หลัง (6 เดือน) | เปลี่ยนแปลง |
|---|---|---|---|
| Total monthly sessions | 18,000 | 48,500 | +169% |
| Organic sessions | 2,100 | 21,300 | +914% |
| Organic from CN | 180 | 4,800 | +2,567% |
| Organic from RU | 95 | 3,200 | +3,268% |
| Organic from JP | 220 | 2,400 | +990% |
| Organic from EN markets | 1,300 | 8,900 | +585% |
| Organic from TH | 305 | 2,000 | +556% |
Engagement:
| Metric | ก่อน | หลัง | เปลี่ยนแปลง |
|---|---|---|---|
| Bounce rate | 72% | 41% | -43% |
| Avg session duration | 1:23 | 3:47 | +174% |
| Pages per session | 1.8 | 4.2 | +133% |
Business:
| Metric | ก่อน | หลัง | เปลี่ยนแปลง |
|---|---|---|---|
| Direct bookings/เดือน | 38 | 152 | +300% |
| Revenue from direct/เดือน | $24,000 | $67,200 | +180% |
| Avg booking value | $632 | $442 | -30% (more variety from new markets) |
| Booking.com commission saved | - | $13,440/เดือน | new |
14.5 บทเรียนที่ได้
- hreflang ผิดแม้แต่ตัวเดียวก็พังทั้งระบบ — แค่แก้
jp → jaทำให้ traffic จากญี่ปุ่นเพิ่ม 990% - Native translation คุ้มค่ามาก — เนื้อหาที่ Google Translate ทำให้ Bounce Rate สูง
- Cultural adaptation = conversion booster — currency switcher เพิ่ม conversion 65%
- Server location สำคัญกว่าที่คิด — TTFB ลด 90% ทำให้ Core Web Vitals ดีขึ้นมาก
- Search engine alternatives สำคัญ — Baidu และ Yandex มี traffic significant แต่คนมัก ignore
15. 5 ข้อผิดพลาดที่พบบ่อย
นอกจาก 10 hreflang mistakes ในข้อ 5 ยังมีความผิดพลาดเชิงกลยุทธ์ที่พบบ่อย:
15.1 คิดว่า Translation = Localization
หลายคนคิดว่าแปลภาษาแล้วเสร็จ — ที่จริงต้อง localize ทุกอย่าง: currency, date, address, image, color, cultural reference
15.2 ใช้ Auto-translate สำหรับ Critical Pages
Home, About, Service pages — หน้าเหล่านี้ต้อง human-translated โดย native speaker ใช้ AI ได้สำหรับ draft แต่ต้องให้คนตรวจ
15.3 ไม่ submit ใน Search Engine ท้องถิ่น
- จีน: ต้อง Baidu (Google ถูก block!)
- รัสเซีย: ต้อง Yandex (market share เกือบ 60%)
- เกาหลี: ต้อง Naver
- ญี่ปุ่น: ใช้ Google แต่ Yahoo! Japan ก็ยังมี share
15.4 ไม่ตั้งค่า Currency Switcher
ผู้ใช้ต่างประเทศต้องการเห็นราคาในสกุลเงินของตัวเอง — ถ้าโชว์แต่ THB หรือ USD จะ Bounce ทันที
ดูเพิ่มเติม JavaScript SEO สำหรับการ implement currency switcher ที่ SEO-friendly
15.5 ไม่ optimize image filename / alt text ตามภาษา
<!-- ผิด: ใช้ filename เดียวทุกภาษา -->
<img src="/images/hotel-room.jpg" alt="Hotel room" />
<!-- ถูก: ปรับ alt text ตามภาษาของหน้า -->
<!-- หน้า /th/ -->
<img src="/images/hotel-room.jpg" alt="ห้องพักโรงแรมในภูเก็ต พร้อมวิวทะเลอันดามัน" />
<!-- หน้า /cn/ -->
<img src="/images/hotel-room.jpg" alt="普吉岛酒店客房,安达曼海景" />
16. FAQ — คำถามที่พบบ่อย
Q1: ถ้าผมมีแค่ภาษาไทยและอังกฤษ ต้องทำ hreflang ไหม?
A: ต้องทำ — ถึงแม้แค่ 2 ภาษา ก็จำเป็น เพราะถ้าไม่ทำ Google อาจมองว่าทั้ง 2 หน้าเป็น duplicate และเลือก index แค่หน้าเดียว ทำให้คุณเสีย traffic จากกลุ่มภาษาอื่น
Q2: ใช้ Google Translate Widget ได้ไหม? หรือควรทำเป็น static translation?
A: ไม่แนะนำ Google Translate Widget — เพราะ:
- Content ที่ translate on-the-fly ไม่ได้ถูก index โดย Google
- คุณไม่ control คุณภาพ translation
- ไม่มี separate URL ทำให้ใส่ hreflang ไม่ได้
ควรทำ static translation มี URL แยกสำหรับแต่ละภาษา และใส่ hreflang
Q3: แล้ว Subdomain กับ Subdirectory อันไหนดีกว่าจริง ๆ?
A: 90% ของกรณี — Subdirectory ดีกว่าเพราะรวม Domain Authority ยกเว้น:
- ต้องการ host ในประเทศต่าง ๆ → Subdomain ดีกว่า
- มี business unit แยกในแต่ละประเทศ → ccTLD ดีกว่า
- เข้าตลาดจีน → ต้อง .cn ccTLD
Q4: ผมใช้ Astro แต่อยากใช้ WordPress สำหรับ blog ของแต่ละภาษา ทำได้ไหม?
A: ทำได้ แต่ซับซ้อน — เรียกว่า Headless WordPress + Astro frontend คุณจะมี:
- Astro สำหรับ static pages (Home, About, Services)
- WordPress สำหรับ blog content
- Use REST API หรือ GraphQL ดึง content จาก WP
hreflang ต้อง coordinate ระหว่าง Astro routes กับ WordPress permalinks ระวังให้ตรงกัน
Q5: จำเป็นต้องแปล URL slug ด้วยไหม? เช่น /about/ ในไทยต้องเป็น /เกี่ยวกับเรา/?
A: ขึ้นอยู่กับเป้าหมาย:
- ถ้าต้องการ SEO ดีในภาษานั้น → แปล slug ช่วย ranking สำหรับ keyword ใน URL
- ถ้าต้องการ maintain ง่าย → ใช้ slug ภาษาอังกฤษเหมือนกันทุก locale
ในทางปฏิบัติ:
- ภาษาที่ใช้ Latin character (EN, RU, JP romaji, CN pinyin) → แปล slug ได้ดี
- ภาษาที่ใช้ non-Latin (TH, CN simplified) → ใช้ภาษาอังกฤษอาจดีกว่า เพราะ URL ภาษาไทยจะกลายเป็น %E0%B8%81%E0%B8%B2… ที่อ่านไม่ออก
Q6: ถ้าผมเปลี่ยน URL structure (เช่น จาก subdomain ไป subdirectory) ต้องทำอะไร?
A: นี่คือ migration ที่ใหญ่มาก ต้องทำ:
- 301 redirect map ทุก URL เก่า → URL ใหม่
- Update internal links ทั้งหมด
- Update hreflang ในทุก locale
- Resubmit sitemap ใน GSC, Bing, Yandex, Baidu
- Update canonical tags
- Update Schema URLs
- Monitor Coverage Report อย่างน้อย 3 เดือน
คาดว่าจะมี traffic drop 10-30% ในช่วง 1-2 เดือนแรก ก่อนที่ Google จะ re-index ทั้งหมด
Q7: GeoIP redirect (auto redirect ตาม IP) เป็น SEO friendly ไหม?
A: เป็น anti-pattern! Google ไม่ชอบ GeoIP redirect เพราะ:
- Googlebot crawl จาก IP US → จะได้แต่ /en/ version
- ผู้ใช้ที่ใช้ VPN จะได้ภาษาผิด
- ทำให้ผู้ใช้ไม่สามารถเลือกภาษาได้
ทางที่ดี:
- ใช้ banner แนะนำให้เปลี่ยนภาษา (ไม่ force redirect)
- ใช้ JavaScript-based redirect (only first visit)
- เก็บ cookie ให้ผู้ใช้เปลี่ยนได้
Q8: ถ้าเนื้อหาผมเหมือนกันใน 2 ภาษา (เช่น Thai กับ Lao ใกล้กันมาก) ต้องแยกหรือไม่?
A: แยก — ถึงภาษาจะใกล้กัน แต่:
- ผู้ใช้ค้นด้วย script ต่างกัน (Thai script vs Lao script)
- Cultural reference ต่างกัน
- Currency, formatting ต่างกัน
ทำเป็น 2 versions แยก พร้อม hreflang th-TH และ lo-LA
17. สรุป — ขั้นตอนที่คุณควรทำต่อจากนี้
International SEO ในปี 2026 ไม่ใช่เรื่องเล่น ๆ — มันคือ technical discipline ที่ต้องการความละเอียดและ patience แต่ผลตอบแทนคุ้มค่ามาก ถ้าคุณทำให้ถูกต้องตั้งแต่ต้น
Checklist ที่คุณควรทำตาม:
- ✅ ตัดสินใจ URL structure — ccTLD, Subdomain, หรือ Subdirectory
- ✅ Implement hreflang ด้วย HTML xhtml:link + XML sitemap (combined)
- ✅ ใช้ language code ที่ถูก (ISO 639-1) และ country code (ISO 3166-1)
- ✅ เพิ่ม x-default ทุกหน้า
- ✅ ตรวจสอบ Reciprocity Rule — ทุก link ต้อง mutual
- ✅ ใช้ self-referencing hreflang
- ✅ Localize ไม่ใช่ translate — currency, date, image, cultural
- ✅ Setup Hotel/Organization Schema with multi-language support
- ✅ Submit ใน Google + Bing + Yandex + Baidu
- ✅ Monitor Coverage Report ใน GSC ทุกสัปดาห์
- ✅ ใช้ CDN เพื่อ server speed ใน region ต่าง ๆ
- ✅ Custom sitemap script ถ้าโครงสร้างซับซ้อน
ถ้าคุณรู้สึก overwhelmed — เป็นเรื่องปกติ การทำ International SEO ที่ดีต้องการทีมที่มีประสบการณ์ และเครื่องมือเฉพาะทาง
ที่ Southern Whale เราช่วย business ในภูเก็ตและทั่วประเทศไทยทำ International SEO มากว่า 6 ปี — case study ของโรงแรม 5 ดาวที่รายได้เพิ่ม 180% ในข้อ 14 ไม่ใช่เคสเดียวที่เราทำ
ถ้าคุณต้องการให้เรา audit เว็บไซต์ของคุณ หรือต้องการ implement International SEO ตั้งแต่ต้นจนจบ:
- ดูบริการ Technical SEO ของเรา
- หรือติดต่อเรา เพื่อปรึกษาฟรี 30 นาที
แล้วคุณจะรู้ว่า International SEO ไม่ได้ยากอย่างที่คิด ถ้ามีคนที่รู้จริงช่วย
บทความนี้เป็นส่วนหนึ่งของซีรีส์ Technical SEO 2026 ของ Southern Whale อ่านบทความที่เกี่ยวข้องเพิ่มเติม: