WooCommerce 结帐字段的自定义验证
Posted
技术标签:
【中文标题】WooCommerce 结帐字段的自定义验证【英文标题】:Custom validation of WooCommerce checkout fields 【发布时间】:2015-04-20 14:34:02 【问题描述】:我想添加自己的正则表达式来验证电话号码。在我的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]\d9$/', '', $phone ) ) ) > 0 )
return false;
return true;
但是验证没有发生。我错过了什么?
【问题讨论】:
【参考方案1】:我还没有看到将这些与 woocommerce 结帐流程挂钩的代码。 请在
上查看他们的文档woocommerce_checkout_process
和 woocommerce_checkout_order_processed
但就您而言,我强烈建议您将其连接到 woocommerce_checkout_process
所以把这些代码放在你主题的functions.php下面,或者你创建你自己的woocommerce插件,然后把它放在引导代码中。
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' );
【讨论】:
【参考方案2】:你不应该编辑插件文件,因为如果你更新插件所有 自定义将丢失,而是您可以使用钩子来实现您的 目标。你可以使用
woocommerce_checkout_process
钩子来做 这个。
代码如下:
add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields');
function wh_phoneValidateCheckoutFields()
$billing_phone = filter_input(INPUT_POST, 'billing_phone');
if (strlen(trim(preg_replace('/^[6789]\d9$/', '', $billing_phone))) > 0)
wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error');
代码进入您的活动子主题(或主题)的functions.php
文件。或者也可以在任何插件 PHP 文件中。
请注意:默认情况下,WooCommerce 使用 billing_phone
字段来获取电话号码,但如果您已自定义,则可以将 billing_phone
替换为您的字段名称。
希望这会有所帮助!
【讨论】:
【参考方案3】:在您的问题中,您是说验证规则不起作用,我猜它是以错误的方式编写的。您可以使用正则表达式工具在线测试它,例如Regex101 或其他人。
要更笼统地回答这个主题,可以通过以下方式安全地更改验证规则:
将class-wc-validation.php
复制到your_theme_path/woocommerce/includes/class-wc-validation.php
中的主题目录并自定义验证规则。
那么你应该为checkout.js
中提交的电话制定一个验证规则,否则你的字段总是会有绿色边框,尽管它是无效的。
所以我的解决方案是将自定义正则表达式验证器添加到 checkout.js
关于第 192 行:
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' ) );
希望这会有所帮助!
【讨论】:
你不应该覆盖核心文件,这是一个坏主意,更重要的是在你的商店的基本插件中这样做。【参考方案4】:面临同样的问题并遵循其他人在此处所说的内容,但 Woocommerce 仅在 woocommerce_checkout_process
钩子之后设置验证错误。
但是,在最新的 Woocommerce 3.0 中(不确定这是否在 2.x 版本中),如果您使用标准结帐字段或如果您有未以标准 Woocommerce 方式添加的自定义字段,请使用 $_POST
。代码示例如下:
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);
希望有帮助!
【讨论】:
以上是关于WooCommerce 结帐字段的自定义验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 woo commerce 的结帐表单字段中删除额外的 div html 类
Woocommerce 3中的自定义结帐字段和运输方式ajax交互
使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据