自定义验证WooCommerce结帐字段

时间:2015-02-19 09:48:36

标签: php wordpress validation woocommerce checkout

我想添加自己的正则表达式来验证电话号码。在我的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;
}

但验证没有发生。我错过了什么?

4 个答案:

答案 0 :(得分:14)

我还没有看到你的代码将这些内容挂钩到woocommerce结帐流程。 请查看他们的文档

woocommerce_checkout_processwoocommerce_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' ) );
}}

希望这有帮助!

相关问题