Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save cristianstan/48efc9a263fa2005c0c24f3158bd4585 to your computer and use it in GitHub Desktop.
Save cristianstan/48efc9a263fa2005c0c24f3158bd4585 to your computer and use it in GitHub Desktop.
WooCommerce Variations as Radio Buttons (PHP) -> functions.php (Result: https://i.imgur.com/dVlt07f.png) tutorial from https://stackoverflow.com/questions/36219833/woocommerce-variations-as-radio-buttons
/*Variations on single product*/
.single-product .variations .variation-radios input[type='radio']{
display: none;
}
.single-product .variations .variation-radios label {
border: 2px solid #ddd;
border-radius: 4px;
cursor: pointer;
padding: 3px 6px;
margin-right: 5px;
}
.single-product .variations select {
display: none;
}
.single-product .variations .variation-radios label.selected-variation {
border: 2px solid #13476F;
color: #13476F;
}
// Variable products variations label buttons from dropdown
jQuery(document).on('change', '.variation-radios input', function() {
jQuery('select[name="'+jQuery(this).attr('name')+'"]').val(jQuery(this).val()).trigger('change');
jQuery('.variation-radios label').each(function(index, element) {
jQuery(this).removeClass('selected-variation');
});
var attribute_value = jQuery(this).val();
jQuery('.variation-radios label[for="'+attribute_value+'"]').addClass('selected-variation');
});
jQuery(document).on('woocommerce_update_variation_values', function() {
jQuery('.variation-radios input').each(function(index, element) {
jQuery(element).removeAttr('disabled');
var thisName = jQuery(element).attr('name');
var thisVal = jQuery(element).attr('value');
if(jQuery('select[name="'+thisName+'"] option[value="'+thisVal+'"]').is(':disabled')) {
jQuery(element).prop('disabled', true);
}
});
});
<?php
function variation_radio_buttons($html, $args) {
$args = wp_parse_args(apply_filters('woocommerce_dropdown_variation_attribute_options_args', $args), array(
'options' => false,
'attribute' => false,
'product' => false,
'selected' => false,
'name' => '',
'id' => '',
'class' => '',
'show_option_none' => __('Choose an option', 'woocommerce'),
));
if(false === $args['selected'] && $args['attribute'] && $args['product'] instanceof WC_Product) {
$selected_key = 'attribute_'.sanitize_title($args['attribute']);
$args['selected'] = isset($_REQUEST[$selected_key]) ? wc_clean(wp_unslash($_REQUEST[$selected_key])) : $args['product']->get_variation_default_attribute($args['attribute']);
}
$options = $args['options'];
$product = $args['product'];
$attribute = $args['attribute'];
$name = $args['name'] ? $args['name'] : 'attribute_'.sanitize_title($attribute);
$id = $args['id'] ? $args['id'] : sanitize_title($attribute);
$class = $args['class'];
$show_option_none = (bool)$args['show_option_none'];
$show_option_none_text = $args['show_option_none'] ? $args['show_option_none'] : __('Choose an option', 'woocommerce');
if(empty($options) && !empty($product) && !empty($attribute)) {
$attributes = $product->get_variation_attributes();
$options = $attributes[$attribute];
}
$radios = '<div class="variation-radios">';
if(!empty($options)) {
if($product && taxonomy_exists($attribute)) {
$terms = wc_get_product_terms($product->get_id(), $attribute, array(
'fields' => 'all',
));
foreach($terms as $term) {
if(in_array($term->slug, $options, true)) {
$radios .= '<input type="radio" name="'.esc_attr($name).'" id="'.esc_attr($term->slug).'" value="'.esc_attr($term->slug).'" '.checked(sanitize_title($args['selected']), $term->slug, false).'><label for="'.esc_attr($term->slug).'">'.esc_html(apply_filters('woocommerce_variation_option_name', $term->name)).'</label>';
}
}
} else {
foreach($options as $option) {
$checked = sanitize_title($args['selected']) === $args['selected'] ? checked($args['selected'], sanitize_title($option), false) : checked($args['selected'], $option, false);
$radios .= '<input type="radio" name="'.esc_attr($name).'" value="'.esc_attr($option).'" id="'.sanitize_title($option).'" '.$checked.'><label for="'.sanitize_title($option).'">'.esc_html(apply_filters('woocommerce_variation_option_name', $option)).'</label>';
}
}
}
$radios .= '</div>';
return $html.$radios;
}
add_filter('woocommerce_dropdown_variation_attribute_options_html', 'variation_radio_buttons', 20, 2);
function variation_check($active, $variation) {
if(!$variation->is_in_stock() && !$variation->backorders_allowed()) {
return false;
}
return $active;
}
add_filter('woocommerce_variation_is_active', 'variation_check', 10, 2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment