【问题标题】:Add Tax Exempt form on checkout in woocommerce在 woocommerce 结帐时添加免税表格
【发布时间】:2019-06-16 09:49:43
【问题描述】:

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

所有这些工作都很好,我什至将update_totals_on_change 类添加到我的表单字段中,以便更新总数。

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

有人知道我可以使用哪些功能吗?

查看WooCommerce 中的checkout.js 文件,他们将ajax 操作的操作设置为woocommerce_update_order_review

我尝试过,但很快就迷路了。

我在想我可以通过连接到 woocommerce_checkout_update_order_review 来添加一些帖子数据

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

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

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

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

    在我的插件中,我通过挂钩这个函数在订单备注之后制作了一个表格:'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 并检查我的表单部分是否填写正确。

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

    【讨论】:

    • 注意! $woocommerce-&gt;customer-&gt;set_is_vat_exempt 将值存储在数据库中,因此 曾经 使用该方法免税的用户下次也将拥有它,除非您将其设置为 false!这就是上面的示例始终将其设置为 false 的原因。
    【解决方案2】:

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

    //=============================================================================
    // 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/找到了这个答案

    【讨论】:

    • 'class' 是应用于字段的 CSS 类的列表,因此它需要是一个空数组而不是空字符串。
    • @richplane,我根据您的评论更新了我的答案。谢谢。
    • parse_str() 在 PHP 7.2 中已弃用(参见 php.net/manual/en/function.parse-str.php)。上面的答案应该是这样的parse_str($post_data, $result);,然后下一行应该是这样的:if ( isset($result['shipping_method_tax_exempt']) &amp;&amp; $result['shipping_method_tax_exempt'] == '1')
    【解决方案3】:

    经过长时间的搜索,我发现购物车对象有一个名为 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' );
    

    【讨论】:

    • 感谢您发布此答案。我已经添加了一个自定义用户配置文件字段,并正在跟踪用户是否免税,但不知道如何仅为这些用户取消税收。这是票!
    • remove_taxes() 自 3.2 起已弃用 - 将用户设置为 is_tax_exempt(true) 是执行此操作的新方法(根据代码中的 cmets)。
    【解决方案4】:

    因为$cart-&gt;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' );
    

    【讨论】:

      【解决方案5】:

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

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        相关资源
        最近更新 更多