在 WooCommerce 管理中手动创建订单时获取产品的税率

问题描述

我正在尝试从 WooCommerce 订单中的订单商品中获取所有产品税率

根据 Get tax rate used in an order for one product and for shipping in WooCommerce 答案代码,我为订单商品构建了一个循环:

foreach ($order->get_items() as $item_key => $item_value) {
    $item_data = $item_value->get_data();

    $product_id = $item_value['product_id'];
    $product = wc_get_product($product_id);
    $wc_product = $item_value->get_product(); // prodotto in WooCommerce
    $sku = '';
    if(!empty($wc_product))
        $sku = $wc_product->get_sku();
    $product_type = $item_value->get_type();

    if ($item_data['variation_id'] !== 0) {
        $variation = $item_data['variation_id'];
        $var_data = new \WC_Product_Variation($variation);
        $var_attr = implode(',',$var_data->get_variation_attributes());
    }

    $tax_rates = \WC_Tax::get_rates($item_data['tax_class']);
    if (!empty($tax_rates)) {
        $tax_rate = reset($tax_rates);
    } 
    
    $rateId = key($tax_rates);
    $rate = \WC_Tax::get_rate_percent_value($rateId);   
    $rateDescription = \WC_Tax::get_rate_label($rateId);
    
    
    /* in questo array ho tutti i dati che mi servono,*  sotto la chiave data raggruppo item_data
    */ 
    $order_items_data[] = array(
      'product_id' => $product_id,'sku' => $sku,'product_type' => $product_type,'variation_attr' => $var_attr,'price' => $fixnum($item_data['subtotal'] / $item_data['quantity'],6),'discount' => $item_data['subtotal'] - $item_data['total'],'tax_rate' => $rate,'tax_description' => $rateDescription,'tax_id' => $rateId,'data' => $item_data
   );
}

站点前端添加订单时,此代码可以正常工作。 当我通过管理员添加新订单时,我得到一个空的 $tax_rates 数组,这是我的问题。有什么建议吗?

解决方法

终于找到了解决办法:

在这个片段之后

$tax_rates = \WC_Tax::get_rates($item_data['tax_class']);
    if (!empty($tax_rates)) {
        $tax_rate = reset($tax_rates);
    } 
    
    $rateId = key($tax_rates);
    $rate = \WC_Tax::get_rate_percent_value($rateId);   
    $rateDescription = \WC_Tax::get_rate_label($rateId);

我添加了以下几行:

if (empty($rateId)) {
    $usedRate = array_filter($item_data['taxes']['total']);
    $rateId = key($usedRate);
    $rate = \WC_Tax::get_rate_percent_value($rateId);
    $rateDescription = \WC_Tax::get_rate_label($rateId);
}

这是因为如果产品使用其他税号,则 $item_data['taxes']['total'] 数组包含一个空值。

我希望一切都清楚