Existe-t-il un moyen de ne montrer que les commentaires d'un rôle d'utilisateur particulier à son même rôle d'utilisateur?
Par exemple: L'utilisateur connecté appartient au rôle d'utilisateur "Annonceurs". Il ne doit voir que les commentaires qu'il a faits ainsi que tous les utilisateurs sous son rôle.
Je vous remercie.
Oui, vous pouvez,
Frontend seulement
vous auriez besoin de vérifier chaque auteur de commentaire d'article pour son rôle. Si le rôle de l'auteur de ce commentaire n'est pas adverstisers, supprimez-le du tableau des commentaires attachés à ce message.
Ensuite, vous ne devriez renvoyer que les commentaires si l'utilisateur actuellement connecté appartient également au rôle annonceurs.
en utilisant le filtre comments_array
, nous pouvons passer en revue chaque commentaire attaché à un message. Mais ce filtre est appliqué dans comments_template afin qu'il n'affecte pas les commentaires d'accès dans le backend.
Voici comment vous pouvez le faire
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 et 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;
}
EDIT
J'ai modifié la deuxième fonction.
Voir la réponse de @ birgire J'ai compris qu'il existait une requête author_in
et que, grâce à get_users
et à la requête arg role__in
, nous pouvons obtenir l'effet souhaité à la fois sur le front et sur le back-end.
Alors merci à @birgire pour l'inspiration :)
EDIT
Pour autoriser davantage que le rôle de l'utilisateur actuel dans la récupération de commentaires (comme l'ajout de commentaires faits par des administrateurs), ajoutez simplement le tableau dans role__in
avec les rôles souhaités.
alors la fonction deviendrait
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;
}
ou (pour la lisibilité sur ce forum)
$permitted_roles = array(
'administrator',
$current_user->roles[0],
);
$user_ids = get_users( array(
'role__in' => $permitted_roles,
'fields' => 'ID'
) );
Voici un moyen (non testé) d'afficher les commentaires des utilisateurs ayant le même rôle que l'utilisateur actuel:
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;
} );
Nous supposons ici que la base d'utilisateurs n'est pas énorme et que nous utilisons le filtre comments_template_query_args
pour cibler la requête de commentaires principale dans la partie comments_template()
du thème.