Est-il possible de filtrer les commentaires dans un post afin qu'un utilisateur ne puisse voir que les commentaires qu'il a écrits?

8

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

Je fais des recherches depuis un moment maintenant et je n'ai pas pu trouver de solution qui semble fonctionner. Existe-t-il un moyen de faire fonctionner cela qui est assez simple pour moi à mettre en œuvre? Toute aide serait grandement appréciée.

Merci!

Keith Pocock
la source

Réponses:

2

En supposant que les auteurs de vos commentaires sont destinés à être des utilisateurs enregistrés, le moyen le plus simple consiste probablement à utiliser un crochet d' pre_get_commentsaction pour modifier la WP_Comment_Queryvariable de user_idrequête de l' objet de sorte que la requête ne renvoie que les 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 à la current_user_can()place de / en plus de vérifier les rôles d'utilisateur pour personnaliser les filtrages des commentaires.

Bien que vous puissiez également prendre en charge les commentaires anonymes en utilisant wp_get_current_commenter()conjointement avec l' author_email WP_Comment_Queryargument, ce n'est pas terriblement fiable ou sécurisé. Les données d'identification des commentateurs anonymes sont stockées dans des cookies, ce qui signifie que l'utilisateur peut les effacer ou que les cookies peuvent expirer - auquel cas l'utilisateur ne pourrait pas voir ses commentaires avant d'en publier un autre. Les informations d'identification sont également assez facilement usurpées - les visiteurs astucieux pourraient potentiellement avoir accès aux commentaires d'autres utilisateurs.


EDIT - Pourquoi cela ne fonctionnait pas, auparavant

Après une enquête plus approfondie, mes tentatives antérieures WP_Comment_Query::set()pour modifier les variables de requête ont échoué car, en WP_Comment_Queryfait , il n'a pas de set()méthode, contrairement à son WP_Queryhomologue (voir ticket # 39120 ). Il a cependant une __call()"méthode magique" , qui interceptait l'appel à la set()méthode inexistante et renvoyait false, empêchant ainsi l'erreur que PHP aurait normalement renvoyée et me confondant sans fin.

bosco
la source
Salut Bosco, Merci pour votre réponse rapide. Vous aviez raison de supposer que ce serait pour les utilisateurs enregistrés. Désolé, je n'ai pas précisé dans mon message d'origine. Donc je ne vis pas ça, où serait placé ce code? Dans le fichier comments.php?
Keith Pocock
1
@KeithPocock Ceci est un "crochet d'action" - il s'exécutera donc quand il le faudra tant que WordPress traitera le code. Vous pouvez le coller dans le functions.phpfichier de votre thème , mais si un tiers a créé le thème, les modifications pourraient être écrasées lors de la mise à jour du thème. Le meilleur endroit pour mettre cela est dans un nouveau plugin - suivez la section "Mise en route" du Manuel de développement de plugin (juste la partie la plus haute de la page) pour créer un nouveau fichier de plugin, puis collez la solution dans ma réponse sous la informations d'en-tête.
bosco
Salut Bosco, merci pour la clarification. J'ai essayé de le placer dans le fichier functions.php, mais il n'a pas filtré les commentaires d'un utilisateur spécifique lorsque je l'ai testé (probablement quelque chose que je fais mal ou ne comprenant pas haha). Je vais l'essayer en tant que plugin cette fois, et je répondrai avec tous les résultats. Merci encore!
Keith Pocock
@KeithPocock Oups! J'ai trouvé un petit bug dans mon code - il devrait fonctionner dans un plugin ou functions.phpmaintenant (bien que pour être honnête, je ne l'ai pas testé Oo). Faites-moi savoir comment ça se passe!
bosco
1
Continuons cette discussion dans le chat .
bosco