我们在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 );

在具有正确段塞(小测试)的发运分类和区域的发运方法中,在发运分类成本部分中设置分类.

不过,我看不到购物车的价格有什么变化.也许不能像这样添加发货类?

推荐答案

为了让你的代码工作,你还需要下面的挂钩函数:

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

Php相关问答推荐

为什么这个方法调用用引号和花括号包裹?

WooCommerce拆分运输包裹上的商品数量增加运输成本

将一个数字分配到一系列因素中(就像贪婪算法)

PHP原始数据读取引发max_input_vars错误

WooCommerce HPOS管理订单列表中带有订单元数据的定制列

在WooCommerce中设置带有国家/地区和年份前缀的顺序序号

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

WooCommerce在购买后多次重定向

将一个情态形式放在细丝v3中的形式中间

使用MySQLi使用连接字符串设置字符集

以编程方式同步 WPML 翻译更改 Woocommerce 产品销售价格

根据页面以及是否在促销,向 WooCommerce 中显示的价格添加前缀

提交仅包含活动详细信息选项卡表单的主表单

Woocommerce的数量和价格条件

如何在 Laravel 中修改嵌套数组的键?

使用来自 PHP 表单的数据更新 xml 命名空间

PHP for each 函数打印 td

使用 v-for 的存储链接中的 Img src 在 Laravel vuejs 中不起作用

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?

无法按今天加上 7 天显示数据库项目