Search code examples
jquerywoocommerceproduct-variations

Change WooCommerce Product Name Include Color When Attribute Selected


I'm looking for someone me help getting the WooCommerce variable product title to change based on color. In this specific case I would like the title to change when a color is selected, like "Product name - Black".

I follow this topic Change WooCommerce variable product title based on variation but it not work with WooCommerce version 3.9.1

and the code

add_filter( 'wp_footer','custom_product_title_script' );
function custom_product_title_script(){
    global $post;

    // Only single product pages
    if( ! is_product() ) return;

    // get an instance of the WC_Product Object
    $product = wc_get_product($post->ID);

    // Only for variable products
    if( ! $product->is_type( 'variable' ) ) return;

    // Here set your specific product attributes in this array (coma separated):
    $attributes = array('pa_color');

    // The 1st loop for variations IDs
    foreach($product->get_visible_children( ) as $variation_id ) {

        // The 2nd loop for attribute(s)/value
        foreach($product->get_available_variation( $variation_id )['attributes'] as $key => $value_id ){
            $taxonomy = str_replace( 'attribute_', '', $key ); // Get the taxonomy of the product attribute

            // Just for defined attributes
            if( in_array( $taxonomy, $attributes) ){
                // Set and structure data in an array( variation ID => product attribute => term name )
                $data[ $variation_id ][$taxonomy] = get_term_by( 'slug', $value_id, $taxonomy )->name;
            }
        }
    }

    ?>
        <script type="text/javascript">
            (function($){
                // variables initialization
                var variationsData = <?php echo json_encode($data); ?>,
                    productTitle = $('.product_title').text(),
                    color = 'pa_color';
                console.log(variationsData);

                // function that get the selected variation and change title
                function update_the_title( productTitle, variationsData, color ){
                    $.each( variationsData, function( index, value ){
                        if( index == $('input.variation_id').val() ){
                            $('.product_title').text(productTitle+' - '+value[color]);
                            console.log('TITLE UPDATED');
                            return false;
                        } else {
                            $('.product_title').text(productTitle);
                        }
                    });
                }

                // Once all loaded
                setTimeout(function(){
                    update_the_title( productTitle, variationsData, color );
                }, 300);

                // On live event: select fields
                $('select').blur( function(){
                    update_the_title( productTitle, variationsData, color );
                });
            })(jQuery);
        </script>
    <?php
}

Solution

  • I try new code and it work with new version 3.9.2

    add_filter( 'wp_footer','custom_product_title_script' );
    
    function custom_product_title_script(){
        global $post;
    
        // Only single product pages
        if( ! is_product() ) return;
    
        // get an instance of the WC_Product Object
        $product = wc_get_product($post->ID);
    
        // Only for variable products
        if( ! $product->is_type( 'variable' ) ) return;
    
        // Here set your specific product attributes in this array (coma separated):
        $attributes = array('pa_colour');
    
        // The 1st loop for variations IDs
        foreach( $product->get_visible_children() as $variation_id ) {
    
            // The 2nd loop for attribute(s)/value
            foreach($product->get_available_variation( $variation_id )['attributes'] as $key => $value_id ){
                $taxonomy = str_replace( 'attribute_', '', $key ); // Get the taxonomy of the product attribute
    
                // Just for defined attributes
                if( in_array( $taxonomy, $attributes) ){
                    // Set and structure data in an array( variation ID => product attribute => term name )
                    $data[ $variation_id ][$taxonomy] = get_term_by( 'slug', $value_id, $taxonomy )->name;
                }
            }
        }
    
    
    
        ?>
            <script type="text/javascript">
                (function($){
                    // variables initialization
                    var variationsData = <?php echo json_encode($data); ?>,
                        productTitle = $('.product_title').text(),
                        color = 'pa_colour';
                    console.log(variationsData);
    
                    // function that get the selected variation and change title
                    function update_the_title( productTitle, variationsData, color ){
                        $.each( variationsData, function( index, value ){
                            if( index == $('input.variation_id').val() ){
                                $('.product_title').text(productTitle+' - '+value[color]);
                                console.log('TITLE UPDATED');
                                return false;
                            } else {
                                $('.product_title').text(productTitle);
                            }
                        });
                    }
    
                    // Once all loaded
                    setTimeout(function(){
                        update_the_title( productTitle, variationsData, color );
                    }, 300);
    
                    // On live event: select fields
                    // $('select').blur( function(){
                    //     update_the_title( productTitle, variationsData, color );
                    // });
    
                    $('#pa_colour').on('change', function(){
                       // update_the_title( productTitle, variationsData, color );
                        setTimeout(function(){
                          update_the_title( productTitle, variationsData, color );
                        }, 300);
                    });
    
                })(jQuery);
            </script>
        <?php
    }