- Status
- Vom Autor gelöst
- Gelöst in
- WooCommerce Product Options 2.6.0
- Zugehöriges Plugin/Theme
- WooCommerce Product Options
- Themen-Tags
- Compatibility, WCML
Übersicht über das Problem
Bei der Verwendung von WooCommerce Product Options von Barn2 mit WPML werden Produktoptions-Strings im Warenkorb, an der Kasse und im Mini-Warenkorb unübersetzt angezeigt, obwohl sie auf der Produktseite korrekt übersetzt sind.
Problemumgehung
Bitte stellen Sie sicher, dass Sie über ein vollständiges Website-Backup Ihrer Website verfügen, bevor Sie fortfahren.
- Fügen Sie den folgenden Code in die Datei functions.php Ihres Themes ein:
/** * 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; } - Hinweis: Wenn Sie die Sprache ändern, nachdem Sie Produkte in Ihren Warenkorb gelegt haben, werden die Beschriftungen nicht „übersetzt“: Sie bleiben in der Sprache, die aktiv war, als das Produkt hinzugefügt wurde (genau wie alle anderen Metadaten, die feste Texte speichern). Es kommt jedoch selten vor, dass die Sprache in diesem Stadium gewechselt wird. Eine dauerhafte Lösung wird in Kürze von Barn2 bereitgestellt, bitte entfernen Sie die hinzugefügte Problemumgehung, sobald diese veröffentlicht wird.