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