WooCommerce:对组合产品征收增值税

时间:2013-09-10 作者:dantz

我是WooCommerce的新手,我的问题是分组产品总是显示默认增值税,因为我无法更改分组产品的税收设置。由分组产品组合而成的简单产品具有降低率。

因此,我可能必须将我(子)主题中的输出更改为第一个连接的简单产品的VAT,对吗?

我该怎么做?

**编辑**

我对这家商店计算增值税的错误没有意见。我在显示分组产品的税时遇到问题。它显示分组产品的默认速率,即使所有连接的简单产品的速率都降低了。由于我必须在德国的产品页面上显示价格,我必须改变这一点。

2 个回复
SO网友:Nicolai Grossherr

code update:

add_action( \'woocommerce_grouped_product_list_before_price\', 
            \'woocommerce_grouped_product_tax_on_single\', 10, 1, $child_product, $mode );

function woocommerce_grouped_product_tax_on_single( $child_product, $mode = null ) {
//uncomment next line and choose one of the output options from »switch case "{OPTION}"«
//$mode = \'tax-name-rate-amount\';
    $_taxobj = new WC_Tax();
    $obj = $_taxobj->get_shop_base_rate($child_product->get_tax_class());
    $i_or_e = get_option(\'woocommerce_prices_include_tax\') == \'no\' ? \'excl.\' : \'incl.\'; 
?>
    <td class="grp_tax">
    <?php
        foreach ( $obj as $sobj ) {

           $stax = woocommerce_price( $sobj[\'rate\'] / 100 * 
                   ( get_option(\'woocommerce_prices_include_tax\') == \'no\' ? 
                   $child_product->get_price_including_tax() : 
                   $child_product->get_price_excluding_tax() ) );

            switch ($mode) {
                case null:
                    $format = " %s %s";
                    $variables = array($i_or_e, $sobj[\'label\']);
                    break;
                case "tax-name":
                    $format = " %s %s";
                    $variables = array($i_or_e, $sobj[\'label\']);
                    break;
                case "tax-name-rate":
                    $format = " %s %s %s%%";
                    $variables = array($i_or_e, 
                                        $sobj[\'label\'], 
                                        number_format($sobj[\'rate\']));
                    break;
                case "tax-name-rate-amount":
                    $format = " %s %s (%s%% - %s)";
                    $variables = array($i_or_e, 
                                        $sobj[\'label\'], 
                                        number_format($sobj[\'rate\']), 
                                        $stax);
                    break;
            }
            $output = vsprintf($format, $variables);
        }
        echo $output;
        ?>
    </td>
    <?php
}
更新后的代码基本相同,但有一些新特性。正如@noxoc指出的那样,使用钩子会更好。上述代码使用woocommerce_grouped_product_list_before_price 要挂接的操作。这个已经在内部定义grouped.php. 不幸的是,在我看来,这读起来并不好,因为你会得到这样的东西»tax information price«,就我个人而言,我希望它读起来像»price tax information«。为此,我添加了一个操作woocommerce_grouped_product_list_after_price 在…内grouped.php:

    //this is the existing action
    <?php do_action ( \'woocommerce_grouped_product_list_before_price\', 
                      $child_product[\'product\'] ); ?>
    //this is the table cell for the price
    <td class="price">
        {SOME CODE}
    </td>
    //this is the NEW action you have to add yourself
    <?php do_action ( \'woocommerce_grouped_product_list_after_price\', 
                      $child_product[\'product\'] ); ?>
正如您所看到的,新操作几乎复制了现有操作。如果添加了操作,则可以更改add_action() 在上面的代码中输入一行以使用它:

    add_action( \'woocommerce_grouped_product_list_after_price\', 
    \'woocommerce_grouped_product_tax_on_single\', 10, 1, $child_product, $mode );
此外,我还添加了一些选项来选择在输出上显示哪些信息。您必须设置$mode 变量。这应该是不言自明的-请参阅代码中的注释。例如,这可以用于在后端的选项页面上设置变量。除此之外,当然可以更改输出的格式,只需按照代码中的用例进行操作即可




code:

    $_taxobj = new WC_Tax();
    $obj = $_taxobj->get_shop_base_rate($child_product[\'product\']->get_tax_class());

    $i_or_e = get_option(\'woocommerce_prices_include_tax\') == \'no\' ? \'excl.\' : \'incl.\';
    foreach ( $obj as $sobj ) { printf(" %s %s%% %s", $i_or_e, number_format($sobj[\'rate\']), $sobj[\'label\']); }
这将进入grouped.php 位于{THEME-FOLDER}/woocommerce/single-product/add-to-cart/ 内部<td class="price">{CONTENT INSIDE}</td> 密码代码能够区分included/excluded tax 根据tax rate 以及tax label 对于集团内部的简单产品。

SO网友:nocksock

您可以向产品组添加自定义字段,例如。tax_class 然后用函数中的过滤器覆盖它。php。示例:

add_filter( \'woocommerce_de_print_including_tax\', \'foo_woocommerce_de_print_including_tax\', 10 , 1);
function foo_woocommerce_de_print_including_tax($value) {
    global $product;
    $product->tax_class = get_post_meta($product->id, \'tax_class\', true);
    return $value;
}
然而,我不确定哪种过滤器最适合。这看起来有点脏,但应该可以做到。

结束