我想添加自己的正则表达式来验证电话号码。在我的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;
}
但验证没有发生。我错过了什么?
答案 0 :(得分:14)
我还没有看到你的代码将这些内容挂钩到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' );
}
答案 1 :(得分:9)
面临同样的问题并遵循其他人在此处所说的内容,但Woocommerce仅在<fragments xsi:type="fragment:StringModelFragment" xmi:id="_rva08KK6Eeealvq0OCaXXw" featurename="trimContributions" parentElementId="org.eclipse.e4.legacy.ide.application">
<elements xsi:type="menu:TrimContribution" xmi:id="_NDOigKK8Eeealvq0OCaXXw" elementId="xyz.trimcontribution.0" parentId="org.eclipse.ui.main.toolbar" positionInParent="after=additions">
<children xsi:type="menu:ToolBar" xmi:id="_NXC2YKK8Eeealvq0OCaXXw" elementId="xyz.toolbar.1" accessibilityPhrase="ToolItems1">
<children xsi:type="menu:HandledToolItem" xmi:id="_dOkvwKK8Eeealvq0OCaXXw" elementId="xyz.handledtoolitem.1" label="Item1" iconURI="platform:/plugin/xyz-plugin/resources/icons/toolbar/Item1.png" tooltip="" enabled="false" command="_SALb4JItEee5yvRIuSvsRg"/>
</children>
</elements>
</fragments>
挂钩后设置验证错误。
但是,在最新的Woocommerce 3.0中(不确定这是否在2.x版本中),我们可以使用woocommerce_checkout_process
挂钩,然后查看woocommerce_after_checkout_validation
参数,如果您使用的是标准结帐字段或使用$data
如果您有自定义字段未以标准Woocommerce方式添加。代码的一个例子是:
$_POST
希望有所帮助!
答案 2 :(得分:5)
你不应该编辑插件文件,因为如果你更新插件全部 定制将丢失,而你可以使用钩子来实现你的 目标。你可以使用
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]\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
。
希望这有帮助!
答案 3 :(得分:1)
在您的问题中,您说验证规则不起作用,我猜它是以错误的方式编写的。您可以使用regexp工具在线测试,例如Regex101或其他人。
要回答有关此主题的更多一般信息,可以通过以下方式安全地更改验证规则:
将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' ) );
}}
希望这有帮助!