Woocommerce - 在添加到购物车时向动态创建的产品添加运输类别

问题描述 投票:0回答:1

我们在 Woocommerce 之外有一个产品创建向导。当产品添加到购物车时,我想根据产品尺寸添加运输类别。

我在 custom-functions.php 中有这个

function add_shipping_class_to_cart_item( $cart_item_data, $product_id, $variation_id )
{

    //snip conditionals
    $cart_item_data['shipping_class'] = 'test-small';

    return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_shipping_class_to_cart_item', 10, 3 );

在“运输”>“类别”中使用正确的 slug(测试小)以及在该区域的“运输方法”中的“运输类别成本”部分中设置类别。

但我在购物车中没有看到价格变化。也许这样不能添加运费等级?

php wordpress woocommerce product cart
1个回答
0
投票

为了使您的代码正常工作,您还需要以下挂钩函数:

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

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        // Check for 'shipping_class' custom cart item data
        if( isset($item['shipping_class']) && !empty($item['shipping_class']) ) {
            // Get the shipping class term Id from the term slug
            $term_id = get_term_by('slug', $item['shipping_class'], 'product_shipping_class')->term_id;
            // Change cart item shipping class
            $cart_item['data']->set_shipping_class_id($term_id);
        }
    }
}

代码位于子主题的functions.php 文件中(或插件中)。应该可以。


现在您可以直接在函数中设置运输类别术语 Id,而不是像这样的 slug:

add_filter( 'woocommerce_add_cart_item_data', 'add_shipping_class_as_custom_cart_item_data', 10, 3 );
function add_shipping_class_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id )
{

    //snip conditionals
    $cart_item_data['shipping_class_id'] = 33; // <== Here set the correct shipping class ID

    return $cart_item_data;
}

然后你将使用:

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

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        // Check for 'shipping_class_id' custom cart item data
        if( isset($item['shipping_class']) && !empty($item['shipping_class_id']) ) {
            // Change cart item shipping class
            $cart_item['data']->set_shipping_class_id($item['shipping_class_id']);
        }
    }
}

它应该也能工作。

© www.soinside.com 2019 - 2024. All rights reserved.