WPML
do_action( 'wpml_switch_language', string|null $language_code )
סוג
action
גרסת WPML
3.2.2

תיאור

הוק פעולה זה מגדיר את השפה שבה WPML משתמש כדי לסנן שאילתות מסד נתונים. הוא פועל כתחום (scope): קוד שפה פותח את התחום, ו־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: ה־callback הזה מסתיים לפני שהשאילתה רצה, ולכן אין לך מקום לסגור את התחום.

ארגומנטים

$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 ההוקים בקטגוריה אחזור מידע שפה עבור תוכן →