Created
May 11, 2021 10:39
-
-
Save jjmontalban/85de493c3fe49865840b33b69beed325 to your computer and use it in GitHub Desktop.
Displaying quantity setting fields on admin product pages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* @snippet Displaying quantity setting fields on admin product pages | |
* @based on https://stackoverflow.com/questions/62943477/set-quantity-minimum-maximum-and-step-at-product-level-in-woocommerce | |
*/ | |
add_action( 'woocommerce_product_options_pricing', 'wc_qty_add_product_field' ); | |
function wc_qty_add_product_field() { | |
global $product_object; | |
$values = $product_object->get_meta('_qty_args'); | |
echo '</div><div class="options_group quantity hide_if_grouped"> | |
<style>div.qty-args.hidden { display:none; }</style>'; | |
woocommerce_wp_checkbox( array( // Checkbox. | |
'id' => 'qty_args', | |
'label' => __( 'Quantity settings', 'woocommerce' ), | |
'value' => empty($values) ? 'no' : 'yes', | |
'description' => __( 'Activa la configuración de campos cantidades (tallos x pqts).', 'woocommerce' ), | |
) ); | |
echo '<div class="qty-args hidden">'; | |
woocommerce_wp_text_input( array( | |
'id' => 'qty_min', | |
'type' => 'number', | |
'label' => __( 'Minimum Quantity', 'woocommerce-max-quantity' ), | |
'placeholder' => '', | |
'desc_tip' => 'true', | |
'description' => __( 'Set a minimum allowed quantity limit (a number greater than 0).', 'woocommerce' ), | |
'custom_attributes' => array( 'step' => 'any', 'min' => '0'), | |
'value' => isset($values['qty_min']) && $values['qty_min'] > 0 ? (int) $values['qty_min'] : 0, | |
) ); | |
woocommerce_wp_text_input( array( | |
'id' => 'qty_max', | |
'type' => 'number', | |
'label' => __( 'Maximum Quantity', 'woocommerce-max-quantity' ), | |
'placeholder' => '', | |
'desc_tip' => 'true', | |
'description' => __( 'Set the maximum allowed quantity limit (a number greater than 0). Value "-1" is unlimited', 'woocommerce' ), | |
'custom_attributes' => array( 'step' => 'any', 'min' => '-1'), | |
'value' => isset($values['qty_max']) && $values['qty_max'] > 0 ? (int) $values['qty_max'] : -1, | |
) ); | |
woocommerce_wp_text_input( array( | |
'id' => 'qty_step', | |
'type' => 'number', | |
'label' => __( 'Quantity step', 'woocommerce-quantity-step' ), | |
'placeholder' => '', | |
'desc_tip' => 'true', | |
'description' => __( 'Optional. Set quantity step (a number greater than 0)', 'woocommerce' ), | |
'custom_attributes' => array( 'step' => 'any', 'min' => '1'), | |
'value' => isset($values['qty_step']) && $values['qty_step'] > 1 ? (int) $values['qty_step'] : 1, | |
) ); | |
echo '</div>'; | |
} | |
// Show/hide setting fields (admin product pages) | |
add_action( 'admin_footer', 'product_type_selector_filter_callback' ); | |
function product_type_selector_filter_callback() { | |
global $pagenow, $post_type; | |
if( in_array($pagenow, array('post-new.php', 'post.php') ) && $post_type === 'product' ) : | |
?> | |
<script> | |
jQuery(function($){ | |
if( $('input#qty_args').is(':checked') && $('div.qty-args').hasClass('hidden') ) { | |
$('div.qty-args').removeClass('hidden') | |
} | |
$('input#qty_args').click(function(){ | |
if( $(this).is(':checked') && $('div.qty-args').hasClass('hidden')) { | |
$('div.qty-args').removeClass('hidden'); | |
} else if( ! $(this).is(':checked') && ! $('div.qty-args').hasClass('hidden')) { | |
$('div.qty-args').addClass('hidden'); | |
} | |
}); | |
}); | |
</script> | |
<?php | |
endif; | |
} | |
// Save quantity setting fields values | |
add_action( 'woocommerce_admin_process_product_object', 'wc_save_product_quantity_settings' ); | |
function wc_save_product_quantity_settings( $product ) { | |
if ( isset($_POST['qty_args']) ) { | |
$values = $product->get_meta('_qty_args'); | |
$product->update_meta_data( '_qty_args', array( | |
'qty_min' => isset($_POST['qty_min']) && $_POST['qty_min'] > 0 ? (int) wc_clean($_POST['qty_min']) : 0, | |
'qty_max' => isset($_POST['qty_max']) && $_POST['qty_max'] > 0 ? (int) wc_clean($_POST['qty_max']) : -1, | |
'qty_step' => isset($_POST['qty_step']) && $_POST['qty_step'] > 1 ? (int) wc_clean($_POST['qty_step']) : 1, | |
) ); | |
} else { | |
$product->update_meta_data( '_qty_args', array() ); | |
} | |
} | |
// The quantity settings in action on front end | |
add_filter( 'woocommerce_quantity_input_args', 'filter_wc_quantity_input_args', 99, 2 ); | |
function filter_wc_quantity_input_args( $args, $product ) { | |
if ( $product->is_type('variation') ) { | |
$parent_product = wc_get_product( $product->get_parent_id() ); | |
$values = $parent_product->get_meta( '_qty_args' ); | |
} else { | |
$values = $product->get_meta( '_qty_args' ); | |
} | |
if ( ! empty( $values ) ) { | |
// Min value | |
if ( isset( $values['qty_min'] ) && $values['qty_min'] > 1 ) { | |
$args['min_value'] = $values['qty_min']; | |
if( ! is_cart() ) { | |
$args['input_value'] = $values['qty_min']; // Starting value | |
} | |
} | |
// Max value | |
if ( isset( $values['qty_max'] ) && $values['qty_max'] > 0 ) { | |
$args['max_value'] = $values['qty_max']; | |
if ( $product->managing_stock() && ! $product->backorders_allowed() ) { | |
$args['max_value'] = min( $product->get_stock_quantity(), $args['max_value'] ); | |
} | |
} | |
// Step value | |
if ( isset( $values['qty_step'] ) && $values['qty_step'] > 1 ) { | |
$args['step'] = $values['qty_step']; | |
} | |
} | |
return $args; | |
} | |
// Ajax add to cart, set "min quantity" as quantity on shop and archives pages | |
add_filter( 'woocommerce_loop_add_to_cart_args', 'filter_loop_add_to_cart_quantity_arg', 10, 2 ); | |
function filter_loop_add_to_cart_quantity_arg( $args, $product ) { | |
$values = $product->get_meta( '_qty_args' ); | |
if ( ! empty( $values ) ) { | |
// Min value | |
if ( isset( $values['qty_min'] ) && $values['qty_min'] > 1 ) { | |
$args['quantity'] = $values['qty_min']; | |
} | |
} | |
return $args; | |
} | |
// The quantity settings in action on front end (For variable productsand their variations) | |
add_filter( 'woocommerce_available_variation', 'filter_wc_available_variation_price_html', 10, 3); | |
function filter_wc_available_variation_price_html( $data, $product, $variation ) { | |
$values = $product->get_meta( '_qty_args' ); | |
if ( ! empty( $values ) ) { | |
if ( isset( $values['qty_min'] ) && $values['qty_min'] > 1 ) { | |
$data['min_qty'] = $values['qty_min']; | |
} | |
if ( isset( $values['qty_max'] ) && $values['qty_max'] > 0 ) { | |
$data['max_qty'] = $values['qty_max']; | |
if ( $variation->managing_stock() && ! $variation->backorders_allowed() ) { | |
$data['max_qty'] = min( $variation->get_stock_quantity(), $data['max_qty'] ); | |
} | |
} | |
} | |
return $data; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment