Добавить форму Tax Free при оформлении заказа в woocommerce

Я пытаюсь добавить форму на свою страницу оформления заказа, поэтому, когда пользователь щелкает флажок «Освобождение от налогов», появляется всплывающее текстовое поле и спрашивают пользователя, что такое идентификационный номер налогового освобождения.

У меня все отлично работает, и я даже добавил класс update_totals_on_change в поле формы, чтобы он обновлял итоги.

Следующим моим шагом было добавление действия/фильтра к методу, поэтому, когда update_totals_on_change выполняется, я могу установить налог равным 0, и тогда он завершит расчет общей суммы.

Кто-нибудь знает, какие функции я могу подключить?

Глядя на файл checkout.js в WooCommerce, они устанавливают действие woocommerce_update_order_review для операции ajax.

Я попытался следовать этому, но вскоре заблудился.

Я подумал, что могу добавить некоторые данные поста, подключившись к woocommerce_checkout_update_order_review

а затем подключиться к woocommerce_before_calculate_totals, чтобы изменить налоговую информацию, но я понятия не имею, что мне нужно изменить.

Я вообще на правильном пути?


person Craig    schedule 31.05.2013    source источник


Ответы (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);                
    }

Я просто проанализировал $post_data, который является сериализованными данными формы, из файла checkout.js в woocommerce и проверил, правильно ли заполнена моя часть формы.

Если бы это было так, то я бы установил освобождение от налога для пользователя.

person Craig    schedule 02.06.2013
comment
Уведомление! $woocommerce->customer->set_is_vat_exempt сохраняет значение в базе данных, поэтому пользователь, который однажды был освобожден от налогов с помощью этого метода, будет иметь его и в следующий раз, если вы не установите для него значение false! По этой причине приведенный выше пример всегда устанавливает значение false. - person Ciantic; 11.10.2018

Принятое решение не сработало для меня, но я изменил его, чтобы использовать следующее:

//=============================================================================
// 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-what-updates-the-order-totals/

person Eric K    schedule 28.04.2016
comment
«класс» — это список классов CSS, которые нужно применить к полю, поэтому он должен быть пустым массивом, а не пустой строкой. - person richplane; 19.01.2018
comment
@richplane, я обновил свой ответ на основе вашего комментария. Спасибо. - person Eric K; 19.01.2018
comment
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']) && $result['shipping_method_tax_exempt'] == '1') - person Jarom; 02.01.2020

После долгих поисков я обнаружил, что для объекта корзины существует метод 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' );
person Jim Camomile    schedule 10.06.2013
comment
Спасибо за публикацию этого ответа. Я уже добавил пользовательское поле профиля пользователя и отслеживал, был ли пользователь освобожден от налогов, но не знал, как убрать налоги только для этих пользователей. Это был билет! - person cce1911; 04.12.2016
comment
remove_taxes() устарела, начиная с версии 3.2 — установка пользователя как is_tax_exempt(true) — это новый способ сделать это (согласно комментариям в коде). - person richplane; 19.01.2018

Потому что $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' );
person user3200221    schedule 06.06.2018

Поскольку этот ответ все еще появляется в 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);
person Trey    schedule 08.04.2019