5

チェックアウト ページにフォームを追加しようとしています。ユーザーが [免税] チェックボックスをクリックすると、テキスト ボックスがポップアップし、免税 ID 番号を尋ねるメッセージが表示されます。

そのすべてがうまく機能し、update_totals_on_changeクラスをフォームフィールドに追加して、合計が更新されるようにしました.

私の次のステップは、メソッドにアクション/フィルターを追加することでした。これにより、update_totals_on_change実行時に税金を 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

この回答は引き続き Google に表示されるため、注文後にバックエンドで注文を編集し、「再計算」ボタンを使用する必要がある場合、顧客を免税として設定することはチェックアウト中にのみ機能することを共有したいと思います。 、税金は引き続き表示されます。幸いなことに、これにもフックがあります。

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 に答える