I am redoing a client site – celias.no and also adding a WooCommerce minimum quantity drop down.
The goal:
Add a drop down with a minimum quantity and maximum quantity.
Begins with 10 then goes 10 steps at a time. 10, 20, 30 all the way up to 500.
Shop page: When clicking “Add to cart” will add the minimum of 10.
Product page: A drop down is available to select the quantity.
The Cart page: Contains a drop down to easily change the quantity.
The code used:
(Add the code to the child theme functions file.)
/** Initial code from: https://gist.github.com/kloon/6495019 | |
As the code did not fully work I received help from Helga the Viking | |
with this gist: https://gist.github.com/helgatheviking/ff8792fbb12f5c5367c816b8a46c70ad | |
* Change the quantity input to select. | |
* @param array $args Args for the input. | |
* @param WC_Product|null $product Product. | |
* @param boolean $echo Whether to return or echo|string. | |
* @return string | |
*/ | |
/* My custom version. Minimum quantity of 10. Max of 500. */ | |
function woocommerce_quantity_input( $args = array(), $product = null, $echo = true ) { | |
if ( is_null( $product ) ) { | |
$product = $GLOBALS['product']; | |
} | |
$defaults = array( | |
'input_id' => uniqid( 'quantity_' ), | |
'input_name' => 'quantity', | |
'input_value' => '10', | |
'classes' => apply_filters( 'woocommerce_quantity_input_classes', array( 'input-text', 'qty', 'text' ), $product ), | |
'max_value' => apply_filters( 'woocommerce_quantity_input_max', 500, $product ), | |
'min_value' => apply_filters( 'woocommerce_quantity_input_min', 10, $product ), | |
'step' => apply_filters( 'woocommerce_quantity_input_step', 10, $product ), | |
'pattern' => apply_filters( 'woocommerce_quantity_input_pattern', has_filter( 'woocommerce_stock_amount', 'intval' ) ? '[0-9]*' : '' ), | |
'inputmode' => apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' ), | |
'product_name' => $product ? $product->get_title() : '', | |
); | |
$args = apply_filters( 'woocommerce_quantity_input_args', wp_parse_args( $args, $defaults ), $product ); | |
// Apply sanity to min/max args – min cannot be lower than 0. | |
$args['min_value'] = max( $args['min_value'], 10 ); | |
$args['max_value'] = 10 < $args['max_value'] ? $args['max_value'] : 500; | |
// Max cannot be lower than min if defined. | |
if ( '' !== $args['max_value'] && $args['max_value'] < $args['min_value'] ) { | |
$args['max_value'] = $args['min_value']; | |
} | |
ob_start(); | |
if ( $args['max_value'] && $args['min_value'] === $args['max_value'] ) { | |
echo '<div class="quantity hidden"> | |
<input type="hidden" id="'. esc_attr( $args['input_id'] ) .'" class="qty" name="'. esc_attr( $args['input_name'] ) .'" value="'. esc_attr( $min_value ) .'" /> | |
</div>'; | |
} else { | |
/* translators: %s: Quantity. */ | |
$label = ! empty( $args['product_name'] ) ? sprintf( esc_html__( '%s quantity', 'woocommerce' ), wp_strip_all_tags( $args['product_name'] ) ) : esc_html__( 'Quantity', 'woocommerce' ); | |
echo '<div class="quantity">'; | |
do_action( 'woocommerce_before_quantity_input_field' ); | |
echo '<label class="screen-reader-text" for="'. esc_attr( $args['input_id'] ) .'">'. esc_attr( $label ) .'</label>'; | |
$options = ''; | |
for ( $count = $args['min_value']; $count <= $args['max_value']; $count = $count + $args['step'] ) { | |
$options .= '<option value="' . $count . '" '. selected( $args['input_value'], $count, false ) . '>' . $count . '</option>'; | |
} | |
echo '<div class="quantity_select"><select name="' . esc_attr( $args['input_name'] ) . '" title="' . _x( 'Qty', 'Product quantity input tooltip', 'woocommerce' ) . '" class="qty">' . $options . '</select></div>'; | |
do_action( 'woocommerce_after_quantity_input_field' ); | |
echo '</div>'; | |
} | |
if ( $echo ) { | |
echo ob_get_clean(); // WPCS: XSS ok. | |
} else { | |
return ob_get_clean(); | |
} | |
} | |
/* Clicking "Add to Cart" in the Shop page added 1 quantity. As I have a minimum of 10 I had to add the following | |
code from Helga for it to work correctly. The following will add quantity of 10 to the cart. */ | |
function kia_min_quantity( $args, $product ) { | |
$args['quantity'] = 10; | |
return $args; | |
} | |
add_filter( 'woocommerce_loop_add_to_cart_args', 'kia_min_quantity', 10, 2 ); | |
// add_filter( 'woocommerce_quantity_input_min', 'kia_min_quantity', 10, 2 ); | |
// Add a default value to all product page quantity dropdowns. Makes a check first to see that it is ! not in the cart. | |
function kia_default_quantity( $args, $product ) { | |
if( ! is_cart() ) { | |
$args['input_value'] = 30; | |
} | |
return $args; | |
} | |
add_filter( 'woocommerce_quantity_input_args', 'kia_default_quantity', 10, 2 ); | |
// OR use this code: Add a different starting value to multiple product page quantity drop downs. | |
// Makes a check first to see that it is ! not in the cart. | |
function kia_default_quantity( $args, $product ) { | |
if( ! is_cart() ) { | |
if( 613 == $product->get_id() ) { // Condition: Only apply these arguments to Product ID of #613 Product 1. | |
$args['input_value'] = 70; | |
} | |
elseif ( 866 == $product->get_id() ) { // Condition: Only apply these arguments to Product ID of #866 Product 2. | |
$args['input_value'] = 60; | |
} | |
elseif ( 145 == $product->get_id() ) { // Condition: Only apply these arguments to Product ID of #145 Product 3. | |
$args['input_value'] = 50; | |
} | |
else $args['input_value'] = 30; // Condition: All other product ID's begin with the starting value of 30. | |
} | |
return $args; | |
} | |
add_filter( 'woocommerce_quantity_input_args', 'kia_default_quantity', 10, 2 ); | |
Great post! I didn’t knowral of these resources and I’m going to go check them out now!
Man, thanks a lot for this 😉
Instead of using a child theme I used the “Code Snippets” Plugin from the wp repository. It adds this snippets to functions.php without touching it.
It was so helpful to me
thanks and very good