web-dev-qa-db-fra.com

Affichage des commentaires uniquement dans le même rôle d'utilisateur personnalisé

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.

4
Zeki

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' 
  ) );
4
bynicolas

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.

0
birgire