为了让你的代码工作,你还需要下面的挂钩函数:
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;
// Set cart item shipping class ID
$item['data']->set_shipping_class_id($term_id);
}
}
}
代码位于您的子主题的unctions.php文件中(或在插件中).应该能行得通.
现在,您可以在您的函数中直接设置发货类别术语ID,而不是如下所示的附件:
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_id']) && !empty($item['shipping_class_id']) ) {
// Set cart item shipping class ID
$item['data']->set_shipping_class_id($item['shipping_class_id']);
}
}
}
它也应该起作用.
相关:WooCommerce: Change Shipping Class conditionally for specific Zone