Php 在WooCommerce中,每10个订单设置一个自定义运费

Php 在WooCommerce中,每10个订单设置一个自定义运费,php,wordpress,woocommerce,hook-woocommerce,shipping,Php,Wordpress,Woocommerce,Hook Woocommerce,Shipping,WP 5.3.3 我需要在订单创建后以编程方式更改运输成本 此代码不影响: add_action('woocommerce_new_order', 'custom_shipping_costs', 1, 1); function custom_shipping_costs($order_id) { $order = wc_get_order($order_id); $shippingItems = (array) $order->get_items('shipping')

WP 5.3.3

我需要在订单创建后以编程方式更改运输成本

此代码不影响:

add_action('woocommerce_new_order', 'custom_shipping_costs',  1, 1);
function custom_shipping_costs($order_id)
{
    $order = wc_get_order($order_id);
    $shippingItems = (array) $order->get_items('shipping');
    foreach ($shippingItems as $item) {
        $item->cost = 0;
    }
    $order->save();
}
请帮帮忙

更新1:

add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );
function woocommerce_package_rates( $rates ) {
    foreach($rates as $key => $rate ) {
        $rates[$key]->cost = 10;
    }
    return $rates;
}
重要的是,我需要在每个第n个订单中更改装运价格。 大概是这样的:

if ($order_id % 10 == 0) {
    // change shipping price for every 10-th order
}
更新2(解决方案):

add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );
function woocommerce_package_rates( $rates ) {
    foreach($rates as $key => $rate ) {
        $rates[$key]->cost = 10;
    }
    return $rates;
}
感谢@LoicTheAztec-解决方案基于以下内容,但有一些改动:

  • 设置选项
    ->
    更新选项
  • set\u total\u tax
    抛出一个错误,所以我对这部分做了一点修改()
  • 最后一段代码(位于活动子主题或活动主题的
    functions.php
    文件中):


    更改运输价格的简单方法如下:

    add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );
    function woocommerce_package_rates( $rates ) {
        foreach($rates as $key => $rate ) {
            $rates[$key]->cost = 10;
        }
        return $rates;
    }
    
    根据数量或总价添加条件语句(如适用)

    add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates', 10, 2 );
    function woocommerce_package_rates( $rates, $package ) {
        $new_cost = ( WC()->cart->subtotal < 10 ) ? 4.5 : 2.5;
        foreach($rates as $key => $rate ) {
            $rates[$key]->cost = $new_cost;
        }
        return $rates;
    }
    
    add_filter('woocommerce_package_rates','woocommerce_package_rates',10,2);
    功能商务套餐费率($rates,$package){
    $new_成本=(WC()->购物车->小计<10)?4.5:2.5;
    foreach($key=>$rate){
    $rates[$key]->成本=$new_成本;
    }
    返回美元汇率;
    }
    
    首先,订单ID不是连续的,因为它们基于WoodPress页面、帖子和所有其他自定义帖子(如Woocommerce产品和优惠券)上使用的帖子ID。因此,我们需要对您的WooCommerce订单启用顺序计数,以便每10个订单进行一次更改

    在将订单数据保存到数据库之前下订单时,以下内容将每10个订单的运输成本设置为零:

    // Set a count based on placed orders for shipping items cost change
    add_action( 'woocommerce_checkout_create_order', 'action_wc_checkout_create_order', 10, 2 );
    function action_wc_checkout_create_order( $order, $data ) {
        $orders_count = (int) get_option('wc_orders_count_for_shipping'); // get $order count for shipping item change
    
        // Increase count for next order (starting count at 2 as this hook is triggered after shipping items hook)
        set_option('wc_orders_count_for_shipping', $orders_count > 0 ? $orders_count + 1 : 2 ); 
    }
    
    // Set shipping cost to zero every 10-th orders when order is placed
    add_action( 'woocommerce_checkout_create_order_shipping_item', 'action_wc_checkout_create_order_shipping_item', 10, 4 );
    function action_wc_checkout_create_order_shipping_item( $item, $package_key, $package, $order ) {
        $orders_count = (int) get_option('wc_orders_count_for_shipping');
    
        // Every 10-th orders 
        if( $orders_count > 0 && ( $orders_count % 10 ) === 0 ) {
            $item->set_total( '0' );
            $item->set_taxes( [ 'total' => '0' ] );
            $item->set_total_tax( '0' );
        }   
    } 
    

    代码进入活动子主题(或活动主题)的functions.php文件。它应该有效。

    我们无意将现有答案复制/粘贴为答案,而是参考现有答案。&谢谢,但我需要更改每第n个订单的装运价格。在我的示例代码中,我将添加如下内容:
    如果($order_id%10==0){//更改每10次订单的发货价格}
    这就是我在问题“创建订单后”中注意到的原因。在你的例子中可能吗?也许我遗漏了什么…@7uc1f3r它从来没有复制粘贴的意图,我也没有。此外,我不知道是否有你强调的现有答案。我在我的一个项目中使用了相同的代码。无论如何,谢谢你。只要它能帮助提出问题的人。@LoicTheAztec请看一下“更新1”-这是关键逻辑。我相信在下订单后,当有实际订单时,我需要立即更改装运价格。明白……我已经回答了。谢谢,你的回答非常有用。我根据您的代码完成了我的原始问题和解决方案。