- الحالة
- محلولة بواسطة المطور
- تم حلها في
- WooCommerce Product Options 2.6.0
- الإضافة/القالب ذو الصلة
- WooCommerce Product Options
- وسوم الموضوع
- Compatibility, WCML
نظرة عامة على المشكلة
عند استخدام WooCommerce Product Options من Barn2 مع WPML، تظهر السلاسل النصية لخيارات المنتج غير مترجمة في سلة التسوق، وإتمام الشراء، وسلة التسوق المصغرة، على الرغم من أنها مترجمة بشكل صحيح في صفحة المنتج.
حل بديل مؤقت
يُرجى التأكد من أخذ نسخة احتياطية كاملة لموقعك قبل المتابعة.
- في ملف functions.php الخاص بقالبك، الصق الكود التالي:
/** * Translate WooCommerce Product Options texts when adding to cart * using the plugin's own WPML integration. */ add_filter( 'woocommerce_add_cart_item_data', 'my_wpo_translate_cart_meta_with_wpml', 20, 4 ); function my_wpo_translate_cart_meta_with_wpml( $cart_item_data, $product_id, $variation_id, $quantity ) { // If there are no WPO options in this cart item, do nothing. if ( empty( $cart_item_data['wpo_options'] ) ) { return $cart_item_data; } // Make sure the plugin classes exist (plugin is active and loaded). if ( ! class_exists( 'Barn2PluginWC_Product_OptionsPlugin_Factory' ) || ! class_exists( 'Barn2PluginWC_Product_OptionsIntegrationWPML' ) || ! class_exists( 'Barn2PluginWC_Product_OptionsModelOption' ) ) { return $cart_item_data; } // Get the plugin instance and the WPML integration helper. $plugin = Barn2PluginWC_Product_OptionsPlugin_Factory::create( '', '' ); $wpml_integration = new Barn2PluginWC_Product_OptionsIntegrationWPML( $plugin ); foreach ( $cart_item_data['wpo_options'] as $option_id => &$option_data ) { // Load the option model so we can access the original data. $option = Barn2PluginWC_Product_OptionsModelOption::find( $option_data['option_id'] ?? 0 ); if ( ! $option ) { continue; } // 1) Translate the option name (the "key" shown in cart/checkout). $translated_name = $wpml_integration->translate_string( $option->name, $option, 'option_name' ); $option_data['name'] = $translated_name; // 2) Translate each choice label, if any. if ( empty( $option_data['choice_data'] ) || empty( $option->choices ) ) { continue; } // Build a map: choice_id => index, to reproduce the same index WPML uses. $index_by_id = []; foreach ( $option->choices as $idx => $choice ) { if ( isset( $choice['id'] ) ) { $index_by_id[ $choice['id'] ] = $idx; } } // Normalize the stored value to an array (covers both single and multi). $values = is_array( $option_data['value'] ) ? $option_data['value'] : [ $option_data['value'] ]; foreach ( $option_data['choice_data'] as $i => &$choice_data ) { if ( ! isset( $choice_data['label'] ) ) { continue; } // For free-text fields, there are usually no predefined choices to translate. if ( empty( $index_by_id ) ) { continue; } $value_for_this_choice = $values[ $i ] ?? null; if ( ! isset( $index_by_id[ $value_for_this_choice ] ) ) { continue; } $choice_index = $index_by_id[ $value_for_this_choice ]; $original_label = $option->choices[ $choice_index ]['label']; // Translate the choice label using the same context and index as when registered. $choice_data['label'] = $wpml_integration->translate_string( $original_label, $option, 'choice_label', $choice_index ); } } return $cart_item_data; } - ملاحظة: إذا غيّرت اللغة بعد إضافة منتجات إلى سلة التسوق، فلن تكون التسميات «مترجمة»: بل ستبقى باللغة التي كانت نشطة عند إضافة المنتج (تماماً مثل أي بيانات وصفية أخرى تخزن نصوصاً ثابتة). لكن من النادر تبديل اللغات في هذه المرحلة. سيُطبّق Barn2 إصلاحاً دائماً قريباً، يُرجى إزالة الحل البديل المؤقت المُضاف عند نشره