- Estado
- Resuelto por el autor
- Resuelto en
- WooCommerce Product Options 2.6.0
- Plugin/tema relacionado
- WooCommerce Product Options
- Etiquetas de temática
- Compatibility, WCML
Resumen del problema
Al usar WooCommerce Product Options de Barn2 con WPML, las cadenas de las opciones del producto aparecen sin traducir en el carrito, en la página de finalizar compra y en el minicarrito, aunque estén correctamente traducidas en la página del producto.
Solución alternativa
Por favor, asegúrese de tener una copia de seguridad completa de su sitio antes de continuar.
- En el archivo functions.php de su tema, pegue el siguiente código:
/** * 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; } - Nota: Si cambia de idioma después de tener productos en su carrito, las etiquetas no se «traducirán»: permanecerán en el idioma que estaba activo cuando se añadió el producto (al igual que cualquier otro metadato que almacena textos fijos). Pero es poco común cambiar de idioma en esa etapa. Barn2 aplicará pronto una solución permanente, por favor, elimine la solución alternativa añadida cuando se implemente.