My product has a maximum quantity of 10. Customers often choose to buy many types at the same time. Hence I want to have a radio quantity selector (1 – 10) at the shop page.
I already know how to show quantity picker at the shop page and how to use WooCommerce radio form. But I don’t know how to make a quantity radio selector.
Based on Add a quantity field to Ajax add to cart button on WooCommerce shop page answer code, this is my code attempt:
add_filter( 'woocommerce_loop_add_to_cart_link', 'quantity_inputs_for_loop_ajax_add_to_cart', 99, 2 ); function quantity_inputs_for_loop_ajax_add_to_cart( $html, $product ) { if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) { // Get the necessary classes $class = implode( ' ', array_filter( array( 'button', 'product_type_' . $product->get_type(), $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '', $product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '', ) ) ); $args = array( 'type' => 'radio', 'class' => array( 'form-row-wide', 'update_totals_on_change' ), 'options' => array( '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10' ), 'default' => '0' ); // Embedding the quantity field to Ajax add to cart button $html = sprintf( '%s<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>', woocommerce_form_field( 'radio_choice', $args, '0' ), // woocommerce_quantity_input( array(), $product, false ), esc_url( $product->add_to_cart_url() ), esc_attr( isset( $quantity ) ? $quantity : 1 ), esc_attr( $product->get_id() ), esc_attr( $product->get_sku() ), esc_attr( isset( $class ) ? $class : 'button' ), esc_html( $product->add_to_cart_text() ) ); } return $html; }
Any suggestion to get the code working?
Advertisement
Answer
It looks like your missing the additional jQuery required to make this work. I know you requested to make this work with a radio select but maybe to save space you want to consider a select
?
The following code does just that.
add_filter( 'woocommerce_loop_add_to_cart_link', 'quantity_inputs_for_loop_ajax_add_to_cart', 10, 2 ); function quantity_inputs_for_loop_ajax_add_to_cart( $html, $product ) { if ( $product && $product->is_type( 'simple' ) && $product->is_purchasable() && $product->is_in_stock() && ! $product->is_sold_individually() ) { // Get the necessary classes $class = implode( ' ', array_filter( array( 'button', 'product_type_' . $product->get_type(), $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '', $product->supports( 'ajax_add_to_cart' ) ? 'ajax_add_to_cart' : '', ) ) ); $args = array( 'type' => 'select', 'class' => array( 'form-row-wide', 'quantity-select' ), 'options' => array( '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10' ), 'default' => '0' ); // Embedding the quantity field to Ajax add to cart button $html = sprintf( '%s<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>', woocommerce_form_field( '', $args ), esc_url( $product->add_to_cart_url() ), esc_attr( isset( $quantity ) ? $quantity : 1 ), esc_attr( $product->get_id() ), esc_attr( $product->get_sku() ), esc_attr( isset( $class ) ? $class : 'button' ), esc_html( $product->add_to_cart_text() ) ); } return $html; } add_action( 'wp_footer', 'archives_quantity_fields_script' ); function archives_quantity_fields_script(){ ?> <script type='text/javascript'> jQuery(function($){ // Update data-quantity $(document.body).on('change', '.quantity-select select', function() { let selected_quantity = $(this).find(":selected").text(); $(this).closest('li.product').find('a.ajax_add_to_cart').attr('data-quantity', selected_quantity); $(".added_to_cart").remove(); // Optional: Removing other previous "view cart" buttons }).on('click', '.add_to_cart_button', function(){ var button = $(this); setTimeout(function(){ console.log( button.siblings('.quantity-select').find('select option[value="0"]') ); button.siblings('.quantity-select').find('select').val('0'); // reset quantity to 0 }, 1000); // After 1 second }); }); </script> <?php }