web-dev-qa-db-fra.com

Est-il possible de filtrer les commentaires dans un message pour un utilisateur?

Je suis relativement nouveau sur wordpress et le codage, et je travaille sur un site où les utilisateurs devront laisser des commentaires pour certains messages, mais la personne que je construis pour le site souhaite que l'utilisateur ne puisse voir que les commentaires qu'il a ont écrit pour ces messages spécifiques, et pas les commentaires d'autres utilisateurs.

Cela fait un moment que je fais des recherches et je n'ai pas trouvé de solution qui semble fonctionner. Y a-t-il un moyen de faire fonctionner cela assez simplement pour que je puisse le mettre en œuvre? Toute aide serait grandement appréciée.

Merci!

8
Keith Pocock

En supposant que vos auteurs de commentaires soient destinés à être des utilisateurs enregistrés, le moyen le plus simple consiste probablement à utiliser un pre_get_comments action hook pour modifier le WP_Comment_Query objet 's user_id de sorte que la requête ne renvoie que commentaires de l'utilisateur actuel:

function wpse262203_restrict_comment_views( $comments_query ) {
  // Don't interfere with comment results in the dashboard
  if( is_admin() )
    return;

  $current_user = wp_get_current_user(); // Get the current user

  if( $current_user instanceof WP_User && is_user_logged_in() ) {
    // The visitor is logged in as a WordPress user...

    // If they're an administrator, don't filter the comments
    if( in_array( 'administrator', $current_user->roles ) )
      return;

    // Otherwise, restrict queried comments to those authored by this user.
    $comments_query->query_vars[ 'user_id' ] = $current_user->ID;
  }
  else {
    // The visitor isn't logged in - make sure no comments are queried.
    $comments_query->query_vars[ 'comment__in' ] = array(0);
  }
}

add_action( 'pre_get_comments', 'wpse262203_restrict_comment_views' );

Vous pouvez également utiliser current_user_can() au lieu de/en plus de vérifier les rôles d'utilisateur pour personnaliser les filtres pour lesquels les commentaires sont filtrés.

Bien que vous puissiez également prendre en charge les commentaires anonymes en utilisant wp_get_current_commenter() en conjonction avec l'argument author_emailWP_Comment_Query, cela n'est ni très fiable ni sécurisé. Les données d'identification de commentateur anonyme sont stockées dans des cookies, ce qui signifie que l'utilisateur peut les effacer ou que les cookies peuvent expirer. Dans ce cas, l'utilisateur ne pourrait pas afficher ses commentaires tant qu'ils n'en auraient pas publié un autre. Les identifiants sont également assez facilement usurpés - les visiteurs malins pourraient potentiellement accéder aux commentaires d’autres utilisateurs.


EDIT - Pourquoi cela ne fonctionnait pas, auparavant

Après des recherches plus poussées, mes tentatives précédentes d’utiliser WP_Comment_Query::set() pour modifier les variables de requête échouaient, car il s’avère que WP_Comment_Query n’a pas de méthode set(), contrairement à son homologue WP_Query (voir ticket # 39120 ). Cependant, il possède une __call() "Méthode magique" , qui interceptait l'appel de la méthode non existante set() et renvoyait false, empêchant ainsi l'erreur que PHP aurait normalement renvoyée et me déroutant sans fin.

2
bosco