Цикл WooCommerce при отправке формы моей учетной записи - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь переопределить поле account_display_name в разделе my-account (вошедший в систему пользователь), который я выполняю с помощью двух крючков. Первый удаляет атрибут required, а второй обновляет поле display_name на основе ввода имени и фамилии.

Этот фильтр позволяет мне удалить атрибут required="required" из display_name и работает по назначению:

add_filter('woocommerce_save_account_details_required_fields', 'audp_myaccount_required_fields');
function audp_myaccount_required_fields( $required_fields ) {
    
    unset( $required_fields['account_display_name'] );
    
    return $required_fields;
    
}

Это следующее действие предназначено для того, чтобы я мог сохранить отправленные account_first_name и account_last_name как display_name:

add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 );
function audp_myaccount_display_name( $display_name ) {
    
    global $current_user;
    
    if ( isset( $_POST['account_first_name'] ) && isset( $_POST['account_last_name'] ) ) {
        
        if ( ! empty( $_POST['account_first_name'] ) && ! empty( $_POST['account_last_name'] ) ) {
            
            wp_update_user( 
                array (
                    'ID' => $current_user->ID, 
                    'display_name' => sanitize_text_field( $_POST['account_first_name'] ) . ' ' . sanitize_text_field( $_POST['account_last_name'] ),
                )
            );
            
        }
    
    }
    
}

Проблема, с которой я столкнулся с этим кодом, - это зацикливание после отправки данных. Страница "в конечном итоге" возвращает внутреннюю ошибку 500. Если я остановлю процесс (уйду) и перезагружу страницу, данные обновятся. Я просто не знаю, как выйти из этого l oop?

Я изучил некоторые варианты, включая remove_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 ) перед wp_update_user(), а затем add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 ) после wp_update_user(), но это не так. похоже, тоже работает.

Любая помощь приветствуется!

1 Ответ

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

Вы должны иметь возможность останавливать бесконечные циклы, добавляя дополнительный фильтр со значением по умолчанию false, которое вы проверяете в верхней части вашей функции. Остановка выполнения вашего кода, когда этот фильтр возвращает истину.

Затем вызовите этот фильтр перед обновлением метаданных пользователя и заставьте его вернуть true. И удалите его после обновления мета пользователя. Таким образом, проверка вверху вернет true при втором вызове функции и остановит бесконечный l oop, в результате чего ваша функция будет запущена только один раз.

add_action( 'profile_update', 'audp_myaccount_display_name', 20, 2 );
function audp_myaccount_display_name( $display_name ) {
    
    if ( apply_filters( 'prevent_endless_loop_updating_user_meta', false ) )  return; // prevent endless loops
    
    global $current_user;
    
    if ( isset( $_POST['account_first_name'] ) && isset( $_POST['account_last_name'] ) ) {
        
        if ( ! empty( $_POST['account_first_name'] ) && ! empty( $_POST['account_last_name'] ) ) {
            
            add_filter( 'prevent_endless_loop_updating_user_meta', '__return_true' );
            wp_update_user( 
                array (
                    'ID' => $current_user->ID, 
                    'display_name' => sanitize_text_field( $_POST['account_first_name'] ) . ' ' . sanitize_text_field( $_POST['account_last_name'] ),
                )
            );
            remove_filter( 'prevent_endless_loop_updating_user_meta', '__return_true' );
            
        }
    
    }
    
}
...