title: Converting Woo Commerce dropdowns into Radio Buttons
body: <p>I'm having trouble converting the variation dropdowns into radio buttons a woocommerce enabled site.  I've tried the answer found <a href="https://stackoverflow.com/questions/11819604/dropdown-converted-to-radio-buttons-no-longer-triggering-specific-function">here</a> but I can't seem to make this solution work. I've also tried editing the code in the variable.php file.</p>
  
  <p>So far the most success is the second approach, editing the variable.php code and changing the  tags to  tags. The problem is the natural jQuery event isn't triggered when the radio buttons are clicked.</p>
  
  <p>If any of you know a simpler way to convert the dropdowns to radios, or simply make the jQuery event fire, it'd be much appreciated.</p>
  
  <p>Relevant code I could get my hands on:</p>
  
  <pre><code>&lt;?php $loop = 0; foreach ( $attributes as $name =&gt; $options ) : $loop++; ?&gt;
  
  &lt;tr&gt;
  
  &lt;td class="label"&gt;&lt;label for="&lt;?php echo sanitize_title($name); ?&gt;"&gt;&lt;?php echo $woocommerce-&gt;attribute_label($name); ?&gt;&lt;/label&gt;&lt;/td&gt;
  
  &lt;td class="value"&gt;&lt;select id="&lt;?php echo esc_attr( sanitize_title($name) ); ?&gt;" name="attribute_&lt;?php echo sanitize_title($name); ?&gt;"&gt;
  
  &lt;option value=""&gt;&lt;?php echo __('Choose an option', 'woocommerce') ?&gt;&amp;hellip;&lt;/option&gt;
  
  &lt;?php 
  
      if ( is_array( $options ) ) {
  
          if ( empty( $_POST ) )
  
              $selected_value = ( isset( $selected_attributes[ sanitize_title( $name ) ] ) ) ? $selected_attributes[ sanitize_title( $name ) ] : '';
  
          else
  
              $selected_value = isset( $_POST[ 'attribute_' . sanitize_title( $name ) ] ) ? $_POST[ 'attribute_' . sanitize_title( $name ) ] : '';
  
          // Get terms if this is a taxonomy - ordered
  
          if ( taxonomy_exists( sanitize_title( $name ) ) ) {
  
              $terms = get_terms( sanitize_title($name), array('menu_order' =&gt; 'ASC') );
  
              foreach ( $terms as $term ) {
  
                  if ( ! in_array( $term-&gt;slug, $options ) ) continue;
  
                  echo '&lt;option value="' . $term-&gt;slug . '" ' . selected( $selected_value, $term-&gt;slug ) . '&gt;' . apply_filters( 'woocommerce_variation_option_name', $term-&gt;name ) . '&lt;/option&gt;';
  
              }
  
          } else {
  
              foreach ( $options as $option )
  
                  echo '&lt;option value="' . $option . '" ' . selected( $selected_value, $option ) . '&gt;' . apply_filters( 'woocommerce_variation_option_name', $option ) . '&lt;/option&gt;';
  
          }
  
      }
  
  ?&gt;
  </code></pre>
  
  <p></p>
  
  <p>Relevant Javascript. I change the 'select' elements ot 'input:radio' but it still doesn't work.</p>
  
  <p>jQuery(document).ready(function($) {</p>
  
  <pre><code>/**
   * Variations form handling
   */
  $('form.variations_form')
  
      // On clicking the reset variation button
      .on( 'click', '.reset_variations', function( event ) {
  
          $(this).closest('form.variations_form').find('.variations select').val('').change();
  
          return false;
      } )
  
      // Upon changing an option
      .on( 'change', '.variations select', function( event ) {
  
          $variation_form = $(this).closest('form.variations_form');
          $variation_form.find('input[name=variation_id]').val('').change();
  
          $variation_form
              .trigger( 'woocommerce_variation_select_change' )
              .trigger( 'check_variations', [ '', false ] );
  
          $(this).blur();
  
          if( $().uniform &amp;&amp; $.isFunction( $.uniform.update ) ) {
              $.uniform.update();
          }
  
      } )
  
      // Upon gaining focus
      .on( 'focusin', '.variations select', function( event ) {
  
          $variation_form = $(this).closest('form.variations_form');
  
          $variation_form
              .trigger( 'woocommerce_variation_select_focusin' )
              .trigger( 'check_variations', [ $(this).attr('name'), true ] );
  
      } )
  
      // Check variations
      .on( 'check_variations', function( event, exclude, focus ) {
          var all_set             = true;
          var any_set             = false;
          var showing_variation   = false;
          var current_settings    = {};
          var $variation_form     = $(this);
          var $reset_variations   = $variation_form.find('.reset_variations');
  
          $variation_form.find('.variations select').each( function() {
  
              if ( $(this).val().length == 0 ) {
                  all_set = false;
              } else {
                  any_set = true;
              }
  
              if ( exclude &amp;&amp; $(this).attr('name') == exclude ) {
  
                  all_set = false;
                  current_settings[$(this).attr('name')] = '';
  
              } else {
  
                  // Encode entities
                  value = $(this).val()
                      .replace(/&amp;/g, '&amp;amp;')
                      .replace(/"/g, '&amp;quot;')
                      .replace(/'/g, '&amp;#039;')
                      .replace(/&lt;/g, '&amp;lt;')
                      .replace(/&gt;/g, '&amp;gt;');
  
                  // Add to settings array
                  current_settings[ $(this).attr('name') ] = value;
              }
  
          });
  
          var product_id          = parseInt( $variation_form.attr( 'data-product_id' ) );
          var all_variations      = window[ "product_variations_" + product_id ];
  
          // Fallback
          if ( ! all_variations ) 
              all_variations = window[ "product_variations" ];
  
          var matching_variations = find_matching_variations( all_variations, current_settings );
  
          if ( all_set ) {
  
              var variation = matching_variations.pop();
  
              if ( variation ) {
  
                  // Found - set ID
                  $variation_form
                      .find('input[name=variation_id]')
                      .val( variation.variation_id )
                      .change();
  
                  $variation_form.trigger( 'found_variation', [ variation ] );
  
              } else {
  
                  // Nothing found - reset fields
                  $variation_form.find('.variations select').val('');
  
                  if ( ! focus )
                      $variation_form.trigger( 'reset_image' );
  
              }
  
          } else {
  
              $variation_form.trigger( 'update_variation_values', [ matching_variations ] );
  
              if ( ! focus )
                  $variation_form.trigger( 'reset_image' );
  
              if ( ! exclude ) {
                  $variation_form.find('.single_variation_wrap').slideUp('200');
              }
  
          }
  
          if ( any_set ) {
  
              if ( $reset_variations.css('visibility') == 'hidden' )
                  $reset_variations.css('visibility','visible').hide().fadeIn();
  
          } else {
  
              $reset_variations.css('visibility','hidden');
  
          }
  
      } )
  
      // Reset product image
      .on( 'reset_image', function( event ) {
  
          var $product        = $(this).closest( '.product' );
          var $product_img    = $product.find( 'div.images img:eq(0)' );
          var $product_link   = $product.find( 'div.images a.zoom:eq(0)' );
          var o_src           = $product_img.attr('data-o_src');
          var o_title         = $product_img.attr('data-o_title');
          var o_href          = $product_link.attr('data-o_href');
  
          if ( o_src &amp;&amp; o_href &amp;&amp; o_title ) {
              $product_img
                  .attr( 'src', o_src )
                  .attr( 'alt', o_title )
                  .attr( 'title', o_title );
              $product_link
                  .attr( 'href', o_href );
          }
  
      } )
  
      // Disable option fields that are unavaiable for current set of attributes
      .on( 'update_variation_values', function( event, variations ) {
  
          $variation_form = $(this).closest('form.variations_form');
  
          // Loop through selects and disable/enable options based on selections
          $variation_form.find('.variations select').each(function( index, el ){
  
              current_attr_select = $(el);
  
              // Disable all
              current_attr_select.find('option:gt(0)').attr('disabled', 'disabled');
  
              // Get name
              var current_attr_name   = current_attr_select.attr('name');
  
              // Loop through variations
              for ( num in variations ) {
  
                  var attributes = variations[ num ].attributes;
  
                  for ( attr_name in attributes ) {
  
                      var attr_val = attributes[ attr_name ];
  
                      if ( attr_name == current_attr_name ) {
  
                          if ( attr_val ) {
  
                              // Decode entities
                              attr_val = $("&lt;div/&gt;").html( attr_val ).text();
  
                              // Add slashes
                              attr_val = attr_val.replace(/'/g, "\\'");
                              attr_val = attr_val.replace(/"/g, "\\\"");
  
                              // Compare the meercat
                              current_attr_select.find('option[value="' + attr_val + '"]').removeAttr('disabled');
  
                          } else {
                              current_attr_select.find('option').removeAttr('disabled');
                          }
  
                      }
  
                  }
  
              }
  
          });
  
          // Custom event for when variations have been updated
          $variation_form.trigger('woocommerce_update_variation_values');
  
      } )
  
      // Show single variation details (price, stock, image)
      .on( 'found_variation', function( event, variation ) {
          var $variation_form = $(this);
  
          var $product        = $(this).closest( '.product' );
          var $product_img    = $product.find( 'div.images img:eq(0)' );
          var $product_link   = $product.find( 'div.images a.zoom:eq(0)' );
  
          var o_src           = $product_img.attr('data-o_src');
          var o_title         = $product_img.attr('data-o_title');
          var o_href          = $product_link.attr('data-o_href');
  
          var variation_image = variation.image_src;
          var variation_link = variation.image_link;
          var variation_title = variation.image_title;
  
          $variation_form.find('.variations_button').show();
          $variation_form.find('.single_variation').html( variation.price_html + variation.availability_html );
  
          if ( ! o_src ) {
              o_src = ( ! $product_img.attr('src') ) ? '' : $product_img.attr('src');
              $product_img.attr('data-o_src', o_src );
          }
  
          if ( ! o_href ) {
              o_href = ( ! $product_link.attr('href') ) ? '' : $product_link.attr('href');
              $product_link.attr('data-o_href', o_href );
          }
  
          if ( ! o_title ) {
              o_title = ( ! $product_img.attr('title') ) ? '' : $product_img.attr('title');
              $product_img.attr('data-o_title', o_title );
          }
  
          if ( variation_image &amp;&amp; variation_image.length &gt; 1 ) {
              $product_img
                  .attr( 'src', variation_image )
                  .attr( 'alt', variation_title )
                  .attr( 'title', variation_title );
              $product_link
                  .attr( 'href', variation_link );
          } else {
              $product_img
                  .attr( 'src', o_src )
                  .attr( 'alt', o_title )
                  .attr( 'title', o_title );
              $product_link
                  .attr( 'href', o_href );
          }
  
          var $single_variation_wrap = $variation_form.find('.single_variation_wrap');
  
          if ( variation.sku )
               $product.find('.product_meta').find('.sku').text( variation.sku );
          else
               $product.find('.product_meta').find('.sku').text('');
  
          $single_variation_wrap.find('.quantity').show();
  
          if ( ! variation.is_in_stock &amp;&amp; ! variation.backorders_allowed ) {
              $variation_form.find('.variations_button').hide();
          }
  
          if ( variation.min_qty )
              $single_variation_wrap.find('input[name=quantity]').attr( 'data-min', variation.min_qty ).val( variation.min_qty );
          else
              $single_variation_wrap.find('input[name=quantity]').removeAttr('data-min');
  
          if ( variation.max_qty )
              $single_variation_wrap.find('input[name=quantity]').attr('data-max', variation.max_qty);
          else
              $single_variation_wrap.find('input[name=quantity]').removeAttr('data-max');
  
          if ( variation.is_sold_individually == 'yes' ) {
              $single_variation_wrap.find('input[name=quantity]').val('1');
              $single_variation_wrap.find('.quantity').hide();
          }
  
          $single_variation_wrap.slideDown('200').trigger( 'show_variation', [ variation ] );
  
      } );
  
  /**
   * Initial states and loading
   */
  $('form.variations_form .variations select').change();
  
  
  /**
   * Helper functions for variations
   */
  
  // Search for matching variations for given set of attributes
  function find_matching_variations( product_variations, settings ) {
      var matching = [];
  
      for (var i = 0; i &lt; product_variations.length; i++) {
          var variation = product_variations[i];
          var variation_id = variation.variation_id;
  
          if ( variations_match( variation.attributes, settings ) ) {
              matching.push(variation);
          }
      }
      return matching;
  }
  
  // Check if two arrays of attributes match
  function variations_match( attrs1, attrs2 ) {
      var match = true;
      for ( attr_name in attrs1 ) {
          var val1 = attrs1[ attr_name ];
          var val2 = attrs2[ attr_name ];
          if ( val1 !== undefined &amp;&amp; val2 !== undefined &amp;&amp; val1.length != 0 &amp;&amp; val2.length != 0 &amp;&amp; val1 != val2 ) {
              match = false;
          }
      }
      return match;
  }
  
  });
  </code></pre>