我是WooCommerce和PHP的新手,我计划在WooCommerce中为简单和可变的产品添加一个字段,在那里我可以控制最小订单量.

基于此,例如,当它设置为10时,WooCommerce购物车计数器应自动更改为该数字,并且用户不能减少订单的值,因为最小订单数量已设置为10.

所以我想要lowest个最小订货量(因为购物车只能使用一个最小订货量)

以下是我的代码:

/*Minimum Order - Simple & Variable Product*/
// Add minimum order field to product options
function add_minimum_order_field() {
    global $product_object;

    woocommerce_wp_text_input(
        array(
            'id' => 'minimum_order',
            'class' => 'wc_input_price short',
            'label' => 'Minimim Order',
            'desc_tip' => true,
            'description' => 'Set mimimum order for this product',
            'value' => get_post_meta($product_object->get_id(), 'minimum_order', true), // Populate the field with the saved value
        )
    );
}
add_action('woocommerce_product_options_pricing', 'add_minimum_order_field');

// Save minimum order field value
function save_minimum_order_field($product) {
    $minimum_order = isset($_POST['minimum_order']) ? wc_clean($_POST['minimum_order']) : '';
    $product->update_meta_data('minimum_order', $minimum_order);
}
add_action('woocommerce_admin_process_product_object', 'save_minimum_order_field');

// Add minimum order field to product variations
function add_minimum_order_field_to_variations($loop, $variation_data, $variation) {
    woocommerce_wp_text_input(
        array(
            'id' => 'minimum_order[' . $variation->ID . ']',
            'class' => 'wc_input_price short',
            'label' => 'Minimim Order',
            'desc_tip' => true,
            'description' => 'Set mimimum order for this variation',
            'value' => get_post_meta($variation->ID, 'minimum_order', true), // Populate the field with the saved value
        )
    );
}
add_action('woocommerce_variation_options_pricing', 'add_minimum_order_field_to_variations', 10, 3);

// Save minimum order field value for product variations
function save_minimum_order_field_for_variations($variation_id, $i) {
    $minimum_order = isset($_POST['minimum_order'][$variation_id]) ? wc_clean($_POST['minimum_order'][$variation_id]) : '';
    update_post_meta($variation_id, 'minimum_order', $minimum_order);
}
add_action('woocommerce_save_product_variation', 'save_minimum_order_field_for_variations', 10, 2);

// Validate minimum order on add to cart
function validate_minimum_order($passed, $product_id, $quantity) {
    $minimum_order = get_post_meta($product_id, 'minimum_order', true);

    if ($quantity < $minimum_order) {
        wc_add_notice(sprintf('the minimum order must be %s.', $minimum_order), 'error');
        $passed = false;
    }

    return $passed;
}
add_filter('woocommerce_add_to_cart_validation', 'validate_minimum_order', 10, 3);

但使它的工作,因为我需要得到lowest最低订单数量将适用于购物车预期.

如何根据购物车项目的lowest个最小订货量来设置简单和可变产品的最小订货量?

推荐答案

我已经重新判断了您的代码,因为有一些错误.

对于全球最小订单总数量(基于lowest minimum order),需要在购物车上进行验证,而不是在添加到购物车上的单个产品上进行验证.因此,如果没有满足要求的(最低)最低订单,购物车中将显示一条错误消息,阻止 checkout 访问.

enter image description here

try 以下操作:

// Display a minimum order input field to product options pricing
add_action('woocommerce_product_options_pricing', 'add_minimum_order_field');
function add_minimum_order_field() {

    woocommerce_wp_text_input( array(
        'id'            => 'minimum_order',
        'type'          => 'number',
        'class'         => 'short',
        'label'         => 'Minimum order',
        'desc_tip'      => true,
        'description'   => 'Set minimum order for this product',
    ) );
}

// Display a minimum order input field to product variation options pricing
add_action('woocommerce_variation_options_pricing', 'add_minimum_order_field_to_variations', 10, 3);
function add_minimum_order_field_to_variations($loop, $variation_data, $variation) {

    woocommerce_wp_text_input( array(
        'id'            => 'minimum_order['.$loop.']',
        'type'          => 'number',
        'wrapper_class' => 'form-row form-row-wide',
        'class'         => 'short',
        'label'         => 'Minimum Order',
        'desc_tip'      => true,
        'description'   => 'Set minimum order for this variation',
        'value'         => get_post_meta($variation->ID, 'minimum_qty', true), 
    ) );
}
// Save minimum order field value for products
add_action('woocommerce_admin_process_product_object', 'save_minimum_order_field');
function save_minimum_order_field($product) {
    $minimum_order = isset($_POST['minimum_order']) ? esc_attr($_POST['minimum_order']) : '';
    $product->update_meta_data('minimum_order', $minimum_order);
}

// Save minimum order field value for product variations
add_action('woocommerce_admin_process_variation_object', 'save_minimum_order_field_for_variations', 10, 2);
function save_minimum_order_field_for_variations($variation, $i) {
    $minimum_order = isset($_POST['minimum_order'][$i]) ? esc_attr($_POST['minimum_order'][$i]) : '';
    $variation->update_meta_data('minimum_order', $minimum_order);
}

// Utility function: Get the lowest min order
function get_lowest_minimum_order() {
    $data_array = []; // Initializing

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $item ) {
        $min_order = $item['data']->get_meta('minimum_order');

        if ( empty($min_order) && $item['variation_id'] > 0 ) {
            // if variation minimum order is not defined take the parent product minimum order  
            $min_order = get_post_meta($item['product_id'], 'minimum_order', true);
        }

        if ( ! empty($min_order) ) {
            $data_array[] = $min_order;
        }
    }
    return min($data_array);
}

// Cart items validation
add_action( 'woocommerce_check_cart_items', 'minimum_order_cart_items_validation' );
function minimum_order_cart_items_validation() {
    $minimum_order    = get_lowest_minimum_order();
    $cart_total_count = WC()->cart->get_cart_contents_count();

    if ( ! empty($minimum_order) && $cart_total_count < $minimum_order ) {
        wc_add_notice(sprintf('The minimum order total items quantity must be %s.', $minimum_order), 'error');
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).应该能行得通.


如果您要根据**最大最小订单设置最小订单总数量,只需更改:

return min($data_array);

致:

return max($data_array);

Php相关问答推荐

try 修改这个PHP代码如果语句在WordPress""

Laravel:从匹配的数组数据中获取记录

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

在Google云存储对象上从PHP设置缓存控制TTL会更改错误的元数据

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

Laravel POST方法返回状态:POST方法上不允许使用405方法

在Laravel中修改JSON输出

如何在Laravel Model中自定义多个日期属性的日期格式?

上传WordPress模板中的翻译文件(.mo和.po)

拉威尔10有许多通过获取所有祖父母数据的子元素S图像

登录后重定向在WooCommerce中购买产品的用户

需要以一种形式执行两个操作

订单完成后创建 WooCommerce 促销代码

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

添加产品标签以通过 WooCommerce 邮箱通知订购商品

PHP简单地将物品装在盒子里会导致未使用的空间,但还有剩余容量

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

Laravel:ArgumentCountError: 函数 App\Mail 的参数太少

无法在 Laravel 10 中安装 jenssegers/mongodb