This is doable in a simple way with a bit of PHP and JavaScript.
First, you need to set up The “ebook” and “audiobook” variations as virtual products:
Then the following code will (for virtual variations):
- Set the max quantity to 1 (in product page),
- Hide the quantity button (in product page),
- Hide the quantity button (in cart page).
The code:
// Product page: Set max quantity for virtual product variation
add_filter( 'woocommerce_available_variation', 'wc_available_variation_max_qty', 10, 3 );
function wc_available_variation_max_qty( $data_variation, $product, $variation ) {
if ( $data_variation['is_virtual'] ) {
$data_variation['max_qty'] = 1;
}
return $data_variation;
}
// Product page: Hide quantity field for virtual product variation
add_action('woocommerce_single_variation', 'variable_product_jquery_script', 5);
function variable_product_jquery_script() {
// Enqueued JavaScript
wc_enqueue_js( "$('form.variations_form').on('show_variation', function(event, data){
if( data.is_virtual ) {
$('div.quantity').hide();
} else {
$('div.quantity').show();
}
});" );
}
// Cart page: Hide quantity field for virtual product variation
add_filter( 'woocommerce_quantity_input_args', 'filter_wc_quantity_input_args', 10, 2 );
function filter_wc_quantity_input_args( $args, $product ) {
if ( $product->is_virtual() ) {
$args['min_value'] = $args['max_value'] = 1;
}
return $args;
}
Code goes in functions.php file of your child theme (or in a plugin).
In single variable product page (physical product variation):
In single variable product page (virtual product variation):
In cart page:
Based on: