Если честно, я не знаю как правильно сформулировать заголовок. Идея сводится вот к чему: имеем WordPress с установленным плагином BuddyPress, в профиля пользователя вкладки (по-другому, меню профиля), требуется добавить новую вкладку (таб) и сделать ее видимой в профиле только у пользователей с определенной ролью.

Уточняю. Вкладка не скрывается от всех и показывается пользователю с определенной ролью, а показывается в профиле пользователя с определенной ролью. То есть отображение зависит не от роли посетителя, а от роли владельца профиля. Такова задача.

Добавить вкладку

Приступим. Первое, что сделаю — добавлю новую вкладку (таб) на страницу профиля.

function new_tab() {
    global $bp;
      bp_core_new_nav_item( array(
            'name' => __( 'Курсы' ),
            'slug' => 'my-courses',
            'position' => 80,
            'screen_function' => 'new_tab_action',
            'show_for_displayed_user' => true,
            'item_css_id' => 'my-courses'
      ) );
}
add_action( 'bp_setup_nav', 'new_tab', 1000 );

Для тех кому нужно просто добавить вкладку с каким-либо содержимым — почти все готово. Осталось описать содержимое вкладки с помощью обозначенной функции new_tab_action. Может быть что угодно: просто текст с картинками, список статей и т.д.

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

function new_tab_action() {
    $url = '/profile/' . bp_get_displayed_user_username();
    bp_core_redirect( site_url( $url ) );
}

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

Отображение вкладки

Вернемся с отображению вкладки. Осталось показать вкладку только на страницах пользователей с определенной ролью. Пусть это будет роль поэта — poet.

if ( user_can ( bp_displayed_user_id(), 'poet' ) )

Вставляю эту проверку в функцию new_tab и получаю ожидаемый результат.

Тут нужно оговориться, что роль поэта должна быть заведена в WordPress. И к стати, можно проверять не только, так скажем, глобальные роли WordPress, но и роли BuddyPress (как вы знаете в настройках можно включить такую опцию). Проверить можно следующим образом:

$user_id = bp_displayed_user_id(); - получаем ID владельца просматриваемого профиля
if ( ! bp_has_member_type( $user_id, 'poet' ) ) - проверяем роль пользователя

Вместо заключения, код для вставки контента во вкладку:

function new_tab_action () {
    add_action( 'bp_template_title', 'Новая вкладка' );
    add_action( 'bp_template_content', 'Содержание.  вкладки' );
    bp_core_load_template( apply_filters( 'bp_core_template_plugin', 'members/single/plugins' ) ); - подгружаем шаблон
}

Всем удачи!