Truy vấn nội dung theo ngôn ngữ từ giao diện người dùng của bạn
Mọi truy vấn WPGraphQL đều có thêm một đối số language. Lọc các bài viết, loại nội dung tùy chỉnh, thuật ngữ phân loại, menu, mục menu và bình luận theo ngôn ngữ trong một trường duy nhất – không cần lọc sau truy vấn trên giao diện người dùng, không làm tăng gấp đôi khối lượng yêu cầu, không cần đoán ngôn ngữ.
query PostsES {
posts(where: { language: "es" }) {
nodes { slug uri title }
}
}
Khi bạn lọc một node cấp cao nhất theo ngôn ngữ, các mục được kết nối (chuyên mục, thẻ, phân loại tùy chỉnh) sẽ tự động tuân theo cùng một ngôn ngữ. Kết quả nhất quán mà không cần thêm đối số cho mỗi trường lồng nhau.
Bạn muốn lấy mọi thứ bất kể ngôn ngữ cho một sitemap hoặc tổng số lượng? Hãy truyền language: "all".
Lấy mọi bản dịch của một node trong một truy vấn
Trường translations trên các bài viết và thuật ngữ phân loại trả về mọi phiên bản ngôn ngữ khác của một node: slug, URI, mã ngôn ngữ và bất kỳ trường lồng nhau nào bạn yêu cầu. Một truy vấn, một lượt gửi nhận, mọi phiên bản ngôn ngữ của một trang.
Đó là dữ liệu bạn cần cho một bộ chuyển đổi ngôn ngữ được hiển thị ngay bên cạnh nội dung trang, mà không cần buộc giao diện người dùng phải theo dõi một chuỗi các truy vấn liên quan.
Menu, phân loại, bình luận đa ngôn ngữ và dữ liệu ngôn ngữ
Ngoài các bài viết, WPML GraphQL mở rộng đối số language tương tự và khả năng xử lý bản dịch cho:
- Menu và mục menu.
menus(where: { language: "fr" })vàmenuItems(where: { language: "fr" })cho điều hướng theo từng ngôn ngữ. - Thuật ngữ phân loại. Các chuyên mục, thẻ và phân loại tùy chỉnh tuân theo ngôn ngữ của bài viết theo mặc định và có thể được truy vấn trực tiếp theo từng ngôn ngữ.
- Bình luận. Trả về các bình luận liên kết với bài viết bằng một ngôn ngữ cụ thể.
- Các truy vấn
languagesvàdefaultLanguage. Liệt kê mọi ngôn ngữ đã cài đặt trên trang web cùng với mã, locale, tên bản địa, URL cờ quốc gia và URL trang chủ. Cấu trúc dữ liệu phù hợp cho một bộ chuyển đổi ngôn ngữ tùy chỉnh.
Truy vấn một bài viết cụ thể theo ID hoặc slug, bằng bất kỳ ngôn ngữ nào
Hai dạng truy vấn giúp lấy một bài viết đã dịch thông qua định danh theo ngôn ngữ cụ thể của nó:
query PostBySlug {
post(id: "hola-mundo", idType: SLUG) {
title slug uri
}
}
query PostById {
post(id: "2", idType: DATABASE_ID) {
title slug uri
}
}
Cả hai dạng đều trả về bài viết đã dịch cùng với tiêu đề, slug và URI đã dịch của nó – mà không cần logic “đây có phải là bản dịch không?” riêng biệt trên giao diện người dùng.
Được bảo trì theo phiên bản phát hành WPGraphQL hiện tại
Chúng tôi đã thử nghiệm WPML GraphQL 5.2.0 với WPGraphQL 2.24.1 và WPGraphQL for ACF 3.0.0. Nhóm bảo trì WPGraphQL làm việc cùng chúng tôi để lớp đa ngôn ngữ luôn đồng bộ với schema. Khi WPGraphQL tung ra một phiên bản phát hành mới, WPML GraphQL sẽ cập nhật ngay sau đó.
Hoạt động với ACF khi bạn thêm ACFML và WPGraphQL for ACF
Nhiều trang web headless xây dựng mô hình nội dung của họ trong Advanced Custom Fields và hiển thị nó thông qua WPGraphQL. Thêm ACFML cùng WPGraphQL for ACF, và dữ liệu ACF của bạn sẽ tuân theo các quy tắc ngôn ngữ tương tự như phần còn lại của schema.
Truy vấn trang tùy chọn ACF bằng bất kỳ ngôn ngữ nào
Các trang tùy chọn nằm ngoài bất kỳ bài viết nào, vì vậy chúng nhận một đối số language của riêng mình. Các trường phụ bên trong trường lặp (repeater) và nội dung linh hoạt cũng được trả về bằng ngôn ngữ đó. Truy vấn bên dưới đọc trường lặp offices và trường nội dung linh hoạt promos. Kể từ WPGraphQL for ACF 3.0.0, một trang tùy chọn chỉ có trong schema khi bạn bật show_in_graphql cho nó.
query StoreSettingsES {
storeSettings(language: "es") {
storeContact {
heading
offices { city openingHours }
promos {
... on StoreContactPromosBannerLayout { bannerText }
}
}
}
}
Các trường quan hệ trả về bài viết đã dịch
Các trường ACF trên bài viết và loại nội dung tùy chỉnh không nhận đối số language của riêng chúng. Chúng tuân theo ngôn ngữ của yêu cầu. Trong truy vấn bên dưới, where: { language: "es" } thiết lập ngôn ngữ đó cho toàn bộ truy vấn.
Một trường quan hệ được đặt thành Sao chép đã chứa các ID đã dịch. Khi WPML sao chép trường sang bản dịch, ACFML sẽ hoán đổi từng ID bằng bản dịch của nó. Nó giữ nguyên ID gốc khi bản dịch chưa tồn tại. Bạn thiết lập tùy chọn này cho từng trường trong trình chỉnh sửa nhóm trường ACF, bên dưới phần Tùy chọn dịch thuật. Xem Trường quan hệ trong hướng dẫn của chúng tôi về cách dịch các trường tùy chỉnh ACF.
query BlendsES {
posts(where: { language: "es" }) {
nodes {
title
postExtras {
relatedGuide {
nodes { ... on Post { title languageCode } }
}
}
}
}
}
Bài viết tiếng Tây Ban Nha trả về hướng dẫn tiếng Tây Ban Nha.
Hãy thiết lập ngôn ngữ trên mọi yêu cầu. Một truy vấn đọc một bài viết theo ID hoặc slug không mang theo bộ lọc language. Sau đó, nó chạy bằng ngôn ngữ mặc định và các bài viết liên quan cũng được trả về bằng ngôn ngữ mặc định.
Cách bạn thiết lập ngôn ngữ phụ thuộc vào định dạng URL WPML của bạn. Với một tên miền cho mỗi ngôn ngữ, hãy gọi endpoint của ngôn ngữ đó: https://es.example.com/graphql. Với tham số ngôn ngữ, hãy thêm nó vào endpoint: /graphql?lang=es. Định dạng thư mục không có endpoint riêng cho từng ngôn ngữ, vì vậy hãy lọc theo ngôn ngữ bên trong truy vấn.
Khi thiếu bản dịch
WPML không tự động lùi về ngôn ngữ mặc định. Nếu một bài viết liên quan không có bản dịch bằng ngôn ngữ của yêu cầu, nó sẽ bị loại khỏi kết quả:
{
"data": {
"posts": {
"nodes": [
{
"title": "Nuestras mezclas de la casa",
"postExtras": {
"relatedGuide": {
"nodes": [
{ "title": "Guía de compra de espresso", "languageCode": "es" }
]
}
}
}
]
}
}
}
Trường này trỏ tới hai hướng dẫn. Chỉ có một hướng dẫn được dịch sang tiếng Tây Ban Nha, vì vậy truy vấn tiếng Tây Ban Nha trả về một. Giao diện người dùng của bạn nhận được một danh sách ngắn hơn, không bao giờ là một hỗn hợp các ngôn ngữ. Hãy dịch bài viết còn thiếu và nó sẽ xuất hiện trong cùng một truy vấn.
Danh sách sẽ giữ nguyên một ngôn ngữ khi loại bài viết có thể dịch. Nếu bạn đặt loại bài viết thành Hiển thị như đã dịch, WPML sẽ trả về hướng dẫn chưa dịch bằng ngôn ngữ mặc định. Khi đó, danh sách sẽ trộn lẫn các ngôn ngữ.