Ограничение доступа администратора к определенным страницам для определенных пользователей

18 мар. 2013 г., 15:52:16
Просмотры: 24K
Голосов: 7

Как следует из заголовка, я хотел бы ограничить доступ к определенным страницам в админ-панели для определенных пользователей.

При создании сайта с 45-50 страницами я понял, что было бы намного лучше с точки зрения пользовательского опыта, если бы в меню "Страницы" отображались только те страницы, которые пользователь может изменять/обновлять.

Я пробовал следующие плагины, но безуспешно. Advanced Access Manager имеет нужную функциональность, но не работает/содержит ошибки в версии 3.5.1.

http://wordpress.org/extend/plugins/advanced-access-manager http://wordpress.org/extend/plugins/role-scoper http://wordpress.org/extend/plugins/adminimize http://wordpress.org/extend/plugins/s2member

Может быть, есть решение через фрагмент кода в functions.php?

3
Комментарии

Вы хотите контролировать доступ для каждого пользователя в отдельности? То есть, вы не можете использовать Роли или Возможности для этого?

s_ha_dum s_ha_dum
18 мар. 2013 г. 16:27:49

Доступ/просмотр на основе Ролей или Возможностей подойдёт!

BoBoz BoBoz
18 мар. 2013 г. 16:31:29

Я должен подчеркнуть, что важная часть заключается в том, чтобы указанный пользователь/роль не видел определённые страницы в админ-панели. В отличие от невозможности редактировать определённые страницы.

BoBoz BoBoz
18 мар. 2013 г. 16:36:56
Все ответы на вопрос 2
7

Этот код отлично работает у меня (в файле functions.php):

$user_id = get_current_user_id();
if ($user_id == 2) {
    add_filter( 'parse_query', 'exclude_pages_from_admin' );
}

function exclude_pages_from_admin($query) {
    global $pagenow,$post_type;
    if (is_admin() && $pagenow=='edit.php' && $post_type =='page') {
        $query->query_vars['post__not_in'] = array('123','234','345');
    }
}
18 мар. 2013 г. 18:54:19
Комментарии

Это очень хороший ответ, +1. Обратите внимание, что вы можете принять свой собственный ответ как правильный...

Johannes Pille Johannes Pille
18 сент. 2014 г. 06:10:56

Хорошо, так и сделаю :)

BoBoz BoBoz
18 сент. 2014 г. 20:51:33

Ответ BoBoz отлично работал какое-то время, но теперь я получаю предупреждение: "call_user_func_array() ожидает, что параметр 1 будет корректным callback-ом, функция 'exclude_pages_from_admin' не найдена или имеет недопустимое имя". Как лучше всего исправить этот фрагмент кода, чтобы он не вызывал предупреждение? Спасибо!

ben.kaminski ben.kaminski
13 янв. 2016 г. 21:09:32

Я новичок в WordPress. Подскажите, где находится файл functions.php. Он находится в папке wp-includes? Если да, то я получаю ошибку Call to undefined function add_filter().

Nishad Up Nishad Up
18 февр. 2016 г. 11:35:11

Сейчас мой пользователь имеет роль "Автор" и не видит меню "Страницы" в админ-панели. Я не хочу повышать его права больше, чем необходимо для доступа к трём страницам. Я добавил код, но пользователь не может получить доступ к страницам, так как у него нет пункта "Страницы" в левом меню. Как мне отобразить этот пункт меню, чтобы при клике он видел свои три страницы, которые ему разрешено редактировать? В крайнем случае, если бы я мог показать ссылку "Редактировать" на самой странице, это тоже сработало бы. Но данный сниппет кода не предоставляет такой функциональности.

harperville harperville
25 февр. 2017 г. 23:48:24

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

Philip Ingram Philip Ingram
15 авг. 2019 г. 22:28:25

Почему мы используем хук parse_query? Что делает его наиболее подходящим для этого? Спасибо

JDandChips JDandChips
13 сент. 2021 г. 17:09:17
Показать остальные 2 комментариев
1

Мне не дают оставить комментарий, поэтому я добавляю это как новый ответ.

Ошибка:

Warning: "call_user_func_array() ожидает, что параметр 1 будет корректным callback-ом, функция 'exclude_pages_from_admin' не найдена или имеет недопустимое имя".

... возникает из-за того, что функция вызывается только после проверки user_id. Поэтому если вы вошли НЕ под этим пользователем, функция не существует, и фильтр возвращает эту ошибку, так как он ищет функцию, но не может её найти.

Правильный вариант:

add_filter( 'parse_query', 'exclude_pages_from_admin' );

function exclude_pages_from_admin($query) {
    $user_id = get_current_user_id();

    if ($user_id == 2) {
    global $pagenow,$post_type;
     if (is_admin() && $pagenow=='edit.php' && $post_type =='page') {
        $query->query_vars['post__not_in'] = array('123','234','345');
     }
    }
}
11 янв. 2017 г. 18:28:16
Комментарии

Я отредактировал исходный ответ, чтобы исправить неправильную регистрацию callback-функции.

Tim Tim
9 июн. 2020 г. 16:45:55