Получите налоговую этикетку для каждого элемента заказа в Woocommerce 3

Я пытаюсь получить ярлык налога в WooCommerce для каждого элемента заказа.

Например: 2x Продукт 1 - 19% MwSt. (налог) 4x Продукт 2 - 19% MwSt. (налог) 1x Продукт 2 - 19% MwSt. (налог)

Поэтому я добавил налоги «19% (налог)» в качестве стандартного значения и «7% (налог)» в качестве уменьшенного налога в настройках woocommerce. Я также установил, что хочу отображать и вводить цены в WooCommerce «без налогов».

Теперь я разместил заказ с этими двумя товарами (цифровым и загружаемым), а затем я пытаюсь получить налоговую стоимость каждой позиции заказа.

$wc_order = wc_get_order(143);
foreach ($wc_order->get_items(array('line_item')) as $item_id => $line_item) {

      $order_product_detail = $line_item->get_data();

      $item_tax_class = $order_product_detail['tax_class'];
      $item_subtotal_tax = $order_product_detail['subtotal_tax'];
      $item_total_tax = $order_product_detail['total_tax'];
      $item_taxes_array = $order_product_detail['taxes'];

      var_dump($item_tax_class);
      var_dump($item_subtotal_tax);
      var_dump($item_total_tax);
      var_dump($item_taxes_array);
}

Это результат:

string(0) "" string(4) "0.76" string(6) "0.2185" array(2) { ["total"]=> array(1) { [1]=> string(6) "0.2185" } ["subtotal"]=> array(1) { [1]=> string(4) "0.76" } } string(0) "" string(4) "0.38" string(6) "0.2451" array(2) { ["total"]=> array(1) { [1]=> string(6) "0.2451" } ["subtotal"]=> array(1) { [1]=> string(4) "0.38" } } string(0) "" string(4) "2.85" string(5) "2.166" array(2) { ["total"]=> array(1) { [1]=> string(5) "2.166" } ["subtotal"]=> array(1) { [1]=> string(4) "2.85" } } string(0) "" string(4) "0.76" string(6) "0.6251" array(2) { ["total"]=> array(1) { [1]=> string(6) "0.6251" } ["subtotal"]=> array(1) { [1]=> string(4) "0.76" } } string(0) "" string(4) "0.95" string(6) "0.8151" array(2) { ["total"]=> array(1) { [1]=> string(6) "0.8151" } ["subtotal"]=> array(1) { [1]=> string(4) "0.95" } } string(0) "" string(4) "1.14" string(6) "1.0051" array(2) { ["total"]=> array(1) { [1]=> string(6) "1.0051" } ["subtotal"]=> array(1) { [1]=> string(4) "1.14" } } string(0) "" string(4) "1.52" string(6) "1.3851" array(2) { ["total"]=> array(1) { [1]=> string(6) "1.3851" } ["subtotal"]=> array(1) { [1]=> string(4) "1.52" } }

Так как это не дает мне ярлыка налога на позицию, я попробовал следующее:

$wc_order = wc_get_order(143);
foreach ($wc_order->get_items(array('line_item')) as $item_id => $line_item) {
       $order_item_tax = new WC_Order_Item_Tax($item_id);
       var_dump($order_item_tax->get_label());
}

Это результат:

string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer" string(14) "Mehrwertsteuer"

Но это должно быть «19% MwSt.».

Итак, я попробовал вот это:

$wc_order = wc_get_order(143);
foreach ($wc_order->get_items(array('tax')) as $item_id => $line_item) {
     var_dump($line_item->get_label());
}

Это выводит:

string(10) "19 % MwSt."

Так что да, это значение, которое мне нужно, но почему он выводит это значение только один раз, когда у меня семь элементов в заказе?

Есть ли шанс получить налоговую метку для каждой позиции заказа или это невозможно в WooCommerce? Моя цель - создать программу счетов-фактур, но я должен учитывать, есть ли разные налоговые ставки для каждой строки.

Версия WooCommerce - 3.4.2

заранее спасибо


person Janine Kroser    schedule 07.06.2018    source источник


Ответы (1)


Следующий код работает с Woocommerce версии 3.

Это позволит вам получить налоговую этикетку, а их может быть много в заказе, в зависимости от ваших налоговых настроек, настроек продукта и настроек доставки.

// Get an instance of the WC_order object
$order = wc_get_order(143);

// Initializing variables
$tax_items_labels   = array(); // The tax labels by $rate Ids
$shipping_tax_label = '';      // The shipping tax label

// 1. Loop through order tax items
foreach ( $order->get_items('tax') as $tax_item ) {
    // Set the tax labels by rate ID in an array
    $tax_items_labels[$tax_item->get_rate_id()] = $tax_item->get_label();

    // Get the tax label used for shipping (if needed)
    if( ! empty($tax_item->get_shipping_tax_total()) )
        $shipping_tax_label = $tax_item->get_label();
}

// 2. Loop through order line items and get the tax label
foreach ( $order->get_items() as $item_id => $item ) {
    $taxes = $item->get_taxes();
    // Loop through taxes array to get the right label
    foreach( $taxes['subtotal'] as $rate_id => $tax ){
        $tax_label = $tax_items_labels[$rate_id]; // <== Here the line item tax label
        // Test output line items tax label
        echo '<pre>Item Id: '.$item_id.' | '; print_r($tax_label); echo '</pre>';
    }
}

// Test output shipping tax label
echo '<pre>Shipping tax label: '; print_r($shipping_tax_label); echo '</pre>';

Протестировано в Woocommerce версии 3.4.2

person LoicTheAztec    schedule 07.06.2018
comment
Спасибо, это действительно работает правильно, и WooCommerce использует аналогичный метод на странице сведений о заказе, поэтому я думаю, что нет более простого способа сделать это. - person passatgt; 25.05.2019
comment
Я работал над чем-то похожим, и, возможно, это будет полезно для некоторых людей: шаблон cart.php с дополнительным столбцом, отображающий сумму и ставку налога по позиции: github.com/saskia/ - person Saskia; 20.07.2020
comment
@Saskia Да, но хуки - лучший способ: 1) вам не нужно обновлять шаблоны, когда WooCommerce обновляет связанный шаблон. 2) Некоторые темы уже включают настройки шаблонов, поэтому необходимо внести необходимые изменения в шаблон темы, который вы должны скопировать перед дочерней темой ... Мой код ответа здесь просто показывает, как это сделать. - person LoicTheAztec; 20.07.2020