Как сделать телефонный номер клиента уникальным в Wordpress - PullRequest
0 голосов
/ 28 января 2020

На самом деле я хочу, чтобы клиенты добавляли уникальные номера телефонов в платежный адрес Woo-Commerce. если кто-либо пытается добавить / обновить уже существующие номера телефонов, он должен выдать ошибку.

Я попробовал приведенный ниже код, но он не работает. Кто-нибудь может дать мне правильное решение для уникальных телефонных номеров в биллинговом адресе Woocommerce?

add_filter( 'update_user_meta', 'ts_unique_wc_phone_field');
function ts_unique_wc_phone_field( $errors ) {
    if ( isset( $_POST['billing_phone'] ) ) {
        $hasPhoneNumber= get_users('meta_value='.$_POST['billing_phone']);
            if ( !empty($hasPhoneNumber)) {
        $errors->add( 'billing_phone_error', __( '<strong>Error</strong>: Mobile number is already used!.', 'woocommerce' ) );
    }
  }
    return $errors;
}

Customer Billing Form

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я установил на одном из моих сайтов один и тот же код в двух (2) функциях - одна для woocommerce -> моя учетная запись и одна на кассе, которая проверяет действительность номера телефона, указанного c для моей страны и другой, чтобы проверить, существует ли уже номер телефона.

add_action( 'woocommerce_save_account_details_errors', 'wc_myaccount_validate_billing_phone', 20, 1); // My Account
function wc_myaccount_validate_billing_phone( $args ){

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

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

            wc_add_notice( __( '<strong>Billing Mobile Phone</strong> is invalid (Example: 0412 345 678).' ), 'error' );
        }

        $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'] ) ) {
                wc_add_notice( __( '<strong>Billing Mobile Phone</strong> already exists.' ), 'error' );
            }
            else { 
                return;
            }
        }
    }
}

add_action('woocommerce_checkout_process', 'wc_checkout_validate_billing_phone'); // Checkout
function wc_checkout_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'] ) ) ) {
            wc_add_notice( __( '<strong>Billing Mobile Phone</strong> is invalid (Example: 0412 345 678).' ), 'error' );
        }

        $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'] ) ) {
                wc_add_notice( __( '<strong>Billing Mobile Phone</strong> already exists.' ), 'error' );
            }
            else { 
                return;
            }
        }
    }
}

Поскольку я хочу сохранить все номера телефонов как 0412345678 (без пробелов), а некоторые люди вводят номера телефонов как 0412 345 678, str_replace ( ) удаляет это перед сохранением.

add_action( 'woocommerce_checkout_update_user_meta', 'wc_checkout_save_billing_phone' );
function wc_checkout_save_billing_phone( $user_id ) {   

    if ( $user_id && $_POST['billing_phone'] ) {
        update_user_meta( $user_id, 'billing_phone', str_replace(' ', '', $_POST['billing_phone'] ) );
    }
}

Хотя я еще не тестировал следующую часть, и этот пример ссылается на эту ссылку , если вы хотите обновить пользователя с правами администратора область, в которой вы можете использовать что-то вроде этого.

add_action( 'show_user_profile', 'wc_checkout_validate_billing_phone', 10 );
add_action( 'edit_user_profile', 'wc_checkout_validate_billing_phone', 10 );

Ниже приведен скриншот результатов попытки изменить мой номер телефона на тот, который уже существует в разделе woocommerce-> my account.

enter image description here

0 голосов
/ 28 января 2020

Ваш get_users звонок неправильный. Используйте

$hasPhoneNumber = get_users(array(
        'meta_key' => 'billing_phone', 
        'meta_value' => $_POST['billing_phone'], 
    )
);

Осторожно : вы не упомянули свой мета ключ в своем сообщении. Это может быть что-то еще, кроме «billing_phone». Адаптируйте его по мере необходимости.

Это, однако, позволит пользователям делать махинации, такие как добавление пробела / - / + или чего-то подобного к номеру телефона, повторное его использование. Для этого может потребоваться функция для фильтрации избыточных символов при вставке мета-значения и применения этой же функции к $_POST['billing_phone'] перед мета-запросом для get_users.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...