Сохранить отфильтрованный телефон для выставления счетов в профиль пользователя администратора в WooCommerce - PullRequest
1 голос
/ 09 июля 2020

Все, что я прочитал за последние пару дней, указывает на то, что если я хочу сохранить поля в user-edit. php (User Admin Backend), я должен использовать хуки edit_user_profile_update & personal_options_update (и я не включаю крючок проверки в этот вопрос ...)

В кодексе говорится, что:

Рассмотрим пример:

update_user_meta($user_id, 'custom_meta_key', $_POST['custom_meta_key']);

Удостоверьтесь, что вы указали другое имя ключа для ключа данных $_POST и фактического мета ключа пользователя. Если вы используете один и тот же ключ для обоих, Wordpress по какой-то причине очищает значение, опубликованное под этим ключом.
Таким образом, вы всегда будете получать пустое значение в $_POST['custom_meta_key'], поэтому измените его в атрибуте name элемента ввода html и добавьте суффикс. Измените его на $_POST['custom_meta_key_data'], и он передаст данные правильно.

Однако, учитывая тот факт, что я хочу добавить проверки в существующее поле billing_phone, я не знаю, как создать сказал "custom_meta_key_data" (например: '_billing_phone' или 'prefix_billing_phone'), чтобы затем ввести значение в указанный prefix_billing_phone, чтобы затем преобразовать его в 'billing_phone' через update_user_meta().

Я предоставил свой базовый код ниже, и я два дня искал в inte rnet решение, но не могу найти обходного пути.

Кроме того, str_replace() не действует, что заставило меня заглянуть внутрь user-edit.php, а комментарии поддерживают приведенные выше примечания, где между нажатием обновления и перезагрузкой профиля каждая переменная сохраняется как _billing_ (с префиксом '_') и записывается исходное значение (предварительные инструкции if / мой код ниже) и сохраняет это - не то, что я обусловил / пытался проверить. Я не знаю, как это скопировать, чтобы я мог просто проверить свои поля ...

add_action( 'personal_options_update', 'audp_save_user_account_fields' );
add_action( 'edit_user_profile_update', 'audp_save_user_account_fields' ); 

function audp_save_user_account_fields( $user_id ) {
    
    /* Input Value: "0412 345 678"
     * SHOULD Become: "0412345678"
     */
    $billing_phone = str_replace( array( ' ', '(', ')' ), '', $_POST['billing_phone'] );
    
    if ( !empty( $_POST['billing_phone'] ) && preg_match( '/^04[0-9]{8}$/D', $billing_phone ) ) {
        
        $billing_phone_query = get_users( array( 
            'meta_key' => 'billing_phone',
            'meta_value' => $billing_phone, 
        ) );
        
        foreach ( $billing_phone_query as $query ) {
            
            if ( $user_id == $query->ID ) {
                
                /* This value ($billing_phone) should be eg: "0412345678"
                 * but remains "0412 345 678" 
                 */
                update_user_meta( $user_id, 'billing_phone', $billing_phone );
            
            }
        
        }
    
    }

}

Добавление / редактирование

Под personal_options_update и edit_user_profile_update поля по-прежнему не обновляются в соответствии с условиями. Например, если я введу «0411 111 111» (пробелы), пробелы не будут удалены. Я попытался выполнить var_dump( $_POST ); die(); на каждом этапе приведенного ниже условия, и значение ('billing_phone') передает изменения (например: 0411111111), но на update_user_meta() и при перезагрузке страницы оно возвращается к '0411 111 111 '? Код, который у меня есть:

function audp_save_user_account_fields( $user_id ) {
    
    $billing_phone_key = 'billing_phone';
    
    if ( isset( $_POST[$billing_phone_key] ) ) {
        
        // var_dump( $_POST['billing_phone_key] ) = '0411 111 111'
        $billing_phone = preg_replace( '/[^0-9]/i', '', sanitize_text_field($_POST[$billing_phone_key] ) );
        // var_dump on $billing_phone = '0411111111'
        
        if ( !empty( $_POST[$billing_phone_key] ) ) {
            
            // var_dump( $billing_phone ) = '0411111111'
            update_user_meta( $user_id, 'billing_phone', $billing_phone );
            // page reloads with value '0411 111 111'.
        }
        
    }

}
add_action( 'edit_user_profile_update', 'audp_save_user_account_fields' );

Я где-то читал, что вам, возможно, придется каким-то образом передать старую переменную и новую переменную и / или удалить user_meta_data, а затем добавить новую, но я не пробовал это все же...?? Будем признательны за любые дальнейшие предложения.

1 Ответ

1 голос
/ 09 июля 2020

Обновлено

Теперь, чтобы отфильтровать строку номера телефона, сохраняя только числа, вы можете лучше использовать preg_replace(), чем str_replace().

В дальнейшем номер телефона для выставления счетов будет отфильтрован перед сохранением в:

  • Панель администратора Wordpress
  • Адреса моей учетной записи Изменить адрес для выставления счетов
  • После того, как заказ будет размещен (до сохранения данных)

Код:

// In Wordpress user profile (increased hook priority)
add_action( 'personal_options_update', 'save_user_billing_phone_fields', 999999 );
add_action( 'edit_user_profile_update', 'save_user_billing_phone_fields', 999999 );
function save_user_billing_phone_fields( $user_id ) {
    $field_key = 'billing_phone';

    if( isset($_POST[$field_key]) && ! empty($_POST[$field_key]) ) {
        // Filtering billing phone (removing everything else than numbers)
        $billing_phone = preg_replace( '/[^0-9]/', '', sanitize_text_field($_POST[$field_key]) );

        // Update the billing phone
        update_user_meta( $user_id, 'billing_phone', $billing_phone );
    }
}

// On My account > edit addresses > Billing
add_action( 'woocommerce_process_myaccount_field_billing_phone', 'filter_my_account_billing_phone_fields' );
function filter_my_account_billing_phone_fields( $value ) {
    return preg_replace( '/[^0-9]/', '', $value );
}

// On order submission
add_action( 'woocommerce_checkout_posted_data', 'wc_checkout_posted_data_filter_callback' );
function  wc_checkout_posted_data_filter_callback( $data ) {
    $field_key = 'billing_phone';

    if( isset($data[$field_key]) ) {
        // Filtering billing phone (removing everything else than numbers)
        $data[$field_key] = preg_replace( '/[^0-9]/', '', $data[$field_key] );
    }
    return $data;
}

Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Протестировано, работает.

По теме: Извлечь числа из строки

...