WPML
do_action( 'wpml_switch_language', string|null $language_code )
ประเภท
action
เวอร์ชันของ WPML
3.2.2

คำอธิบาย

แอ็กชันฮุกนี้จะตั้งค่าภาษาที่ WPML ใช้เพื่อกรองคิวรีฐานข้อมูล โดยจะทำงานเป็นขอบเขต: รหัสภาษาจะเปิดขอบเขต และ null จะปิดขอบเขตนั้น

การสลับสามารถซ้อนกันได้ ตั้งแต่ WPML 5.0 เป็นต้นมา WPML จะเก็บการสลับที่เปิดอยู่ไว้ในสแต็ก ทุกการเรียกใช้ด้วยรหัสภาษาจะเปิดขอบเขตใหม่ การเรียกใช้ด้วย null จะปิดขอบเขตล่าสุดที่ยังคงเปิดอยู่ และคืนค่าภาษากลับไปยังโค้ดที่อยู่รอบๆ ดังนั้น null จะคืนค่าภาษาของการสลับของคุณเอง ไม่ใช่ภาษาที่คำขอเริ่มต้นขึ้น ทั้งสองอย่างนี้จะเหมือนกันก็ต่อเมื่อการสลับของคุณเป็นการสลับเดียวที่เปิดอยู่ เมื่อไม่มีขอบเขตเปิดอยู่ WPML จะกลับไปใช้ภาษาที่คำขอมีอยู่ก่อนการสลับครั้งแรก

ทุกการสลับต้องมีการคืนค่าของตัวเอง จับคู่การเรียกใช้แต่ละครั้งที่เปิดขอบเขตกับการเรียกใช้หนึ่งครั้งที่ส่งผ่าน null ใส่การคืนค่าไว้ในบล็อก finally เพื่อให้โค้ดยังคงทำงานเมื่อเกิดข้อยกเว้นขึ้น หากคุณปล่อยขอบเขตเปิดทิ้งไว้ ส่วนที่เหลือของคำขอจะทำงานในภาษาของคุณ และ WPML จะยังคงรายงานว่ามีการสลับภาษา

อย่าคืนค่าด้วยการระบุชื่อภาษาเดิม รหัสภาษาจะเปิดขอบเขตเสมอ WPML จะไม่อ่านค่าดังกล่าวเป็นการคืนค่า การเรียกใช้เช่น do_action( 'wpml_switch_language', $previous_language ) จะเปิดขอบเขตที่สองแทนที่จะปิดขอบเขตแรก ปัญหานี้สังเกตได้ยาก เนื่องจากภาษาปัจจุบันจะถูกต้องทันทีหลังจากการจับคู่นั้น ปัญหาจะปรากฏขึ้นในภายหลังในคำขอนั้น: ขอบเขตที่คุณปล่อยเปิดทิ้งไว้จะถูกปิดโดยการคืนค่าครั้งถัดไปที่อยู่รอบๆ และโค้ดนั้นจะทำงานในภาษาที่ไม่ถูกต้อง อีเมล การตอบกลับ REST และหน้าจัดการเว็บไซต์คือจุดที่มักจะแสดงปัญหานี้ให้เห็น รูปแบบนี้เคยถูกต้องใน WPML 4.x ซึ่งใช้สล็อตที่ใช้ร่วมกันหนึ่งช่องแทนที่จะเป็นสแต็ก หากปลั๊กอินของคุณยังคงใช้รูปแบบนี้ โปรดดูที่ การคืนค่าภาษาด้วยชื่อจะทำให้ WPML ยังคงถูกสลับอยู่

เปลี่ยนคิวรีทีละรายการ เรียกใช้คิวรีของคุณระหว่างการสลับและการคืนค่า อย่าสลับภาษาใน pre_get_posts: เนื่องจากคอลแบ็กนั้นจะสิ้นสุดลงก่อนที่คิวรีจะทำงาน ดังนั้นคุณจะไม่มีที่สำหรับปิดขอบเขต

อาร์กิวเมนต์

$language_code
(string|null) (ระบุหรือไม่ก็ได้) ภาษาที่ต้องการสลับไป ใช้รหัส 2 ตัวอักษร (หรือยาวกว่า) ของภาษาที่ใช้งานอยู่ หรือ ‘all’ เพื่อคิวรีเนื้อหาจากทุกภาษาที่ใช้งานอยู่ รหัสภาษาทุกตัวจะเปิดขอบเขตภาษาใหม่ ส่งค่า null เพื่อปิดขอบเขตที่การสลับของคุณเปิดไว้ ค่าเริ่มต้นคือ null

มีเพียง null เท่านั้นที่ปิดขอบเขตได้ สตริงว่าง false และ 0 จะเปิดขอบเขตใหม่เช่นเดียวกับค่าอื่น ๆ ค่าเหล่านี้ไม่ได้เปลี่ยนภาษา ดังนั้นจึงดูเหมือนไม่มีอะไรผิดปกติในจุดนั้น แต่ขอบเขตจะยังคงเปิดอยู่ ตรวจสอบว่ารหัสภาษาของคุณไม่ว่างเปล่าก่อนที่คุณจะส่งค่า

ตัวอย่างการใช้งาน

ตัวอย่าง
เปิดขอบเขตภาษา สั่งรันงานของคุณภายในนั้น และปิดขอบเขตในบล็อก finally บล็อก finally จะทำงานด้วยเช่นกันเมื่อโค้ดของคุณส่งข้อยกเว้น
// 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 );
}

อย่าคืนค่าโดยการระบุชื่อภาษา


รูปแบบนี้เคยถูกต้องใน WPML 4.x แต่ตั้งแต่ WPML 5.0 ถือเป็นข้อบกพร่อง: การเรียกครั้งที่สองจะเปิดขอบเขตที่สองแทนที่จะปิดขอบเขตแรก
$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

ฮุก การดึงข้อมูลภาษาสำหรับเนื้อหา ทั้งหมด 6 รายการ →