Добавьте плату Woocommerce в зависимости от класса доставки и количества товара

В Woocommerce я пытаюсь добавить плату за доставку, если для элемента корзины назначен соответствующий класс доставки. Я бы хотел, чтобы стоимость доставки умножалась на количество товаров в корзине…

У меня это работает, когда товар добавляется в корзину, а количество увеличивается, а также увеличивается дополнительная плата за доставку. Однако, если я добавлю другой товар с таким же классом доставки и увеличу количество, дополнительная плата не увеличится.

Это мой код:

// Add additional fees based on shipping class
function woocommerce_fee_based_on_shipping_class( $cart_object ) {

    global $woocommerce;

    // Setup an array of shipping classes which correspond to those created in Woocommerce
    $shippingclass_dry_ice_array = array( 'dry-ice-shipping' );
    $dry_ice_shipping_fee = 70;

    // then we loop through the cart, checking the shipping classes
    foreach ( $cart_object->cart_contents as $key => $value ) {
        $shipping_class = get_the_terms( $value['product_id'], 'product_shipping_class' );
        $quantity = $value['quantity'];

        if ( isset( $shipping_class[0]->slug ) && in_array( $shipping_class[0]->slug, $shippingclass_dry_ice_array ) ) {
            $woocommerce->cart->add_fee( __('Dry Ice Shipping Fee', 'woocommerce'), $quantity * $dry_ice_shipping_fee ); // each of these adds the appropriate fee
        }
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'woocommerce_fee_based_on_shipping_class' ); // make it all happen when Woocommerce tallies up the fees

Как я могу заставить его работать и для дополнительных товаров в корзине?

2 ответа

Ваш код немного устарел и есть некоторые ошибки. Чтобы добавить плату в зависимости от класса доставки товара и количества товаров в корзине, используйте следующее:

// Add a fee based on shipping class and cart item quantity
add_action( 'woocommerce_cart_calculate_fees', 'shipping_class_and_item_quantity_fee', 10, 1 ); 
function shipping_class_and_item_quantity_fee( $cart ) {

    ## -------------- YOUR SETTINGS BELOW ------------ ##
    $shipping_class = 'dry-ice-shipping'; // Targeted Shipping class slug
    $base_fee_rate  = 70; // Base rate for the fee
    ## ----------------------------------------------- ##

    $total_quantity = 0; // Initializing

    // Loop through cart items
    foreach( $cart_object->get_cart() as $cart_item ) {
        // Get the instance of the WC_Product Object
        $product = $cart_item['data'];

        // Check for product shipping class
        if( $product->get_shipping_class() == $shipping_class ) {
            $total_quantity += $cart_item['quantity']; // Add item quantity
        }
    }

    if ( $total_quantity > 0 ) {
        $fee_text   = __('Dry Ice Shipping Fee', 'woocommerce');
        $fee_amount = $base_fee_rate * $total_quantity; // Calculate fee amount

        // Add the fee
        $cart->add_fee( $fee_text, $fee_amount );
    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Если в корзине есть один класс доставки, сборов не должно быть, но если есть более одного класса доставки, то должна быть дополнительная плата за обработку в размере 1 евро и увеличение для каждого другого класса доставки.

Ситуация 1: товар с классом доставки (склад 1) добавлен в корзину = без дополнительных комиссий

Ситуация 2: Товар с классом доставки (Склад 1) добавлен в корзину, Товар с другим классом доставки (Склад 2) добавлен в корзину = 1x Плата за обработку добавлена ​​в корзину. - 11 евро

Ситуация 3: Товар с классом доставки (Склад 1) добавлен в корзину, Товар с классом доставки (Склад 2) добавлен в корзину, Товар с классом доставки (Склад 3) добавлен в корзину = 2x Плата за обработку добавлена ​​в корзину Промежуточные итоги: Продукты 3x - 15 евро Доставка - Бесплатная плата за обработку 2x - 1 евро Итого - 12 евро

Другие вопросы по тегам