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

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

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

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() не всегда доступны, эти методы не поддерживают интерфейсные формы.

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

Другие вопросы по тегам