5

我正在尝试向我的结帐页面添加一个表单,因此当用户单击“免税”复选框时,将弹出一个文本框并询问用户免税 ID 号是什么。

我把所有这些都做得很好,我什至将这个update_totals_on_change类添加到我的表单字段中,这样它就会更新总数。

我的下一步是在方法上添加一个操作/过滤器,这样当update_totals_on_change执行时,我可以将 tax 设置为 0,然后它将完成计算总数。

有谁知道我可以连接哪些功能?

查看 中的checkout.js文件WooCommerce,他们将操作设置woocommerce_update_order_reviewajax操作。

我试着跟随它,但很快就迷路了。

我在想我可以通过挂钩来添加一些帖子数据woocommerce_checkout_update_order_review

然后连接woocommerce_before_calculate_totals到修改税收的东西,但我不知道我需要修改什么。

我是否走在正确的道路上?

4

5 回答 5

5

好吧,我终于想通了,以防有人感兴趣。

在我的插件中,我通过连接到这个函数在订单备注之后制作了一个表格:'woocommerce_before_order_notes'

add_action('woocommerce_before_order_notes', array(&$this, 'taxexempt_before_order_notes') );

我的“taxexempt_before_order_notes”函数包含:

function taxexempt_before_order_notes( $checkout ) {

        echo '<div style="clear: both"></div>

        <h3>Tax Exempt Details</h3>';

        woocommerce_form_field( 'tax_exempt_checkbox', array(
            'type'          => 'checkbox',
            'class'         => array('tiri taxexempt'),array( 'form-row-wide', 'address-field' ),
            'label'         => __('Tax Exempt'),
            ), $checkout->get_value( 'tax_exempt_checkbox' ));

        woocommerce_form_field( 'tax_exempt_name', array(
            'type'          => 'text',
            'class'         => array('form-row-first', 'tiri', 'taxexempt', 'textbox', 'hidden'),
            'label'         => __('Tax Exempt Name'),
            ), $checkout->get_value( 'tax_exempt_name' ));

        woocommerce_form_field( 'tax_exempt_id', array(
            'type'          => 'text',
            'class'         => array('form-row-last', 'tiri', 'taxexempt', 'textbox', 'hidden', 'update_totals_on_change'),
            'label'         => __('Tax Exempt Id'),
            ), $checkout->get_value( 'tax_exempt_id' ));
    }

然后最重要的 woocommerce 函数挂钩是:'woocommerce_checkout_update_order_review'

add_action( 'woocommerce_checkout_update_order_review', array(&$this, 'taxexempt_checkout_update_order_review' ));
function taxexempt_checkout_update_order_review( $post_data ) {
        global $woocommerce;

        $woocommerce->customer->set_is_vat_exempt(FALSE);

        parse_str($post_data);

        if ( isset($tax_exempt_checkbox) && isset($tax_exempt_id) && $tax_exempt_checkbox == '1' && !empty($tax_exempt_id))
            $woocommerce->customer->set_is_vat_exempt(true);                
    }

我只是从 woocommerce 中的 checkout.js 文件中解析出作为序列化表单数据的 $post_data 并检查我的表单部分是否填写正确。

如果是,那么我将为用户设置免税。

于 2013-06-02T14:12:51.987 回答
4

接受的解决方案对我不起作用,但我对其进行了修改以使用以下内容:

//=============================================================================
// ADD TAX EXEMPT CHECKMARK
// =============================================================================
add_action( 'woocommerce_after_order_notes', 'qd_tax_exempt');

function qd_tax_exempt( $checkout ) {

  echo '<div id="qd-tax-exempt"><h3>'.__('Tax Exempt').'</h3>';

  woocommerce_form_field( 'shipping_method_tax_exempt', array(
      'type'          => 'checkbox',
      'class'         => array(),
      'label'         => __('My organization is tax exempt.'),
      'required'  => false,
      ), $checkout->get_value( 'shipping_method_tax_exempt' ));

  echo '</div>';
}

add_action( 'woocommerce_checkout_update_order_review', 'taxexempt_checkout_update_order_review');
function taxexempt_checkout_update_order_review( $post_data ) {
  global $woocommerce;

  $woocommerce->customer->set_is_vat_exempt(FALSE);

  parse_str($post_data);

  if ( isset($shipping_method_tax_exempt) && $shipping_method_tax_exempt == '1')
    $woocommerce->customer->set_is_vat_exempt(true);                
}

这里的关键是了解名称以 开头的任何字段shipping_method都将继承此更新订单功能(这对我不起作用)。我在http://www.affectivia.com/blog/have-a-checkbox-on-the-checkout-page-which-updates-the-order-totals/找到了这个答案

于 2016-04-28T16:03:00.240 回答
2

经过长时间的搜索,我发现购物车对象有一个名为 remove_taxes() 的方法。因此,在为免税用户设置用户元后,这将取消税收总额。

function remove_tax_for_exempt( $cart ) {
    global $current_user;
    $ok_taxexp = get_the_author_meta( 'granted_taxexempt', $current_user->ID );
    if ($ok_taxexp){ // now 0 the tax if user is tax exempt
        $cart->remove_taxes();
    }
    return $cart;
} 
add_action( 'woocommerce_calculate_totals', 'remove_tax_for_exempt' );
于 2013-06-10T01:13:06.300 回答
0

因为$cart->remove_taxes();已弃用。这是我改用的。

我在前端没有表格,但有一个免税的用户名册。这是我的解决方案。

另外值得注意的是,set_is_vat_exempt(true)在美国也可以设置为免税。

/**
 * Set customer as tax exempt if user is a wholesale customer
 */
function remove_tax_for_exempt( $cart ) {
    global $woocommerce;

    if ( is_user_logged_in() && current_user_can( 'wholesale_customer' ) ) {
        $woocommerce->customer->set_is_vat_exempt(true);
    }
    return $cart;
} 
add_action( 'woocommerce_calculate_totals', 'remove_tax_for_exempt' );
于 2018-06-06T07:43:16.697 回答
0

由于这个答案仍然在谷歌上弹出,我想我会分享将客户设置为免税仅在结帐期间有效,如果您需要在放置后在后端编辑订单并使用“重新计算”按钮,税收仍然会出现。幸运的是,这也有一个钩子:

function remove_tax_for_exempt($exempt, $order){
    return $exempt || user_can($order->get_user_id(), 'wholesale_customer');
}

add_filter('woocommerce_order_is_vat_exempt', 'remove_tax_for_exempt', 10, 2);
于 2019-04-08T18:08:14.933 回答