ACF Создать поле которое может редактировать только админ

Рейтинг: 0Ответов: 2Опубликовано: 11.01.2023

Скажите, есть ли возможность создать в админки поле плагина ACF типа Текст, редактирование значения которого в админке будет возможно только для пользователей ранга администратор? Поле для вкладки Users/Profile введите сюда описание изображения

Пробовал вот так. Через добавление в functions.php

function acf_field_read_only( $field ) {
    $field['readonly'] = ! current_user_can('manage_options');
    return $field;
}
add_filter( 'acf/load_field/name=user_rank', 'acf_field_read_only' );

Но, тут если пользователь заходит в DevTools и правит значение value данного поля, а потом всё сохраняет, то у него всё изменяется. И как этот баг обойти не понятно.

ReadOnly

Ответы

▲ 0

Да, возможно создать поле типа Текст в плагине ACF, которое может быть редактировано только пользователями с рангом администратора. Для этого можно использовать фильтр acf/load_field, как вы уже пробовали, и проверять роль пользователя с помощью функции current_user_can().

Чтобы обойти баг, который вы описали, можно добавить дополнительную проверку на стороне сервера при сохранении значения поля. Например, можно использовать хук acf/update_value и проверять роль пользователя перед сохранением значения, если роль не соответствует администратору, вернуть предыдущее значение и выдать сообщение об ошибке.

▲ 0

Вы можете запретить пользователям редактировать значение поля, используя для поля атрибут "readonly". Однако, как вы упомянули, это можно обойти, отредактировав значение в инструментах разработчика браузера. Чтобы предотвратить это, вы можете использовать проверку на стороне сервера, чтобы проверить, есть ли у пользователя правильные разрешения, прежде чем обновлять значение поля.

Вот пример того, как вы можете сделать это с помощью плагина Advanced Custom Fields (ACF):

function acf_validate_user_rank($valid, $value, $field, $input) {
    if (!current_user_can('manage_options')) {
        $valid = false;
    }
    return $valid;
}
add_filter('acf/validate_value/name=user_rank', 'acf_validate_user_rank', 10, 4);

Этот код добавляет фильтр проверки для поля "user_rank", который проверяет, есть ли у текущего пользователя возможность "manage_options" (которая обычно предоставляется только администраторам). Если у пользователя нет этой возможности, проверка завершится ошибкой и значение поля не будет обновлено.

Важно отметить, что эта проверка работает только на стороне сервера, а проверку на стороне клиента все еще можно обойти с помощью инструментов браузера.