WPML
do_action( 'wpml_switch_language', string|null $language_code )
Loại
action
Phiên bản WPML
3.2.2

Miêu tả

Action hook này thiết lập ngôn ngữ mà WPML sử dụng để lọc các truy vấn cơ sở dữ liệu. Nó hoạt động như một phạm vi: một mã ngôn ngữ mở phạm vi, và null đóng nó lại.

Các lệnh chuyển đổi lồng nhau. Kể từ WPML 5.0, WPML giữ các lệnh chuyển đổi đang mở trên một ngăn xếp. Mỗi lệnh gọi với một mã ngôn ngữ sẽ mở ra một phạm vi mới. Lệnh gọi với null sẽ đóng phạm vi cuối cùng vẫn đang mở, và trả ngôn ngữ về cho mã xung quanh bạn. Vì vậy, null khôi phục ngôn ngữ của chính lệnh chuyển đổi của bạn, chứ không phải ngôn ngữ mà yêu cầu đã bắt đầu. Hai ngôn ngữ này chỉ giống nhau khi lệnh chuyển đổi của bạn là lệnh duy nhất đang mở. Khi không có phạm vi nào đang mở, WPML sẽ quay trở lại ngôn ngữ mà yêu cầu đã có trước lệnh chuyển đổi đầu tiên.

Mỗi lệnh chuyển đổi cần lệnh khôi phục của riêng nó. Ghép nối mỗi lệnh gọi mở một phạm vi với một lệnh gọi truyền null. Đặt lệnh khôi phục vào một khối finally, để nó cũng chạy khi mã của bạn ném ra một ngoại lệ. Nếu bạn để một phạm vi mở, phần còn lại của yêu cầu sẽ chạy bằng ngôn ngữ của bạn, và WPML tiếp tục báo cáo rằng ngôn ngữ đã được chuyển đổi.

Đừng khôi phục bằng cách chỉ định ngôn ngữ ban đầu của bạn. Một mã ngôn ngữ luôn mở ra một phạm vi. WPML không bao giờ đọc nó như một lệnh khôi phục. Một lệnh gọi như do_action( 'wpml_switch_language', $previous_language ) sẽ mở ra một phạm vi thứ hai thay vì đóng phạm vi đầu tiên. Điều này rất khó nhận ra, vì ngôn ngữ hiện tại là chính xác ngay sau cặp lệnh đó. Vấn đề xuất hiện muộn hơn trong yêu cầu: phạm vi mà bạn để mở bị đóng bởi lệnh khôi phục tiếp theo xung quanh bạn, và mã đó sau đó sẽ chạy bằng ngôn ngữ sai. Email, phản hồi REST và các màn hình trang quản trị là những nơi nó thường hiển thị. Mô hình này đã đúng trong WPML 4.x, phiên bản sử dụng một vị trí dùng chung thay vì một ngăn xếp. Nếu plugin của bạn vẫn sử dụng nó, hãy xem Khôi phục ngôn ngữ bằng tên khiến WPML bị chuyển đổi.

Thay đổi từng truy vấn một. Chạy truy vấn của bạn giữa lệnh chuyển đổi và lệnh khôi phục. Đừng chuyển đổi ngôn ngữ trong pre_get_posts: callback đó kết thúc trước khi truy vấn chạy, vì vậy bạn không có nơi nào để đóng phạm vi.

Đối số

$language_code
(string|null) (Tùy chọn) Ngôn ngữ cần chuyển sang. Sử dụng mã gồm 2 chữ cái (hoặc dài hơn) của một ngôn ngữ đang hoạt động, hoặc “all” để truy vấn nội dung từ tất cả các ngôn ngữ đang hoạt động. Mỗi mã ngôn ngữ sẽ mở ra một phạm vi ngôn ngữ mới. Truyền null để đóng phạm vi mà lệnh chuyển đổi của bạn đã mở. Mặc định là null

Chỉ null mới đóng một phạm vi. Một chuỗi rỗng, false0 sẽ mở một phạm vi, giống như bất kỳ giá trị nào khác. Chúng không thay đổi ngôn ngữ, vì vậy không có gì trông có vẻ sai tại thời điểm đó, nhưng phạm vi vẫn mở. Hãy kiểm tra để đảm bảo mã ngôn ngữ của bạn không bị trống trước khi truyền vào.

Ví dụ sử dụng

Ví dụ
Mở một phạm vi ngôn ngữ, chạy công việc của bạn bên trong nó và đóng phạm vi đó trong một khối finally. Khối finally cũng chạy khi mã của bạn ném ra một ngoại lệ.
// Get the 5 latest German posts, then give the language back.
do_action( 'wpml_switch_language', 'de' );

try {
	$german_posts = new WP_Query( array(
		'post_type'      => 'post',
		'posts_per_page' => 5,
	) );
} finally {
	// Closes the scope that the call above opened.
	do_action( 'wpml_switch_language', null );
}

Không khôi phục bằng cách gọi tên ngôn ngữ


Mẫu này đã đúng trong WPML 4.x. Kể từ WPML 5.0, đây là một lỗi: lệnh gọi thứ hai sẽ mở một phạm vi thứ hai thay vì đóng phạm vi đầu tiên.
$current = apply_filters( 'wpml_current_language', null );

do_action( 'wpml_switch_language', 'de' );
// ...
do_action( 'wpml_switch_language', $current ); // Wrong: this opens a new scope.

wpml_post_language_details, wpml_switch_language_for_email, wpml_restore_language_from_email, wpml_element_language_code, wpml_element_language_details

Tất cả 6 hook Truy xuất thông tin ngôn ngữ cho nội dung →