Woocommerce 每件商品统一运费

Woocommerce 每件商品统一运费,woocommerce,checkout,hook-woocommerce,Woocommerce,Checkout,Hook Woocommerce,我想以编程方式进行每种产品的发货。我不想使用这个插件。这似乎很容易: 为每个产品添加名为“发货价格”的元字段 挂钩到收银台,并根据购物车中的每个产品“发货价格”更新发货 我知道怎么做。但是关于实现#2?的最佳方法的任何想法都可以通过以下方式实现,使用get#u post\u meta获取meta字段“shipping\u price” 注1:为了测试该代码,添加了一行伪数据 注2:不要忘记指定$rate->method\u id function filter\u woodcommerce\u

我想以编程方式进行每种产品的发货。我不想使用这个插件。这似乎很容易:

  • 为每个产品添加名为“发货价格”的元字段
  • 挂钩到收银台,并根据购物车中的每个产品“发货价格”更新发货

  • 我知道怎么做。但是关于实现#2?

    的最佳方法的任何想法都可以通过以下方式实现,使用
    get#u post\u meta
    获取meta字段
    “shipping\u price”

    注1:为了测试该代码,添加了一行伪数据

    注2:不要忘记指定
    $rate->method\u id

    function filter\u woodcommerce\u package\u费率($rates,$package){
    if(is_admin()&&!defined('DOING_AJAX'))返回;
    //设置变量
    $cost=0;
    //循环浏览行项目
    foreach($package['contents']作为$line\u项目){
    //获取产品id
    $product_id=$line_项目['product_id'];
    //数量
    $quantity=$line_项目['quantity'];
    //获取后元
    $shipping\u price=get\u post\u meta($product\u id,'shipping\u price',true);
    //调试,出于测试目的,请稍后删除!!
    $shipping_价格=10;
    如果($shipping_price){
    $cost+=$shipping\u price*$数量;
    }
    }
    如果($cost>0){
    //(多个)
    foreach($rate作为$rate\u key=>$rate的费率){
    //瞄准
    if(在数组中($rate->method\u id,数组('free\u shipping','distance\u rate','table\u rate')){
    //固定费率成本
    $rates[$rate\u key]->cost=$cost;
    }
    }   
    //单身
    //固定费率成本
    //$rates['free_shipping']->cost=$cost;
    }
    返回美元汇率;
    }
    添加过滤器('woocommerce\u package\u rates','filter\u woocommerce\u package\u rates',100,2);
    
    展开7uc1f3rs答案。我不得不稍加修改,使其与WooCommerce 3.0+的新方式配合使用

    $rates[$rate_key]->cost = $cost;
    
    需要

    $rates[$rate_key]->set_cost($cost);
    
    您可以使用中的函数获取$rates

    function filter_woocommerce_package_rates( $rates, $package ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
    // Set variable
    $cost = 0; 
    
    // Loop through line items
    foreach( $package['contents'] as $line_item ) {
        // Get product id
        $product_id = $line_item['product_id'];
    
        // Quantity
        $quantity = $line_item['quantity'];
    
        // Get post meta
        //$shipping_price = get_post_meta( $product_id, 'shipping_price', true);
    
        // DEBUG, for testing purposes, REMOVE AFTERWARDS!!
        $shipping_price = 10;
    
        if ( $shipping_price ) {
            $cost += $shipping_price * $quantity;
        }
    }
    
    if ( $cost > 0 ) {
        // (Multiple)
        foreach ( $rates as $rate_key => $rate ) {
    
            // Targeting
            if ( in_array( $rate->method_id, array( 'free_shipping', 'flat_rate' ) ) ) {
                // Set rate cost
                // use functions from https://docs.woocommerce.com/wc-apidocs/class-WC_Shipping_Rate.html
                $rates[$rate_key]->set_cost($cost);
            }
        }
    
        // Single
        // Set rate cost
        //$rates['flat_rate:1']->set_cost($cost);
    
        // use this to see your rates
        //echo '<pre>'; print_r($rates); echo '</pre>';
    }
    
    return $rates;
    }
    add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 100, 2 );
    
    function filter\u woodcommerce\u package\u费率($rates,$package){
    if(is_admin()&&!defined('DOING_AJAX'))返回;
    //设置变量
    $cost=0;
    //循环浏览行项目
    foreach($package['contents']作为$line\u项目){
    //获取产品id
    $product_id=$line_项目['product_id'];
    //数量
    $quantity=$line_项目['quantity'];
    //获取后元
    //$shipping\u price=get\u post\u meta($product\u id,'shipping\u price',true);
    //调试,出于测试目的,请稍后删除!!
    $shipping_价格=10;
    如果($shipping_price){
    $cost+=$shipping\u price*$数量;
    }
    }
    如果($cost>0){
    //(多个)
    foreach($rate作为$rate\u key=>$rate的费率){
    //瞄准
    如果(在数组中($rate->method\u id,数组('free\u shipping','flat\u rate')){
    //固定费率成本
    //使用来自的函数https://docs.woocommerce.com/wc-apidocs/class-WC_Shipping_Rate.html
    $rates[$rate\u key]->设置成本($cost);
    }
    }
    //单身
    //固定费率成本
    //$rates['flat_rate:1']->set_成本($cost);
    //使用此项查看您的费率
    //回显“”;打印($rates);回显“”;
    }
    返回美元汇率;
    }
    添加过滤器('woocommerce\u package\u rates','filter\u woocommerce\u package\u rates',100,2);
    
    我已经回答了你的问题。为了在我的答案中给出一个合适的答案,而不提供多个选项,如果您可以使用步骤1中的代码更新您的问题,那将非常有趣。也许不是为了你自己,而是为了其他想用这个问题回答的用户,谢谢!这真的很接近。你的单费率成本是$费率['免费送货]->成本=$成本;需要$费率[‘固定费率:1']->固定成本($cost);事实上,我的回答考虑了几个选项,因为你的问题相当“广泛”。当做