Ist es möglich, Kommentare in einem Beitrag zu filtern, sodass ein Benutzer nur die von ihm geschriebenen Kommentare sehen kann?

8

Ich bin relativ neu in WordPress und Codierung und arbeite an einer Site, auf der die Benutzer Kommentare für bestimmte Beiträge hinterlassen müssen, aber die Person, für die ich die Site erstelle, möchte, dass der Benutzer nur die Kommentare sehen kann, die sie sehen habe für diese spezifischen Beiträge geschrieben und keine Kommentare von anderen Benutzern.

Ich habe jetzt eine Weile gesucht und konnte keine Lösung finden, die zu funktionieren scheint. Gibt es eine Möglichkeit, dies zum Laufen zu bringen, die für mich einfach zu implementieren ist? Jede Hilfe wäre sehr dankbar.

Vielen Dank!

Keith Pocock
quelle

Antworten:

2

Angenommen , Ihre Kommentar Autoren registrierte Nutzer sein sollen, ist der einfachste Weg , wahrscheinlich ein verwenden pre_get_commentsAktion Haken des ändern WP_Comment_QueryObjekt ‚s user_idAbfrage var so dass die Abfrage nur Kommentare von den aktuellen Benutzer zurückgibt:

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

Sie können anstelle von / zusätzlich zur Suche nach Benutzerrollen auch verwenden current_user_can(), um anzupassen, nach welchen Kommentaren gefiltert wird.

Sie können anonyme Kommentare auch wp_get_current_commenter()in Verbindung mit dem author_email WP_Comment_QueryArgument unterstützen, dies ist jedoch nicht besonders zuverlässig oder sicher. Anonyme Kommentator-ID-Daten werden in Cookies gespeichert, was bedeutet, dass der Benutzer sie löschen kann oder die Cookies verfallen könnten. In diesem Fall kann der Benutzer seine Kommentare erst anzeigen, wenn er einen anderen veröffentlicht. Die Anmeldeinformationen können auch ziemlich leicht gefälscht werden - geschickte Besucher könnten möglicherweise Zugriff auf Kommentare anderer Benutzer erhalten.


EDIT - Warum das vorher nicht funktioniert hat

Nach weiteren Untersuchungen scheiterten meine früheren Versuche, Abfragevariablen WP_Comment_Query::set()zu ändern, da sie, wie sich herausstellte, WP_Comment_Queryim set()Gegensatz zu ihrem WP_QueryGegenstück keine Methode haben (siehe Ticket Nr. 39120 ). Es gibt jedoch eine __call()"magische Methode" , die den Aufruf der nicht existierenden set()Methode abfing und false zurückgab, wodurch der Fehler verhindert wurde, den PHP normalerweise ausgelöst hätte, und der mich bis zum Äußersten verwirrte.

Bosco
quelle
Hallo Bosco, Danke für deine schnelle Antwort. Sie haben zu Recht angenommen, dass dies für registrierte Benutzer gilt. Entschuldigung, ich habe in meinem ursprünglichen Beitrag nicht klargestellt. Also vermassle ich das nicht, wo würde dieser Code platziert werden? In der Datei comments.php?
Keith Pocock
1
@KeithPocock Dies ist ein "Action-Hook" - er wird also ausgeführt, wenn es nötig ist, solange WordPress den Code verarbeitet. Sie können es in die functions.phpDatei Ihres Themas einfügen. Wenn jedoch ein Drittanbieter das Thema erstellt hat, können die Änderungen beim Aktualisieren des Themas überschrieben werden. Der beste Ort, um dies zu platzieren, ist ein neues Plugin - folgen Sie dem Abschnitt "Erste Schritte" des Plugin-Entwicklungshandbuchs (ganz oben auf der Seite), um eine neue Plugin-Datei zu erstellen, und fügen Sie die Lösung in meine Antwort unter dem ein Header-Informationen.
Bosco
Hallo Bosco, danke für die Klarstellung. Ich habe versucht, es in die Datei functions.php einzufügen, aber es hat die Kommentare für einen bestimmten Benutzer nicht herausgefiltert, als ich es getestet habe (höchstwahrscheinlich etwas, was ich falsch mache oder nicht verstehe, haha). Ich werde es dieses Mal als Plugin versuchen und mit allen Ergebnissen antworten. Danke noch einmal!
Keith Pocock
@ KeithPocock Ups! Ich habe einen kleinen Fehler in meinem Code gefunden - er sollte entweder in einem Plugin oder functions.phpjetzt funktionieren (obwohl ich ihn ehrlich gesagt noch nicht getestet habe, Oo). Lass mich wissen, wie es geht!
Bosco
1
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Bosco