我已在结帐页面(billing_vat)中添加了一个自定义字段,当国家/地区设置为爱尔兰(IE)时需要提供该字段。
当前,我已经更改了标签以显示与使用JavaScript的所有其他字段相同的方式是必需的,并且已经连接到“ woocommerce_get_country_locale”以将字段更改为IE必需。
add_filter('woocommerce_billing_fields', 'dc_custom_billing_fields', 1000, 1);
function dc_custom_billing_fields( $fields ) {
$fields['billing_vat'] = array(
'label' => 'VAT Number',
'required' => false,
'type' => 'text',
'class' => array( 'form-row-wide' ),
'priority' => 35,
);
return $fields;
}
add_filter( 'woocommerce_get_country_locale', 'dc_change_locale_field_defaults', 1000, 1 );
function dc_change_locale_field_defaults($countries) {
$countries['IE']['billing_vat']['required'] = true;
return $countries;
}
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'dc_display_admin_order_meta', 10, 1 );
function dc_display_admin_order_meta($order) {
echo '<p><strong>'.__('Billing VAT').':</strong> ' . get_post_meta( $order->get_id(), '_billing_vat', true ) . '</p>';
}
add_action( 'woocommerce_after_order_notes', 'dc_after_checkout_field' );
function dc_after_checkout_field() {
?>
<script>
(function($) {
$(document).ready(function (){
$('#billing_country').on('change',function() {
if ($('#billing_country').val() == 'IE') {
// Required
$('#billing_vat').prop('required', true);
$('label[for="billing_vat"] .optional').remove();
$('label[for="billing_vat"]').append('<abbr class="required" title="required">*</abbr>');
} else {
$('#billing_vat').removeProp('required');
$('label[for="billing_vat"] .required').remove();
$('label[for="billing_vat"]').append('<span class="optional">(optional)</span>');
}
})
});
})(jQuery);
</script>
<?php
}
但是,当我提交表格时,将国家/地区设置为爱尔兰,并且该字段为空,Woo并没有说此字段为必填项。
答案 0 :(得分:0)
将代码替换为
// Add field
function dc_custom_billing_fields( $fields ) {
$fields['billing_vat'] = array(
'label' => 'VAT Number',
'required' => false,
'type' => 'text',
'class' => array( 'form-row-wide' ),
'priority' => 35,
);
return $fields;
}
add_filter('woocommerce_billing_fields', 'dc_custom_billing_fields', 10, 1);
// Validate
function action_woocommerce_after_checkout_validation( $data, $error ) {
if( $data['billing_country'] == 'IE' && empty( $data['billing_vat'] ) ) {
$error->add( 'validation', 'Required based on country.' );
}
}
add_action('woocommerce_after_checkout_validation', 'action_woocommerce_after_checkout_validation', 10, 2);
// jQuery
function dc_after_checkout_field() {
?>
<script>
(function($) {
$(document).ready(function () {
required_or_optional(); //this calls it on load
$( '#billing_country' ).change( required_or_optional );
function required_or_optional() {
if ( $( '#billing_country' ).val() == 'IE' ) {
// Required
$( '#billing_vat' ).prop( 'required', true );
$( 'label[for="billing_vat"] .optional' ).remove();
$( 'label[for="billing_vat"]' ).append( '<abbr class="required" title="required">*</abbr>' );
} else {
$( '#billing_vat' ).removeProp( 'required' );
$( 'label[for="billing_vat"] .required' ).remove();
// Avoid append this multiple times
if( $( '#optional-one' ).length == 0) {
$( 'label[for="billing_vat"]' ).append('<span id="optional-one" class="optional">(optional)</span>');
}
}
}
});
})(jQuery);
</script>
<?php
}
add_action( 'woocommerce_after_order_notes', 'dc_after_checkout_field' );
// Display on the order edit page (backend)
function dc_display_admin_order_meta($order) {
echo '<p><strong>'.__('Billing VAT').':</strong> ' . get_post_meta( $order->get_id(), '_billing_vat', true ) . '</p>';
}
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'dc_display_admin_order_meta', 10, 1 );
答案 1 :(得分:0)
只需将以下代码段添加到您现有的代码段中,并希望您可以完成对爱尔兰的验证
add_action('woocommerce_checkout_process', 'billing_vat_field_process');
function billing_vat_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['billing_vat'] && !empty($_POST['billing_country']) &&
$_POST['billing_country'] == "IE" ){
wc_add_notice( __( 'Please enter VAT number' ), 'error' );
}
}