Для этого вы должны использовать комбинацию AJAX и PHP.
Часть JS будет иметь функцию проверки следующим образом :.
/*
* Validates whether or not the necessary fields are provided.
*/
function validateExemptionStatus() {
if ($("#wc_checkout_add_ons_3").is(':checked') && $("#wc_checkout_add_ons_4").val() != "" && $("#wc_checkout_add_ons_5").val() != "") {
//Check the file upload
if ($(".input-file-plupload a.file").attr("href") != "")
return true;
}
return false;
}
В моем конкретном случае использования есть файл для загрузки. Вы просто хотите, чтобы это соответствовало тому, что вы хотите проверить. Я использую плагин WooCommerce Add-Ons для обработки дополнительных полей. Этот плагин запускает update_checkout крючок, когда вы focusout с поля.
код AJAX Я должен обрабатывать фактическую обработку:
function handleTaxExemptionStatus(triggerUpdate) {
//Validate whether all fields were filled out or not.
if (validateExemptionStatus() === true) {
var data_string = "action=example_remove_tax";
} else {
var data_string = "action=example_add_tax";
}
console.log(data_string);
//Make the appropriate AJAX call to add/remove the tax.
$.ajax({
url: ajax_url,
type:'POST',
data: data_string,
success: function(html) {
if (triggerUpdate)
$('body').trigger('update_checkout');
},
error: function(xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
console.log("ERROR:"+err.Message);
return false;
}
});
}
Теперь мы Cookin'. У нас есть функция проверки и функция, которая делает фактический вызов AJAX. Теперь нам просто нужно знать, когда проверять.
/*
* When the AJAX call is complete, this function validates whether
* or not the information for the tax exemption was changed.
* If the information was changed, it makes a call to the handler
* function to update the information (and the checkout data) accordingly.
*/
$(document).ajaxComplete(function(event, xhr, settings) {
//Trigger when the order_review is updated
if(settings.url.indexOf('update_order_review') > -1) {
var validationStatus = validateExemptionStatus();
var hiddenVarData = $("input#add-remove-tax-trigger").val();
var hiddenVarValue = (hiddenVarData == 'true');
if (hiddenVarValue != validationStatus) {
//Set the new value on the hidden field
$("input#add-remove-tax-trigger").val(validationStatus);
//Update the exemption status
handleTaxExemptionStatus(true);
}
}
});
Поскольку плагин не позволит мне удалить события, присоединенные к полям (я попробовал все) - я полагаюсь на скрытом поле, я создал, чтобы определить, когда сказать WooCommerce, когда для обновления статуса заказа. Это не идеально, но оно работает.
Теперь - последние штрихи. Wordpress должен знать, что такое ajax_url (вы можете увидеть JS-ошибку для этого, если вы не включаете это). Я делаю это с помощью:
/**
* Adds the WordPress Ajax Library to the frontend.
*/
function add_ajax_library() {
$html = '<script type="text/javascript">';
$html .= 'var ajax_url = "' . admin_url('admin-ajax.php') . '"';
$html .= '</script>';
echo $html;
} // end add_ajax_library
add_action('wp_head', 'add_ajax_library');
Добавьте это в functions.php файл, и вы установите. Он будет срабатывать при загрузке WordPress.
Теперь последний кусок. Нам нужна внутренняя функция для обработки добавления/удаления НДС. Эта часть проста (к счастью):
function example_remove_tax_from_order(){
global $woocommerce;
$woocommerce->customer->set_is_vat_exempt(true);
wp_die();
}
add_action('wp_ajax_example_remove_tax', 'example_remove_tax_from_order'); // for logged in user
add_action('wp_ajax_nopriv_example_remove_tax', 'example_remove_tax_from_order'); // if user not logged in
function example_add_tax_to_order(){
global $woocommerce;
$woocommerce->customer->set_is_vat_exempt(false);
wp_die();
}
add_action('wp_ajax_example_add_tax', 'example_add_tax_to_order'); // for logged in user
add_action('wp_ajax_nopriv_example_add_tax', 'example_add_tax_to_order'); // if user not logged in
Небольшой комплекс, но он хорошо работает. Я искал все и не мог найти решение этой проблемы.
Вы когда-нибудь это выясняли?Облицовка аналогичной проблемы с попыткой использовать AJAX для удаления налога. – ryanka
Жаль, что я сделал .. Я, вероятно, должен начать изучать AJAX :( –