用户管理区中的 Wordpress 验证 Billing_Phone

Wordpress Validate Billing_Phone in User Admin Area

我目前有 wordpress/woocommerce 和一个 billing_phone 验证函数(在下面提供),它在我的帐户 -> 帐户详细信息、结帐等中工作。此函数首先检查值是否为有效的 phone 号码,然后检查该 phone 号码是否已经存在。这是我的插件中一个非常重要的功能,因为我不能重复。

我需要与后端中的前端相同的 checks/balances...我遇到问题的地方是找到最合适的钩子或一组钩子以允许我验证 billing_phone 管理区域内的字段和 1) 使用您通常会在管理后台看到的错误消息显示错误,以及 2) 不更新字段并显示错误。

我试过 user_profile_update_errors - 唉,它只在更新元数据后才提供错误,我找不到任何关于如何在 $error 变量中包含检查的信息。我也尝试了 edit_user_profile_updateshow_user_profile 但我不知道如何向下面的函数添加错误。

function user_admin_validate_billing_phone() {

    if ( isset( $_POST['billing_phone'] ) && !empty( $_POST['billing_phone'] ) ) { 

        if ( !preg_match('/^04[0-9]{8}$/D', str_replace(' ', '', $_POST['billing_phone'] ) ) ) {

        //  Error: Billing Phone Number is Invalid.

        }

        $existing_billing_phone = get_users( 'meta_value=' . str_replace(' ', '', $_POST['billing_phone'] ) );

        $current_user = wp_get_current_user();

        if ( !empty( $existing_billing_phone ) ) {

            if ( $current_user->billing_phone != str_replace(' ', '', $_POST['billing_phone'] ) ) {

            // Error: Billing Phone Number Already Exists.

            }
            else { 
                return;
            }
        }
    }
}

如上所述,我尝试了以下挂钩:

add_action( 'show_user_profile', 'user_admin_validate_billing_phone', 90 );
add_action( 'edit_user_profile', 'user_admin_validate_billing_phone', 90 );
add_action( 'personal_options_update', 'user_admin_validate_billing_phone' );
add_action( 'edit_user_profile_update', 'user_admin_validate_billing_phone' );
add_action( 'user_profile_update_errors, 'user_admin_validate_billing_phone', 10, 3 );

...但是错误出现并且字段仍在更改,或者我不知道如何进行适当的错误处理,例如:

$error = new WP_Error();
$error->add( 'error', __( 'Billing Mobile Phone Number already exists.' ) );

如能提供正确流程的任何帮助或指导,我们将不胜感激。

使用此代码。

function user_admin_validate_billing_phone() {

    if ( isset( $_POST['billing_phone'] ) && !empty( $_POST['billing_phone'] ) ) { 

        if ( !preg_match('/^04[0-9]{8}$/D', str_replace(' ', '', $_POST['billing_phone'] ) ) ) {

        //  Error: Billing Phone Number is Invalid.
            wc_add_notice(__('Billing Phone Number is Invalid.', 'woocommerce'));

        }

        $existing_billing_phone = get_users( 'meta_value=' . str_replace(' ', '', $_POST['billing_phone'] ) );

        $current_user = wp_get_current_user();

        if ( !empty( $existing_billing_phone ) ) {

            if ( $current_user->billing_phone != str_replace(' ', '', $_POST['billing_phone'] ) ) {

            // Error: Billing Phone Number Already Exists.
                wc_add_notice(__('Billing Phone Number Already Exists.', 'woocommerce'));

            }
            else { 
                return;
            }
        }
    }
}

希望对您有所帮助。

一个例子

function validate_phone_field(&$errors, $update = null, &$user  = null) {
    if ( empty($_POST['billing_phone']) ) {
        $errors->add('empty_phone', '<strong>ERROR</strong>: Please Enter a phone number');
    }
}
add_action( 'user_profile_update_errors', 'validate_phone_field' );
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 字段来获取 phone 数字,但如果您自定义了它,则可以将 billing_phone 替换为您的字段名称。

希望对您有所帮助!