WPML
Statut
Résolu par l’auteur
Résolu dans
WooCommerce Product Options 2.6.0
Extension/thème associé
WooCommerce Product Options
Étiquettes de sujet
Compatibility, WCML

Aperçu de l’anomalie

Lors de l’utilisation de WooCommerce Product Options de Barn2 avec WPML, les chaînes de texte des options du produit apparaissent comme non traduites dans le panier, à la validation de commande et dans le mini-panier, même si elles sont correctement traduites sur la page du produit.

Solution de contournement

Assurez-vous de disposer d’une sauvegarde complète de votre site avant de continuer.


  • Dans le fichier functions.php de votre thème, collez le code suivant :
    /**
     * 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;
    }
    
       


  • Remarque : Si vous changez de langue après avoir ajouté des produits à votre panier, les étiquettes ne seront pas « traduites » : elles resteront dans la langue qui était active au moment où le produit a été ajouté (tout comme n’importe quelles autres métadonnées qui stockent des textes fixes). Cependant, il est rare de changer de langue à ce stade. Un correctif permanent sera bientôt appliqué par Barn2. Veuillez supprimer la solution de contournement ajoutée lorsqu’il sera déployé.

Toutes les anomalies connues →