我终于弄清楚了这一点,这更像是一种解决方法,因为我认为没有明确的方法可以做到这一点。
单击“下订单”按钮后,我们将使用 checkout_place_order 事件放置一个值为 1 的隐藏字段。
var checkout_form = $('form.checkout');
checkout_form.on('checkout_place_order', function () {
if ($('#confirm-order-flag').length == 0) {
checkout_form.append('<input type="hidden" id="confirm-order-flag" name="confirm-order-flag" value="1">');
}
return true;
});
接下来,我们使用钩子 woocommerce_after_checkout_validation 来检查隐藏的输入,如果值为 1,则添加错误(这会阻止订单通过)。
function add_fake_error($posted) {
if ($_POST['confirm-order-flag'] == "1") {
wc_add_notice( __( "custom_notice", 'fake_error' ), 'error');
}
}
add_action('woocommerce_after_checkout_validation', 'add_fake_error');
最后,我们使用 checkout_error 事件来确定是否存在真正的验证,或者是否只有 1 个错误,即我们添加的错误。如果只有 1 个错误,则意味着验证已通过,因此我们可以显示我们的模式(或您需要执行的任何操作)。
$(document.body).on('checkout_error', function () {
var error_count = $('.woocommerce-error li').length;
if (error_count == 1) { // Validation Passed (Just the Fake Error I Created Exists)
// Show Confirmation Modal or Whatever
}else{ // Validation Failed (Real Errors Exists, Remove the Fake One)
$('.woocommerce-error li').each(function(){
var error_text = $(this).text();
if (error_text == 'custom_notice'){
$(this).css('display', 'none');
}
});
}
});
在我的模式中,我有一个确认按钮,它将隐藏字段值设置为空,然后再次单击下订单按钮。这次订单将会通过,因为我们正在检查隐藏的输入值 1。
$('#confirm-order-button').click(function () {
$('#confirm-order-flag').val('');
$('#place_order').trigger('click');
});