วิธีคิวรีเนื้อหาหลายภาษาด้วย WPGraphQL – การกรองภาษาและการแปล
เรียนรู้วิธีคิวรีเนื้อหาเฉพาะภาษา ดึงข้อมูลการแปล และแสดงเมนูหลายภาษาผ่าน WPGraphQL บนเว็บไซต์ WordPress แบบ headless โดย WPML GraphQL จะเพิ่มอาร์กิวเมนต์ภาษาและฟิลด์การแปลลงในสกีมาของ WPGraphQL เพื่อให้ Next.js, Nuxt, Astro, Gatsby หรือส่วนหน้าเว็บไซต์อื่น ๆ สามารถดึงเนื้อหาของภาษาที่ถูกต้องได้ในการส่งคำขอเพียงครั้งเดียว
ก่อนที่คุณจะเริ่มต้น
ติดตั้งและเปิดใช้งานปลั๊กอินเหล่านี้:
- WPGraphQL (ปลั๊กอินโอเพนซอร์สจากโปรเจกต์ WPGraphQL)
- WPML และ WPML การแปลสตริง
- WPML GraphQL (ส่วนเสริมที่กล่าวถึงในหน้านี้)
หากคุณใช้ Advanced Custom Fields ด้วย:
- Advanced Custom Fields Multilingual (ACFML)
- WPGraphQL for Advanced Custom Fields (จากโปรเจกต์ WPGraphQL)
เนื้อหาต้นทางของคุณต้องได้รับการแปลใน WPML ก่อนที่คิวรีด้านล่างจะสามารถส่งคืนข้อมูลใด ๆ ได้ เมื่อเปิดใช้งาน แปลทุกอย่างโดยอัตโนมัติ (ค่าเริ่มต้นของ WPML 5) การแปลจะถูกสร้างขึ้นในเบื้องหลังเมื่อคุณเผยแพร่เนื้อหา สำหรับการตั้งค่าด้วยตนเอง ให้ส่งเนื้อหาเพื่อทำการแปลจาก WPML > การแปล > แดชบอร์ด โพสต์และคำศัพท์ที่แปลแล้วคือสิ่งที่คิวรี GraphQL ด้านล่างจะกรองและส่งคืน
GraphQL IDE – สถานที่สำหรับทดสอบคิวรี
WPGraphQL จะเพิ่มหน้าจอ GraphQL > GraphQL IDE ลงในหน้าจัดการเว็บไซต์ WordPress ของคุณ Query Composer ของ IDE จะแสดงรายการฟิลด์ที่มีอยู่ทั้งหมด รวมถึงอาร์กิวเมนต์ language และฟิลด์ translations ของ WPML และเรียกใช้คิวรีกับเว็บไซต์ที่ใช้งานจริงของคุณ ทดสอบคิวรีที่นั่นก่อนที่จะเชื่อมต่อเข้ากับเฟรมเวิร์กส่วนหน้าเว็บไซต์ของคุณ
การคิวรีเนื้อหาตามภาษา
เพิ่ม where: { language: "<code>" } ลงในคิวรีรายการใด ๆ เช่น โพสต์ ประเภทโพสต์แบบกำหนดเอง คำศัพท์ของอนุกรมวิธาน เมนู รายการเมนู และความคิดเห็น รหัสภาษาคือรหัสเดียวกับที่ WPML ใช้ในทุกที่ (en, es, fr, pt-pt และอื่น ๆ) ส่งผ่าน language: "all" เพื่อส่งคืนเนื้อหาจากทุกภาษาพร้อมกัน
query PostsES {
posts(where: { language: "es" }) {
nodes {
slug
uri
categories {
nodes { name }
}
}
}
}
เมื่อโหนดระดับบนสุดถูกกรองตามภาษา รายการที่เชื่อมต่อกัน (หมวดหมู่ แท็ก อนุกรมวิธานที่กำหนดเอง) จะใช้ภาษาเดียวกันโดยอัตโนมัติ คิวรีด้านบนจะส่งคืนโพสต์ในภาษาสเปนพร้อมหมวดหมู่ในภาษาสเปน โดยไม่จำเป็นต้องใช้อาร์กิวเมนต์เพิ่มเติม
การดึงข้อมูลการแปลทั้งหมดของโหนดในคิวรีเดียว
เพิ่มฟิลด์ translations ลงในคิวรีโพสต์หรืออนุกรมวิธานใด ๆ เพื่อส่งคืนเวอร์ชันภาษาอื่นของโหนดในเพย์โหลดเดียวกัน:
query PostsWithTranslations {
posts(where: { language: "en" }) {
nodes {
slug
uri
language { code }
translations {
slug
uri
language { code }
}
}
}
}
แต่ละโพสต์จะถูกส่งคืนพร้อมกับฟิลด์ภาษาอังกฤษ รวมถึงอาร์เรย์ของ slug และ URI ในภาษาอื่น ๆ นั่นคือรูปแบบที่ตัวสลับภาษาซึ่งแสดงผลอยู่ข้างเนื้อหาของหน้าใช้ ซึ่งก็คือคำขอเพียงครั้งเดียวก็จะได้ทุกทางเลือกที่ผู้เยี่ยมชมสามารถสลับไปใช้ได้
การคิวรีโพสต์เฉพาะด้วย ID หรือ slug ในภาษาใดก็ได้
หากต้องการดึงข้อมูลโพสต์ที่แปลแล้วเพียงรายการเดียวโดยตรง (ด้วย slug ที่แปลแล้วหรือด้วย ID ของฐานข้อมูล) ให้ใช้คิวรี post แบบเอกพจน์พร้อมกับ idType:
query PostBySlug {
post(id: "hola-mundo", idType: SLUG) {
title
slug
uri
language { code }
}
}
query PostById {
post(id: "2", idType: DATABASE_ID) {
title
slug
uri
language { code }
}
}
คิวรีทั้งสองจะส่งคืนโพสต์ที่แปลแล้ว (ชื่อ, slug, URI) โดยไม่ต้องมีการกรองเพิ่มเติมในส่วนหน้าเว็บไซต์
เมนูหลายภาษา
คิวรีเมนูและรายการเมนูตามภาษาด้วยอาร์กิวเมนต์ language เดียวกัน:
query NavES {
menu(language: "es", id: "primary", idType: SLUG) {
menuItems {
nodes {
label
url
path
}
}
}
}
label และ url ของแต่ละรายการเมนูจะถูกส่งคืนในภาษาที่คิวรี รายการเมนูที่ลิงก์ไปยังโพสต์ที่แปลแล้วจะแปลงเป็น URI ที่แปลแล้วโดยอัตโนมัติ การสนับสนุนนี้ถูกเพิ่มเข้ามาใน WPML GraphQL 1.1.0
ภาษาที่ติดตั้ง – สำหรับตัวสลับภาษา
สำหรับตัวสลับภาษาระดับโกลบอล (ไม่ขึ้นอยู่กับโพสต์ใดโพสต์หนึ่ง) ให้ใช้คิวรี languages และ defaultLanguage เพื่อแสดงรายการทุกภาษาบนเว็บไซต์:
query SiteLanguages {
languages {
code
country_flag_url
default_locale
native_name
translated_name
url
}
defaultLanguage {
code
native_name
}
}
ส่งคืนหนึ่งโหนดต่อภาษาที่ใช้งานอยู่พร้อมกับ URL ของธง ชื่อภาษาในภาษานั้นเอง ชื่อภาษาที่แปลแล้ว และ URL หน้าแรกของภาษา นั่นเป็นข้อมูลที่เพียงพอสำหรับการแสดงผลตัวสลับภาษาแบบธงและป้ายกำกับโดยไม่ต้องฮาร์ดโค้ดรายการภาษา
การคิวรีฟิลด์ที่กำหนดเองของ ACF ตามภาษา
เมื่อ ACFML และ WPGraphQL for ACF ทำงานอยู่ ฟิลด์ ACF ในโพสต์และประเภทโพสต์แบบกำหนดเองจะใช้ภาษาเดียวกับโพสต์หลักโดยอัตโนมัติ โดยไม่จำเป็นต้องใช้อาร์กิวเมนต์เพิ่มเติม สำหรับ ACF Options Pages ซึ่งไม่ได้ผูกติดกับโพสต์ใดโพสต์หนึ่ง ให้เพิ่มอาร์กิวเมนต์ language ลงในคิวรี Options Page:
query Settings {
myOptionPage(language: "de") {
addressFieldGroup {
addressTitle
repeaterAddressDetails { addressDetails }
}
}
}
อาร์กิวเมนต์นี้ต้องการรหัสภาษาที่ตรงกับหนึ่งในภาษาที่ใช้งานอยู่บนเว็บไซต์ของคุณ
ข้อจำกัดที่ทราบและวิธีแก้ปัญหาชั่วคราว
- ข้อมูลเมตาของผู้เขียนและผู้ใช้ จะไม่ส่งคืนค่าที่แปลแล้ว หากคุณแสดงประวัติผู้เขียนตามภาษา ให้จัดเก็บประวัติที่แปลแล้วไว้ในฟิลด์ ACF ของผู้ใช้ และคิวรีฟิลด์นั้นแทน
- URI ที่แปลแล้วในรูปแบบคิวรีบางประเภท เมื่อดึงข้อมูลโพสต์ที่แปลแล้วด้วย URI (
contentNode(id: "/de/some-slug/", idType: URI)) ให้ตรวจสอบว่า URI ที่ส่งคืนตรงกับสิ่งที่เผยแพร่ในภาษานั้นหรือไม่ เนื่องจากรูปแบบคิวรีบางประเภทอาจส่งคืนเส้นทางที่ไม่สอดคล้องกัน ทดสอบใน GraphQL IDE ก่อนที่จะเชื่อมต่อเข้ากับการกำหนดเส้นทาง - ACF Options Pages ที่ไม่มีอาร์กิวเมนต์
languageจะกลับไปใช้ภาษาเริ่มต้น ให้ส่งผ่านlanguageเสมอสำหรับคิวรี Options Page บนเว็บไซต์หลายภาษา
หากคุณพบปัญหาการทำงานร่วมกันที่ไม่ได้ระบุไว้ที่นี่ ทีมสนับสนุนของ WPML พร้อมดูแลในส่วนของ WPML สำหรับสแต็ก WPGraphQL ตลอด 24 ชั่วโมงทุกวัน
เขียนโดย Amir · อัปเดตล่าสุด 2 กรกฎาคม 2026
เขียนโดย Amir · อัปเดตล่าสุด 2 กรกฎาคม 2026