Mostrar comentarios solo para el mismo rol de usuario personalizado

4

¿Hay alguna forma en que pueda mostrar solo los comentarios de un rol de usuario en particular a su mismo rol de usuario?

Por ejemplo: el usuario que ha iniciado sesión pertenece a la función de usuario "Anunciantes", solo debe ver los comentarios realizados por él y por todos los usuarios bajo su función.

Gracias.

    
pregunta Zeki 25.08.2016 - 09:45

2 respuestas

4

Si puedes,

Sólo frontend

necesitarías revisar el autor de cada comentario para su función. Si el rol del autor de ese comentario no es adverstisers , elimínelo de la matriz de comentarios adjunta a esa publicación.

Entonces, solo tendría que devolver los comentarios si el usuario que ha iniciado sesión actualmente también tiene el rol de anunciantes .

utilizando el filtro comments_array podemos revisar cada comentario adjunto a una publicación. Pero este filtro se aplica en comments_template para que no afecte los comentarios de acceso en el backend.

Así es como puedes hacerlo

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 y 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

He modificado la segunda función.

Al ver la respuesta de @birgire, me di cuenta de que había una consulta author_in arg y que al usar get_users con la consulta arg role__in podemos lograr el efecto deseado tanto en el frente como en el final.

Gracias a @birgire por la inspiración :)

EDIT

Para permitir más que solo el rol del usuario actual en la obtención de comentarios (como agregar comentarios hechos por administradores), simplemente agregue la matriz en role__in con los roles deseados

por lo que la función se convertiría

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;

}

o (para facilitar la lectura en este foro)

$permitted_roles = array(
  'administrator',
  $current_user->roles[0],
);

$user_ids = get_users( array( 
    'role__in' => $permitted_roles, 
    'fields' => 'ID' 
  ) );
    
respondido por el bynicolas 25.08.2016 - 11:26
0

Esta es una forma (no probada) de mostrar los comentarios de los usuarios en el mismo rol que el usuario actual:

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;

} );

Aquí asumimos que la base de usuarios no es enorme y usamos el filtro comments_template_query_args para dirigir la consulta de comentarios principal en la parte comments_template() en el tema.

    
respondido por el birgire 25.08.2016 - 11:13

Lea otras preguntas en las etiquetas