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
(سلسلة نصية|null) (اختياري) اللغة المراد التبديل إليها. استخدم الرمز المكون من حرفين (أو أكثر) للغة نشطة، أو ‘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 →