- סטטוס
- נפתר
- סוג
- לא יתוקן
- דווח עבור
- WPML Multilingual CMS 5.0
- תגיות נושא
- Compatibility
סקירה כללית של התקלה
החל מ־WPML 5.0, החלפות שפה מקוננות. כל קוד שפה פותח תחום חדש, ורק null סוגר אותו.
תוספים שנכתבו עבור WPML 4.x לעיתים קרובות מבצעים החלפה בחזרה על ידי ציון השפה שהם שמרו:
$current = apply_filters( 'wpml_current_language', null ); do_action( 'wpml_switch_language', 'de' ); // ... do_action( 'wpml_switch_language', $current ); // Meant as "and back".
WPML 4.x אפשר זאת. הוא שמר משבצת שפה אחת, כך שהשפה הנוכחית הייתה נכונה בסופו של דבר וההחלפה הלא מאוזנת נותרה נסתרת. זו מעולם לא הייתה דרך נכונה לסגור החלפה. WPML 5.0 כבר אינו מכיל זאת: הקריאה האחרונה פותחת תחום שני במקום לסגור את הראשון, ו־WPML ממשיך לדווח שהשפה מוחלפת.
WPML אינו יכול לזהות זאת, מכיוון שאותה קריאה היא גם החלפה תקינה לשפה שממנה הגיע הקוד הסובב.
התסמין מופיע בשלב מאוחר יותר. מיד לאחר הצמד השפה הנוכחית נכונה, כך שבדיקה שבודקת רק זאת עוברת בהצלחה. השחזור התקין הבא סביבך סוגר אז את התחום הפתוח שלך במקום את שלו, והקוד הזה רץ בשפה הלא נכונה. הודעות דוא”ל, תגובות REST ומסכי אזור הניהול הם המקומות שבהם זה בא לידי ביטוי.
החלפה ללא שחזור, או עם קוד שפה ריק, משאירה תחום פתוח באותו אופן.
פתרון עוקף
סגור כל טווח באמצעות null, בתוך בלוק finally:
do_action( 'wpml_switch_language', 'de' );
try {
// ...your work in German...
} finally {
do_action( 'wpml_switch_language', null ); // Closes the scope above.
}
תמיכה ב־WPML 4.x וב־5.0 בגרסה אחת
העתק פונקציות עזר אלו ושנה את הקידומת:
// Opens a scope. Returns the value for the close helper, or false if none opened.
function myplugin_wpml_open_language_switch( $language_code ) {
// '', false and 0 open a scope without changing the language. Only null closes one.
if ( ! $language_code ) {
return false;
}
$previous = apply_filters( 'wpml_current_language', '' );
do_action( 'wpml_switch_language', $language_code );
return $previous;
}
// Closes the scope the open helper opened. WPML 4.x has no stack: there null
// means "the language before the FIRST switch", so restore by name.
function myplugin_wpml_close_language_switch( $previous ) {
if ( ! $previous ) {
return;
}
$has_stack = defined( 'ICL_SITEPRESS_VERSION' )
&& version_compare( ICL_SITEPRESS_VERSION, '5.0', '>=' );
do_action( 'wpml_switch_language', $has_stack ? null : $previous );
}
לאחר מכן כל מיקום קריאה ייראה כך:
$previous = myplugin_wpml_open_language_switch( 'de' );
try {
// ... work ...
} finally {
myplugin_wpml_close_language_switch( $previous );
}
הפעל grep -rn "wpml_switch_language" . כדי למצוא כל מיקום קריאה. כל אחד מהם דורש סגירה תואמת. לעולם אל תשחזר לפי שם השפה, ולעולם אל תבצע החלפה על קוד שיכול להיות ריק.
גם ההוקים של האימייל מקוננים: קרא ל־wpml_restore_language_from_email פעם אחת עבור כל wpml_switch_language_for_email.