Какая модификация для входа только в определенную роль?

Я создал особую роль в WP admin, и теперь я хотел бы разрешить логину на определенную страницу интерфейса только людям с этой ролью. Как это сделать? Я все еще хочу иметь возможность входа в систему для всех людей для других областей.

Существуют расширенные плагины для ограничения доступа к странице на основе роли пользователя или других параметров. Однако, я думаю, следующий код так же прост, как и для проверки роли пользователя.

<?php global $current_user; if ( is_page( 'some-page' ) && in_array( 'some-role', $current_user->roles ) ) { // Show the page } else { // Howdy, stranger! Nothing to see here. } ?> 

Примечание. Этот код может войти в файлы шаблонов вашей темы, такие как index.php или page.php . Имейте в виду, что при переключении тем удаляется ограничение доступа к роли пользователя. Решение? Переместите эту функциональность в плагин. Обновление: GM предоставил версию плагина в своем ответе .

Вы хотите использовать user_can для проверки роли пользователя.

 $current_user = wp_get_current_user(); if (user_can( $current_user, 'specialrole' )) { // user is in your role } 

Трудно точно сказать, что вы пытаетесь сделать. Ваш вопрос очень минимален, и нет такой вещи, как «вход на страницу» (оставляя в стороне защищенные паролем страницы, которые не работают на основе роли).

Вы можете просто изменить приведенное выше в шаблон и напечатать сообщение «У вас нет доступа» для людей без правильной роли. Возможно, вы хотите перенаправить куда-нибудь:

 function redir_wrong_role() { if (is_page('Sample Page')) { if (!user_can( $current_user, 'specialrole' )) { wp_safe_redirect(home_url()); } } } add_action('template_redirect','redir_wrong_role'); 

Смотрите также:
http://codex.wordpress.org/Function_Reference/wp_get_current_user
http://codex.wordpress.org/Function_Reference/is_page
http://codex.wordpress.org/Function_Reference/wp_safe_redirect

Первая проблема заключается в том, как распознать, является ли страница одной из ограничений.

Если страница только одна, вы можете ее жестко кодировать (т.е. написать самостоятельно идентификатор или слизняк), так как это не хорошо, но приемлемо для одной страницы. Если на странице больше одного, вы, вероятно, найдете другое решение.

Я предлагаю создать шаблон страницы с именем «Restriced Page» и назначить его всем страницам, которые вы хотите ограничить.

Поэтому создайте файл с именем page-restriced.php , сохраните его в корне вашей темы и внутри напишите что-нибудь вроде:

 <?php /** * Template Name: Restricted Page */ ?> <?php get_template_part('page'); ?> 

Теперь назначьте шаблон «Ограниченная страница» на всю страницу, которую вы хотите отредактировать.

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

Решение состоит в том, чтобы изменить содержимое привязки страницы к фильтру the_content :

 add_filter('the_content', 'change_content_by_role'); function change_content_by_role( $content ) { remove_filter('the_content', 'change_content_by_role'); if ( is_page_template('page-restriced.php') ) { // I suggest to allow access to administrator or probably you cannot access $allowed_roles = array('administrator', 'your_special_role'); $the_user = wp_get_current_user(); if ( empty( array_intersect($allowed_roles, $the_user->roles ) ) ) { return __('You are not allowed to view this page.'); } } return $content ; } 

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

Другое бесплатное решение – создать файл с именем «not-allowed.php» и поместить его в папку темы, подключиться к фильтру template_include и показать этот файл, если пользователь не разрешен.

 add_filter('template_include', 'restrict_page_by_role'); function restrict_page_by_role( $template ) { if ( is_page_template('page-restriced.php') ) { // I suggest to allow access to administrator or probably you cannot access $allowed_roles = array('administrator', 'your_special_role'); $the_user = wp_get_current_user(); if ( empty( array_intersect($allowed_roles, $the_user->roles ) ) ) { return get_stylesheet_directory() . '/not-allowed.php'; } } return $template; }