Разрешить администратору обойти обязательные поля в определенных ситуациях с ACF? - PullRequest
0 голосов
/ 28 декабря 2018

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

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

1 Ответ

0 голосов
/ 28 декабря 2018

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

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

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

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

...