特定のユーザー役割から同じユーザー役割へのコメントだけを表示できる方法はありますか?
例:ログインしたユーザーは "Advertisers"ユーザーロールに属しています。彼と自分のロールの下にいるすべてのユーザーによって作成されたコメントのみが表示されます。
ありがとうございました。
はい、できます
フロントエンドのみ
各投稿コメントの作者にその役割を確認する必要があります。そのコメントの作者の役割がadverstisersではない場合、その投稿に添付されているコメントの配列からそれを削除してください。
現在ログインしているユーザーが広告主ロールからのものである場合は、コメントのみを返す必要があります。
comments_array
フィルターを使用して、投稿に添付されている各コメントを確認できます。しかし、このフィルタはcomments_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;
}
フロントエンドとバックエンド
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;
}
EDIT
私は2番目の機能を修正しました。
@ birgireの答えを見て、私はauthor_in
クエリ引数があることに気づきました、そしてget_users
をクエリ引数role__in
と一緒に使うことでフロントエンドとバックエンドの両方に望ましい効果を達成することができます。
それで、インスピレーションをくれた@birgireに感謝します:)
EDIT
コメントの取得における現在のユーザーの役割だけでなく(管理者によるコメントの追加など)、許可する役割を持つ配列を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'
) );
現在のユーザーと同じロールにいるユーザーからのコメントを表示するための1つの方法(未テスト)は次のとおりです。
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()
部分のメインコメントクエリをターゲットにするためにcomments_template_query_args
フィルターを使用します。