Разрешить администратору обходить обязательные поля в определенных ситуациях с ACF?

Я создал интерфейсную форму ACF, используя acf_form; эти поля добавляются в запись Пользователь на сервере; однако, поскольку в этой форме есть обязательные поля, это означает, что администратор не может вносить базовые изменения в пользователя на серверной части , если пользователь не заполнил эту форму.

Поэтому мне интересно, возможно ли в определенных ситуациях разрешить администратору обходить обязательное заполнение обязательных полей, и если да, то как мне это сделать?


person Brett    schedule 28.12.2018    source источник


Ответы (1)


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

Нам нужно не только отключить проверку на стороне сервера, но и проверку на стороне клиента, для этого мы делаем что-то вроде этого:

add_action('acf/input/admin_head', 'my_acf_admin_head');

function my_acf_admin_head() {

    if (!function_exists('get_current_screen')) {
        return;
    }

    // Get current page/screen
    $screen = get_current_screen();

    // Get current user
    $user = wp_get_current_user();

    if (is_object($screen) and is_a($screen, 'WP_Screen')) {

        if (($screen->id == 'user-edit' or ($screen->id == 'user' and $screen->action == 'add')) and in_array('administrator', $user->roles)) {
            ?>
                <script type="text/javascript">
                    window.acf.validation.active = false;
                </script>
            <?php
        }

    }

}

Это добавит Javascript на любую страницу, которая соответствует нашим квалификаторам, чтобы отключить проверку ACF на стороне клиента.

Теперь, чтобы отключить бэкэнд-валидацию, мы делаем что-то вроде этого:

add_action('acf/validate_save_post', 'my_acf_validate_save_post', 10, 0);

function my_acf_validate_save_post() {

    if (!function_exists('get_current_screen')) {
        return;
    }

    // Get current page/screen
    $screen = get_current_screen();

    // Get current user
    $user = wp_get_current_user();

    if (is_object($screen) and is_a($screen, 'WP_Screen')) {

        if (($screen->id == 'user-edit' or ($screen->id == 'user' and $screen->action == 'add')) and in_array('administrator', $user->roles)) {
            // clear all errors so they can bypass validation for user data
            acf_reset_validation_errors();
        }

    }

}

Обратите внимание: поскольку get_current_screen() не всегда доступен, эти методы не поддерживают внешние формы.

Также обратите внимание, что этот код определенно можно улучшить, сделав его более СУХИМ, но я оставлю это на ваше усмотрение. :)

person Brett    schedule 28.12.2018