Как проверить, что авторизованный пользователь не является подписчиком

31 июл. 2012 г., 10:32:05
Просмотры: 24.2K
Голосов: 14

Существует ли условный тег, который позволит отображать определенный контент только если пользователь НЕ является подписчиком?

0
Все ответы на вопрос 3
3
19

Ещё более простой способ, чем показал @Brady — использование функции current_user_can:

if ( current_user_can( 'subscriber' ) )
    echo "Привет, дорогой подписчик! Рады видеть тебя снова!";

Мультисайт (MU)

Для мультисайтовых установок существует аналог — current_user_can_for_blog:

global $blog_id;
if ( current_user_can_for_blog( $blog_id, 'subscriber' ) ) 
    echo "Привет, дорогой подписчик! Рады видеть тебя снова в этом блоге!";

Под капотом

Если посмотреть исходный код функций для обычных или мультисайтовых установок, то видно, что обе по сути полагаются на wp_get_current_user(), а затем проверяют наличие has_cap. Если же вы хотите узнать, откуда берётся сама возможность (capability), то здесь в игру вступает класс/объект WP_User.

Другие члены этого семейства

Есть также author_can( $GLOBALS['post'], 'capability' );. Все эти функции расположены в файле ~/wp-includes/capabilities рядом друг с другом.

Когда что использовать?

В чём разница между current_user_can(_FOR_BLOG) и user_can?

  • user_can() — более новая (с версии 3.1), но требует передачу пользователя как объекта. Полезна, когда нужно проверить не текущего, а какого-либо пользователя.
  • current_user_can_*() — очевидно, работает с текущим пользователем.
  • author_can() позволяет проверять возможности относительно объекта записи. Этот объект доступен только для записей, уже находящихся в базе данных. В основном используется для разрешения/запрещения доступа к определённым функциям записи.
31 июл. 2012 г. 13:17:02
Комментарии

Я считаю, что это нужно обновить, потому что:

Не передавайте название роли в current_user_can(), так как это не гарантирует корректной работы (см. #22624).

со страницы current_user_can() в кодексе, насколько мне известно, ничего не изменилось.

Nicolai Grossherr Nicolai Grossherr
5 авг. 2014 г. 00:59:20

@ialocin Вы можете обновить это, если хотите (это уже 2+ года). В принципе, вы правы. С другой стороны, роль также добавляется как capability ;)

kaiser kaiser
5 авг. 2014 г. 02:47:52

Думаю, этого должно быть достаточно для замечания/обновления, кроме того, я тоже ленив... ;)

Nicolai Grossherr Nicolai Grossherr
5 авг. 2014 г. 11:41:48
0
12
<?php
$current_user = wp_get_current_user();
if ( ! user_can( $current_user, "subscriber" ) ) // Проверяем, что у пользователя нет роли подписчика
    echo 'Пользователь не является подписчиком';
else
    echo 'Пользователь является подписчиком';
?>
31 июл. 2012 г. 11:45:09
1
-3

Вы имеете в виду это?

global $userdata;
get_currentuserinfo();
if ( $userdata->user_level != 0 ) // проверяем уровень пользователя по ID уровня
{
  echo 'Пользователь не является подписчиком';
}
else
{
  echo 'Пользователь является подписчиком';
}

Подробнее об ID для разных уровней: http://codex.wordpress.org/Roles_and_Capabilities#User_Levels

Также существует функция current_user_can(), которая позволяет проверять конкретные возможности для большей гибкости. http://codex.wordpress.org/Function_Reference/current_user_can

31 июл. 2012 г. 11:34:27
Комментарии

Не используйте уровни пользователей... Вот что говорит кодекс по этому поводу: Для поддержания обратной совместимости с плагинами, которые всё ещё используют систему уровней пользователей (хотя это крайне не рекомендуется), стандартные Роли в WordPress также включают Возможности, соответствующие этим уровням. Уровни пользователей были окончательно устаревшими в версии 3.0.

Scott Scott
31 июл. 2012 г. 11:36:28