在 Woocommerce 中的产品级别设置数量最小值、最大值和步骤

Posted

技术标签:

【中文标题】在 Woocommerce 中的产品级别设置数量最小值、最大值和步骤【英文标题】:Set quantity minimum, maximum and step at product level in Woocommerce 【发布时间】:2020-11-06 15:22:21 【问题描述】:

我使用“set minimum and maximum allowable product quantities to be added in WooCommerce Cart”来要求最小和最大数量的订单。

现在,我需要为几种产品(不是全部)强加多个数量。 例如:6瓶、12瓶、18瓶(6的倍数)或其他12瓶、24瓶(12的倍数)

我找到了一个解决方案,但它适用于每个具有独特价值的产品,我无法在后台单独管理每个产品。 我必须在后台管理多个数量。

如果你能帮助我,谢谢你

【问题讨论】:

【参考方案1】:

更新 2020 年 12 月

以下重新访问的代码将允许除了处理数量之外的步骤。

我已将数量字段设置位置更改为“常规”设置选项卡。

我添加了一个复选框,用于在产品级别启用或禁用那些额外的数量设置(动态显示或隐藏设置字段):

复选框未选中时 (字段不可见且数量设置被禁用)

复选框被选中时 (字段可见且数量设置已启用)

我已将唯一自定义字段中的所有设置合并为索引值数组,以提高性能。

自 WooCommerce 第 3 版以来,情况发生了很大变化,因此我进行了一些更改以增强和更新代码以更新。

同样适用于简单产品的 Ajax 添加到购物车、可变产品的产品变体以及购物车数量输入字段。

所有代码:

// Displaying quantity setting fields on admin product pages
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'   => __( 'Enable this to show and enable the additional quantity setting fields.', '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;

代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

【讨论】:

谢谢。我可以删除其他代码(设置最小/最大允许产品...) 太棒了!其作品。谢谢,谢谢,谢谢 谢谢。这确实是一个很好的解决方案!但是,它为整个产品设置了最小/最大/数量步骤。如果你必须为个人变化做这件事,你会怎么做?我认为我们可以使用过滤器 woocommerce_quantity_input_args 并检查产品是否是可变的,并像您一样在 args 中设置最小最大值但是我如何为该变化设置数量步长?根据 args 在该数组中没有步长索引docs。想法? @AnkitShah 在变化级别管理数量参数只能用于最小和最大数量,但不能用于步骤数量。搜索有一个插件可能应该这样做。 太棒了!您知道产品页面中使用步骤数量的变化吗?使用此代码仅适用于购物车页面。我的意思是,如果步数为 25。在产品页面中,+ 和 - 按钮可以一键添加 25 个项目,而不是 +1 (26)?

以上是关于在 Woocommerce 中的产品级别设置数量最小值、最大值和步骤的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce商城自定义每页显示产品数量

根据 WooCommerce 购物车中的商品数量和产品类别禁用支付网关

当 WooCommerce 档案中的产品缺货时删除自定义数量字段

限制 Woocommerce 中的购物车商品数量

在WooCommerce产品类别窗口小部件侧边栏中显示产品数量

需要根据woocommerce中产品的个别数量更改价格[重复]