[英]Custom validation of WooCommerce checkout fields
我想添加自己的正则表达式来验证电话号码。 在我的class-wc-validation.php
我已将正则表达式更改为我的要求。
public static function is_phone( $phone ) {
//if ( strlen( trim( preg_replace( '/[\s\#0-9_\-\+\(\)]/', '', $phone ) ) ) > 0 )
if ( strlen( trim( preg_replace( '/^[6789]\d{9}$/', '', $phone ) ) ) > 0 )
return false;
return true;
}
但验证没有发生。 我错过了什么?
我还没有看到你的代码将这些内容挂钩到woocommerce结帐流程。 请查看他们的文档
woocommerce_checkout_process
和woocommerce_checkout_order_processed
但在你的情况下,我强烈建议你把它挂在woocommerce_checkout_process
所以把这些代码放在你的主题的functions.php上,或者你创建自己的woocommerce插件,并把它放在bootstrap代码中。
add_action('woocommerce_checkout_process', 'is_phone');
function is_phone() {
$phone_number = $_POST['---your-phone-field-name---'];
// your function's body above, and if error, call this wc_add_notice
wc_add_notice( __( 'Your phone number is wrong.' ), 'error' );
}
面对同样的问题并遵循其他人在此处所说的内容,但Woocommerce仅在woocommerce_checkout_process
挂钩后设置验证错误。
但是,在最新的Woocommerce 3.0中(不确定这是否在2.x版本中),我们可以使用woocommerce_after_checkout_validation
挂钩然后查看$data
参数,如果您使用标准结帐字段或使用$_POST
如果您有未以标准Woocommerce方式添加的自定义字段。 代码示例如下:
public function validate($data,$errors) {
// Do your data processing here and in case of an
// error add it to the errors array like:
$errors->add( 'validation', __( 'Please input that correctly.' ));
}
add_action('woocommerce_after_checkout_validation', 'validate',10,2);
希望有所帮助!
你不应该编辑插件文件 ,因为如果你更新插件,所有的自定义都将丢失,而你可以使用hook来实现你的目标。 您可以使用
woocommerce_checkout_process
hook来执行此操作。
这是代码:
add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields');
function wh_phoneValidateCheckoutFields() {
$billing_phone = filter_input(INPUT_POST, 'billing_phone');
if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $billing_phone))) > 0) {
wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error');
}
}
代码位于活动子主题(或主题)的functions.php
文件中。 或者也可以在任何插件PHP文件中。
请注意: 默认情况下,WooCommerce使用billing_phone
字段来获取电话号码,但如果您已对其进行了自定义,则可以将billing_phone
替换为您的字段名称。
希望这可以帮助!
在您的问题中,您说验证规则不起作用,我猜它是以错误的方式编写的。 您可以使用regexp工具在线测试,例如Regex101或其他工具。
要回答关于此主题的更多一般信息,可以通过以下方式安全地更改验证规则:
将class-wc-validation.php
的副本复制到your_theme_path/woocommerce/includes/class-wc-validation.php
的主题目录, your_theme_path/woocommerce/includes/class-wc-validation.php
验证规则进行自定义。
然后你应该为checkout.js
提交的手机制定验证规则,否则你的领域总是会有绿色边框,尽管它无效。
所以我的解决方案是将关于第192行的自定义正则表达式验证器添加到checkout.js
:
if ( $parent.is( '.validate-phone' ) ) {
if ( $this.val() ) {
var pattern = new RegExp(/^([0-9\s\/\+\-\#\_\(\)]*)$/);
if ( ! pattern.test( $this.val() ) ) {
$parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-phone' );
validated = false;
}
}
}
并包含您自定义的.js文件(在functions.php
)
add_action( 'wp_enqueue_scripts', 'my_checkoutjs_enqueue_scripts', 100 );
function gv_checkoutjs_enqueue_scripts() {
if ( is_checkout() ) {
wp_deregister_script( 'wc-checkout' );
wp_enqueue_script( 'wc-checkout', get_template_directory_uri() . '/js/modified_checkout.js', array( 'jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n' ) );
}}
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.