Intereting Posts
Как отредактировать боковую панель (не похоже на меню)? добавить мета-поле, используя функцию.php Как сохранить файлы темы wordpress и установить их на другой сайт? В чем разница между функциями get_page_link и get_permalink? Отображение настраиваемого поля Допустимая фатальная ошибка: объект класса WP_Error ошибка в форме расширенного поиска для пользовательских типов сообщений в WordPress array_key_exists () ожидает, что параметр 2 будет массивом, указанная строка Как эхо-описание тега на loop-page.php с использованием WPeC 3.8 Залить параметр term_query terms с почтовым термином Не удалось войти с правильными учетными данными? категория города, сделанная как субдомен 404 при открытии страниц портфолио Singe Стильный лист не загружается на firefox и IE! Конфигурация контрольных панелей в customize-preview-init Какие фильтры или действия следует использовать после загрузки и удаления мультимедиа?

Показывать комментарии только к той же пользовательской роли пользователя

Есть ли способ показать только комментарии определенной роли пользователя к его же роли пользователя?

Например: зарегистрированный пользователь принадлежит к роли пользователя «Рекламодатели», он должен видеть только комментарии, сделанные им и всеми пользователями под его ролью.

Спасибо.

Да, ты можешь,

Только Frontend

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

Затем вам придется возвращать только комментарии, если текущий пользователь, входящий в систему, также принадлежит роли рекламодателей .

используя фильтр comments_array мы можем переходить к каждому комментарию, прикрепленному к сообщению. Но этот фильтр применяется в комментарии_template, поэтому он не будет влиять на комментарии доступа в бэкэнд.

Вот как вы можете это сделать

 add_filter( 'comments_array' , 'wpse_filter_by_role_frontend' , 10, 2 ); function wpse_filter_by_role_frontend( $comments, $post_id ){ $current_user = wp_get_current_user(); // retrieve the currently logged in user // go over each comments for the current post foreach( $comments as $key => $comment ){ $comment_author = new WP_User( $comment->user_id ); // for each comment get the author user object // here we say unset the current comment if the role of the comment author is not the same as the role of the logged in user if( $comment_author->roles[0] != $current_user->roles[0] ){ unset( $comments[$key] ); } } // Return the filtered $comments array return $comments; } 

Frontend и backend

 add_action( 'pre_get_comments' , 'wpse_hide_for_backend' ); function wpse_hide_for_backend( $comments_query ){ // Hide all for non logged in users if( !is_user_logged_in() ){ return $comments_query->query_vars['comment__in'] = array(0); } $current_user = wp_get_current_user(); // if you don't want to apply restrictions to admins if( $current_user->roles[0] == 'administrator' ){ return $comments_query; } $user_ids = get_users( array( 'role__in' => $current_user->roles, 'fields' => 'ID' ) ); $comments_query->query_vars['author__in'] = $user_ids; } 

РЕДАКТИРОВАТЬ

Я изменил вторую функцию.

Увидев ответ @ birgire, я понял, что существует author_in query arg и с помощью get_users с запросом arg role__in мы можем добиться желаемого эффекта как на переднем, так и на заднем конце.

Так спасибо @birgire за вдохновение 🙂

РЕДАКТИРОВАТЬ

Чтобы не просто роль текущего пользователя при выборе комментариев (например, добавление комментариев, сделанных администраторами), просто добавьте массив в role__in с требуемыми ролями

поэтому функция

 add_action( 'pre_get_comments' , 'wpse_hide_for_backend' ); function wpse_hide_for_backend( $comments_query ){ // Hide all for non logged in users if( !is_user_logged_in() ){ return $comments_query->query_vars['comment__in'] = array(0); } $current_user = wp_get_current_user(); // if you don't want to apply restrictions to admins if( $current_user->roles[0] == 'administrator' ){ return $comments_query; } $user_ids = get_users( array( 'role__in' => array( 'administrator', $current_user->roles[0], ), 'fields' => 'ID' ) ); $comments_query->query_vars['author__in'] = $user_ids; } 

или (для удобства чтения на этом форуме)

 $permitted_roles = array( 'administrator', $current_user->roles[0], ); $user_ids = get_users( array( 'role__in' => $permitted_roles, 'fields' => 'ID' ) ); 

Вот один из способов (непроверенный) отображать комментарии пользователей в той же роли, что и текущий пользователь:

 add_filter( 'comments_template_query_args', function( array $args ) { // Nothing to do for visitors if( ! is_user_logged_in() ) return $args; // Nothing to do for threaded comments if( isset( $args['hierarchical'] ) && 'threaded' === $args['hierarchical'] ) return $args; // Get current user $u = wp_get_current_user(); // Nothing to do for users without any roles if( ! isset( $u->roles ) ||empty( $u->roles ) ) return $args; // Fetch user ids with the same role $user_ids = get_users( [ 'role__in' => (array) $u->roles, 'fields' => 'ID' ] ); // Restrict comment authors if( ! empty( $user_ids ) ) $args['author__in'] = (array) $user_ids; return $args; } ); 

Здесь мы предполагаем, что пользовательская база не огромна, и мы используем фильтр comments_template_query_args для таргетинга основного комментария в разделе comments_template() в теме.