在 WooCommerce 订阅续订订单中设置运输方式

Set the shipping method in WooCommerce Subscriptions renewal orders

提问人:Geoffrey Servant 提问时间:9/12/2023 最后编辑:LoicTheAztecGeoffrey Servant 更新时间:9/12/2023 访问量:154

问:

当用户使用每月创建订单的循环选项购买产品时,没有设置运输方式。只有父订单有配送方式,所有子订单都没有配送方式。

我想在创建定期订单时将父配送方式添加到所有子订单中。

在这里我尝试过但不起作用的代码,我想在创建子订单时添加父订单的运输方式。

add_action('woocommerce_new_order', 'add_colissimo_method', 10, 1);

function add_colissimo_method($order_id) {
    $order = wc_get_order($order_id);

  
    if ($order->get_shipping_method()) {
        return; 
    }


        $subscriptions = wcs_get_subscriptions_for_order($renewal_order_id);

        if (!empty($subscriptions)) {
    
            $parent_order_id = $subscriptions[0]->get_parent_id();

            if (!empty($parent_order_id)) {
                $parent_order = wc_get_order($parent_order_id);
                $parent_shipping_method = $parent_order->get_shipping_method();
                update_post_meta($renewal_order_id, '_shipping_method', $parent_shipping_method);
            }
     }

    $order->save();
    
}
php woocommerce 方法 orders woocommerce-subscriptions

评论

0赞 Snuffy 9/12/2023
这是错误的钩子。使用此文档 - woocommerce.com/document/subscriptions/develop/action-reference 。这个钩子woocommerce_subscription_renewal_payment_complete就是你所需要的。从那里您可以访问订单数据并更新。

答:

2赞 LoicTheAztec 9/12/2023 #1

您没有以正确的方式执行此操作,并且需要使用 WC 订阅过滤器挂钩

请尝试以下操作(代码已注释):

add_filter( 'wcs_new_order_created', 'add_shipping_items_to_renewal_orders', 10, 3 );
function add_shipping_items_to_renewal_orders( $order, $subscription, $type ) {
    // Targeting renewal orders only
    if ( $type === 'renewal_order' ) {
        // Get the parent order (initial order)
        $parent_order = $subscription->get_related_orders('all', 'parent');
        $parent_order = reset($parent_order);

        // Set the array for tax calculations
        $calculate_tax_for = array(
            'country'   => $parent_order->get_shipping_country(),
            'state'     => $parent_order->get_shipping_state(),
            'postcode'  => $parent_order->get_shipping_postcode(),
            'city'      => $parent_order->get_shipping_city(),
        );

        // Loop through parent order "shipping" items
        foreach( $parent_order->get_items('shipping') as $parent_item ) {
            $item  = new WC_Order_Item_Shipping(); // create a new empty order item "shipping"
            $item->set_method_title( $parent_item->get_method_title() ); // set the existing Shipping method title
            $item->set_method_id( $parent_item->get_method_id() ); // set an existing Shipping method rate ID
            $item->set_total( $parent_item->get_total() );  // set an existing Shipping method total
            $item->calculate_taxes( $calculate_tax_for );  // Calculate taxes for the item

            $order->add_item( $item ); // Add the shipping item to the renewal order
        }
        $order->calculate_totals(); // recalculate totals and save
    }
    return $order;
}

它应该有效。

相关: 添加、更新或删除 WooCommerce 运输订单项目


评论

0赞 Geoffrey Servant 9/12/2023
它工作得很好,非常感谢!最后一个问题,我如何为运费设置免费税费,因为我想为续订订单提供免费运费。
0赞 Geoffrey Servant 9/12/2023
没有税的代码不起作用,但我仍然会计算税款并避免用户选择让他纳税的运费,我正在尝试在我的购物车中订阅时停用运输方式,但我不知道如何
0赞 Geoffrey Servant 9/12/2023
可能有一个误会,我想删除一个特定的运输方式并保留其他的。我目前有三种方法,我想删除计时码表。
0赞 LoicTheAztec 9/12/2023
这些 Chronopost 运输方式的运费 ID 是什么?...您可以通过检查单选按钮输入字段并获取属性名称值来获取此费率 ID。
0赞 LoicTheAztec 9/12/2023
如果你问一个新问题,也许会更好,因为这与你最初的问题不同。那你可以在这里通知我,我会尽力回答。