WooCommerce基于数量的额外费用

时间:2020-03-16 17:52:39

标签: woocommerce cart checkout fee

这是我想要实现的过程: 1.产品页面上有一个复选框,用户可以决定是否在产品旁边添加自定义服务 2.如果用户选中此框,则会向购物车中添加自定义费用,但这是基于产品数量的 例如:如果用户在购物车中添加了2种相同商品,并且选中了此复选框,则会自动向购物车中添加2倍的自定义费用。

有人可以帮我吗? (我尝试使用尽可能少的插件,因此请尝试通过php代码段实现此目的)

这是我的代码(它将自定义费用添加一次):

<?php
function transfer_fee() {
    if ( has_term( 'transfer', 'product_cat' ) ) {
        echo '<label><input type="checkbox" name="transfer" value="No">Add transfer (1 USD / person)</label>';
    } elseif {
        echo 'No transfer';
    }
}
add_action( 'woocommerce_before_add_to_cart_quantity', 'transfer_fee' );

function store_transfer_fee( $cart_item, $product_id ) {
    if( isset( $_POST['transfer'] ) ) $cart_item['transfer'] = $_POST['transfer'];
     return $cart_item;
}
add_filter( 'woocommerce_add_cart_item_data', 'store_transfer_fee', 10, 2 );

function add_checkout_transfer_fee() {
     foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
                if ( isset( $cart_item['transfer'] ) ) {
                        $itsagift = true;
                        break;
                }
        }
        if ( $itsagift == true ) WC()->cart->add_fee( 'Transfer', 1 );
}
add_action( 'woocommerce_cart_calculate_fees', 'add_checkout_transfer_fee' );
?>

1 个答案:

答案 0 :(得分:0)

假设您是这个意思吗?

// Add checkbox before add to cart quantity
function transfer_fee() {
    if ( has_term( 'transfer', 'product_cat' ) ) {
        echo '<label><input type="checkbox" name="transfer" value="No">Add transfer (1 USD / person)</label>';
    } else {
        echo 'No transfer';
    }
}
add_action( 'woocommerce_before_add_to_cart_quantity', 'transfer_fee' );

// Add the cart meta data.
function store_transfer_fee( $cart_item_data, $product_id, $variation_id ) {
    if( isset( $_POST['transfer'] ) ) {
        $cart_item_data['transfer'] = $_POST['transfer'];
    }
    return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'store_transfer_fee', 10, 3 );

// Calculate fees
function add_checkout_transfer_fee( $cart_object ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( isset( $cart_item['transfer'] ) ) {
            $itsagift = true;

            // Get quantity
            $quantity = $cart_item['quantity'];

            break;
        }
    }

    // Set fee
    $fee = 1;

    // True
    if ( $itsagift ) {
        WC()->cart->add_fee( 'Transfer', $fee * $quantity );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'add_checkout_transfer_fee', 10, 1 );