bbpress пользовательские роли или возможности для каждого форума

Я пытаюсь настроить bbpress с расширенными пользовательскими возможностями.

Эта проблема

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

  • Пользователь A не может получить доступ к форумуW
  • Пользователь A может только читать темы и ответы на ForumX
  • Пользователь А может создавать темы и писать ответы на форумеY.
  • Пользователь A может модерировать ForumZ

Плагины

Это плагины, которые я пробовал до сих пор, но безуспешно:

  • Ultimate Member, официальная версия 1.7 и новая версия 2.0
    https://ultimatemember.com/
    Они утверждают, что они работают над расширением групп для UltimateMember v2, которое почему-то выглядит многообещающе, но на данный момент нет даты выпуска, и я до сих пор не знаю, решит ли это расширение мою проблему.

  • Подключаемый модуль групп itthinx
    http://docs.itthinx.com/document/groups/
    Позволяет мне назначать пользователям и форумам несколько групп, но есть одна загвоздка.

Первая попытка

Поскольку плагин itthinx Groups позволяет мне назначать пользователю A несколько групп, и это здорово, он все еще не решает мою проблему.

Итак, я попробовал что-то вроде этого:

  • На ForumX назначены следующие группы: ForumX_readers, ForumX_writers, ForumX_moderators

  • Пользователю А назначены следующие группы: ForumX_readers, ForumY_writers, ForumZ_moderators

Но проблема в том, что поскольку UserA принадлежит к группам, имеющим publish_replies и moderate возможности, он имеет полный доступ к ForumX.

Итак, что мне нужно, так это пересечение групп форума и групп пользователей, в данном примере это ForumX_readers.

Многообещающая часть, но...

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

К сожалению, мне не удалось получить доступ к переменным global $post, $_GLOBALS['post'] и $_REQUEST[] в этой части кода. Ни напрямую, ни с помощью функции apply_filters(), которую я сам внедрил в часть кода.

ОБНОВЛЕНИЕ: мне удалось получить идентификатор с помощью get_posts() и ярлыка текущего форума/темы.

Итак, мой вопрос

Есть ли какое-нибудь решение для моей первой попытки, за которой я, возможно, наблюдал?

Если нет, может быть, есть какой-нибудь другой плагин, который может решить мою проблему, о которой я не знаю?

Или такое даже в bbpress невозможно?


person ad_on_is    schedule 21.03.2018    source источник


Ответы (1)


После некоторых дальнейших исследований и проб и ошибок я, наконец, понял это.

Первый шаг — настроить возможности, которые в моем случае выглядят примерно так.

введите здесь описание изображения

В каталоге плагинов есть файл core/class-groups-user.php. Функция init_cache() извлекает группы, назначенные пользователю, и устанавливает соответствующие возможности.

Чтобы не возиться с основным плагином, я применил фильтр к переменной $group_ids, которую можно найти в строке: 415.

foreach( $user_groups as $user_group ) {
    $group_ids[] = Groups_Utility::id( $user_group->group_id );
}

// added this line
$group_ids = apply_filters('filter_user_group_ids', $group_ids);`

Затем я создал новый плагин, который подключается к этому фильтру.

add_filter('filter_user_group_ids', 'dnmc_filter_groups', 10, 1);

function dnmc_filter_groups($user_group_ids) {
    $forum_id = dnmc_get_forum_id();
    if(!$forum_id) return $user_group_ids;

    $forum_group_ids   = Groups_Post_Access::get_read_group_ids( $forum_id);
    $user_restricted_forum_group_ids = array_intersect($user_group_ids, $forum_group_ids);

    return $user_restricted_forum_group_ids;

}

function dnmc_get_forum_id() {
    $args_topic = array(
      'name'        => basename( untrailingslashit( rtrim($_SERVER['REQUEST_URI'], '/') ) ),
      'post_type'   => 'topic',
      'post_status' => 'publish',
      'numberposts' => 1
    );

    if($topic = get_posts($args_topic)) {
        return $topic[0]->post_parent;
    }

    $args_forum = array(
      'name'        => basename( untrailingslashit( rtrim($_SERVER['REQUEST_URI'], '/') ) ),
      'post_type'   => 'forum',
      'post_status' => 'publish',
      'numberposts' => 1
    );

    if($forum = get_posts($args_forum)) {
        return $forum[0]->ID;
    }

    return false;
}
person ad_on_is    schedule 22.03.2018