Как сохранить данные пользовательских полей после проверки в Wordpress - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь проверить настраиваемое поле phone с помощью user_profile_update_errors hook, но edit_user_profile_update и personal_options_update выполняются перед этим, как указано здесь https://codex.wordpress.org/Plugin_API/Action_Reference/user_profile_update_errors Я пробовал использовать обходной путь путем подключения save_profile_fields, только если $ errors пусто, но функция не подключает

function init() {
    //render profile fields
    add_action( 'show_user_profile', array( $this, 'render_profile_fields' ) );
    add_action( 'edit_user_profile', array( $this, 'render_profile_fields' ) );
    // validate profile fields
    add_action( 'user_profile_update_errors', array( $this, 'validate_profile_phone' ), 0, 3 );
    add_action( 'user_profile_update_errors', array( $this, 'validate_profile_address' ), 0, 3 );

}

function render_profile_fields( $user ) { ?>

    <h3>More Information</h3>
    <table class="form-table">
        <tr>
            <th><label for="phone">Phone</label></th>
            <td>
                <input type="tel" name="phone" id="phone" value="<?php echo esc_attr( get_the_author_meta( 'phone', $user->ID ) ); ?>" class="regular-text" ><br>
            </td>
        </tr>            
    </table>

<?php }

function validate_profile_phone( $errors, $update, $user ) {
    $error_check = false;
    $phone_regex = "/08[789]\d{7}/u";
// validate input fields
    if ( !empty( $_POST['phone'] ) && strlen( $_POST['phone'] ) > 10) {
        $errors->add( 'phone', "<strong>ERROR</strong>: The maximum phone length is 10 characters." );
        $error_check = true;
    }

    if ( preg_match( $phone_regex, $_POST['phone'] ) == 0 ) {
        $errors->add( 'phone', "<strong>ERROR</strong>: Not a valid phone number." );
        $error_check = true;
    }
    
    if( $error_check ) {
        return $errors;
    }

    add_action( 'edit_user_profile_update', array( $this, 'save_profile_fields' ) );
    add_action( 'personal_options_update', array( $this, 'save_profile_fields' ) );

}

function save_profile_fields( $id ) {
//  save input fields values
    if ( !current_user_can( 'edit_user', $id ) )
        return false;

    if ( isset( $_POST['phone'] ) )
        update_user_meta( $id, 'phone', $_POST['phone'] );
}

1 Ответ

0 голосов
/ 11 июля 2020

Ловушка user_profile_update_errors срабатывает перед возвратом ошибок обновления профиля пользователя. Вы можете создать отдельные функции для ваших ошибок / проверки для других ваших действий, и вы можете сохранить все свои настраиваемые поля (например: телефон, адрес и т.д. c) и проверить все свои настраиваемые поля (например: телефон, адрес и т.д. c) в каждой функции.

// validate profile field
add_action( 'user_profile_update_errors', array( $this, 'validate_profile_fields' ), 0, 3 );

// save profile fields to your own profile and others.
add_action( 'edit_user_profile_update', array( $this, 'save_profile_fields' ) );
add_action( 'personal_options_update', array( $this, 'save_profile_fields' ) );
    
function validate_profile_fields( &$errors, $update, &$user ) {
    $phone_regex = "/08[789]\d{7}/u";
    
    if ( !empty( $_POST['phone'] ) && strlen( $_POST['phone'] ) > 10) {
      
        $errors->add( 'phone', "<strong>ERROR</strong>: The maximum phone length is 10 characters." );

    }
    if ( preg_match( $phone_regex, $_POST['phone'] ) == 0 ) {
        
        $errors->add( 'phone', "<strong>ERROR</strong>: Not a valid phone number." );
    }
    
    return $errors;

}

function save_profile_fields( $id ) {
    
    // save input fields values
    $phone_regex = "/08[789]\d{7}/u";
    
    if ( !current_user_can( 'edit_user', $id ) )
        return false;

    if ( isset( $_POST['phone'] )) {

        if ( preg_match( $phone_regex, $_POST['phone'] ) == 1 ) {
        update_user_meta( $id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}

Насколько я понимаю, вам не нужно выполнять все те же проверки в функции сохранения, поскольку они были установлены в функции проверки / ошибок - поэтому, если все они передают функцию ошибок, срабатывает функция сохранения. что они не будут конфликтовать с другими функциями в других темах / плагинах. Вы можете использовать случайные символы или аббревиатуру вашего плагина, например: function abc1234_save_profile_fields() или что угодно.

Если мой ответ удовлетворительный, отметьте его как свой.

...