Woocommerce - добавьте надбавку в корзину в зависимости от веса только для некоторых категорий (или для всей корзины, кроме некоторых категорий)

Друзья просят меня добавить дополнительную плату за корзину в зависимости от веса и только для определенных категорий (или за исключением некоторых категорий, это не имеет значения).

Тема в том, что летом он хочет добавить лед в упаковки, чтобы продукты (например, молоко, сыр и т. Д.) Оставались холодными.

Он также продает гаджеты и экскурсии на свою фабрику и т. Д., Поэтому он не хочет применять дополнительную плату к этой продукции.

На основе «Добавить таможенную плату на основе общего веса в Woocommerce ", моя версия кода, приведенная ниже, применяет дополнительную плату ко всей корзине, исключая продукт посещения из этой платы, потому что вес посещения, очевидно, равен 0.

Но я не разбираюсь в коде и не знаю, как вставить массив, чтобы включить такие категории, как «молоко» и «сыр» (или наоборот, чтобы исключить «посещения» и «гаджеты»).

В зависимости от моего кода, мой код увеличивает плату с шагом 3 кг (из-за калибровки пакетов DHL / UPS / GLS и т. Д.)

/* Extra Fee based on weight */

add_action( 'woocommerce_cart_calculate_fees', 'shipping_weight_fee', 30, 1 );
function shipping_weight_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Convert in grams
    $cart_weight = $cart->get_cart_contents_weight() * 1000;
    $fee = 0.00; // initial fee 


    // if cart is > 0 add €1,20 to initial fee by steps of 3000g
    if( $cart_weight > 0 ){
        for( $i = 0; $i < $cart_weight; $i += 3000 ){
            $fee += 1.20;
        }
    }    

    // add the fee / doesn't show extra fee if it's 0
    if ( !empty( $fee )) {
    $cart->add_fee( __( 'Extra for ice' ), $fee, false );
        }
}

Последний вопрос: почему переменная $ i может быть 0 ... 1 ... 1000000 без каких-либо изменений в результатах? код работает точно так же ...

Благодарность


person Fab    schedule 20.05.2020    source источник


Ответы (1)


Следующий код основан на:

  • Предопределенные категории
  • На основе веса продукта (продуктов, относящихся к заранее определенным категориям)
  • Комиссия увеличивается пошагово

(комментарий с пояснением добавлен в код)

function shipping_weight_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    /* SETTINGS */

    // Specific categories
    $specific_categories = array( 'categorie-1', 'categorie-2' );

    // Initial fee
    $fee = 1.20;

    // Steps of kg
    $steps_of_kg = 3;

    /* END SETTINGS */

    // Set variable
    $total_weight = 0;

    // Loop though each cart item
    foreach ( $cart->get_cart() as $cart_item ) {
        // Get product id
        $product_id = $cart_item['product_id'];

        // Get weight
        $product_weight = $cart_item['data']->get_weight();

        // NOT empty & has certain category     
        if ( ! empty( $product_weight ) && has_term( $specific_categories, 'product_cat', $product_id ) ) {
            // Quantity
            $product_quantity = $cart_item['quantity'];

            // Add to total
            $total_weight += $product_weight * $product_quantity;
        }
    }

    if ( $total_weight > 0 ) {          
        $increase_by_steps = ceil( $total_weight / $steps_of_kg );

        // Add fee
        $cart->add_fee( __( 'Extra for ice' ), $fee * $increase_by_steps, false );      
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'shipping_weight_fee', 10, 1 );
person 7uc1f3r    schedule 20.05.2020