Apakah mungkin untuk memfilter komentar dalam posting sehingga pengguna hanya dapat melihat komentar yang telah mereka tulis?

8

Saya relatif baru di wordpress, dan coding, dan saya bekerja di sebuah situs di mana para pengguna perlu meninggalkan komentar untuk posting tertentu, tetapi orang yang saya bangun di situs menginginkan pengguna hanya dapat melihat komentar mereka. telah menulis untuk posting khusus ini, dan tidak ada komentar dari pengguna lain.

Saya sudah mencari-cari sebentar sekarang, dan belum dapat menemukan solusi yang tampaknya berhasil. Apakah ada cara agar ini berfungsi yang cukup sederhana untuk saya implementasikan? Bantuan apa pun akan sangat dihargai.

Terima kasih!

Keith Pocock
sumber

Jawaban:

2

Dengan asumsi penulis komentar Anda dimaksudkan untuk menjadi pengguna terdaftar, cara termudah adalah mungkin untuk menggunakan pre_get_commentstindakan kait untuk memodifikasi WP_Comment_Queryobjek 's user_idvar permintaan sehingga query hanya mengembalikan komentar dari pengguna saat ini:

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

Anda juga dapat menggunakan current_user_can()alih-alih / di samping memeriksa peran pengguna untuk menyesuaikan komentar yang difilter.

Meskipun Anda juga dapat mendukung komentar anonim dengan menggunakan wp_get_current_commenter()dalam hubungannya dengan author_email WP_Comment_Queryargumen, ini tidak terlalu dapat diandalkan atau aman. Data ID komentator anonim disimpan dalam cookie, artinya pengguna dapat menghapusnya atau cookie dapat kedaluwarsa - dalam hal ini pengguna tidak dapat melihat komentar mereka sampai mereka memposting yang lain. Kredensial juga cukup mudah dipalsukan - pengunjung yang licik berpotensi mendapatkan akses ke komentar dari pengguna lain.


EDIT - Mengapa ini tidak berhasil, sebelumnya

Setelah penyelidikan lebih lanjut, upaya saya sebelumnya untuk menggunakan WP_Comment_Query::set()untuk mengubah variabel permintaan gagal karena ternyata, WP_Comment_Querysebenarnya tidak memiliki set()metode, tidak seperti WP_Queryrekannya (lihat tiket # 39120 ). Namun ia memiliki __call()"Metode Sihir" , yang mencegat panggilan ke metode yang tidak ada set()dan mengembalikan false, sehingga mencegah kesalahan yang biasanya dilemparkan PHP dan membingungkan saya tanpa akhir.

bosco
sumber
Hai Bosco, Terima kasih atas tanggapan cepat Anda. Anda benar berasumsi bahwa ini adalah untuk pengguna terdaftar. Maaf saya tidak mengklarifikasi dalam posting asli saya. Jadi saya tidak mengacaukannya, di mana kode ini ditempatkan? Dalam file comments.php?
Keith Pocock
1
@KeithPocock Ini adalah "tindakan kait" - jadi itu akan dieksekusi ketika perlu selama WordPress memproses kode. Anda dapat menempelkannya di functions.phpfile tema Anda , namun jika pihak ketiga yang membuat tema, perubahan bisa ditimpa saat tema diperbarui. Tempat terbaik untuk meletakkan ini adalah di plugin baru - ikuti bagian "Memulai" dari Buku Pegangan Pengembangan Plugin (hanya bagian paling atas dari halaman) untuk membuat file plugin baru, kemudian tempelkan solusi dalam jawaban saya di bawah informasi tajuk.
bosco
Hai Bosco, terima kasih atas klarifikasi. Saya mencoba untuk meletakkannya di file functions.php, tetapi tidak menyaring komentar untuk pengguna tertentu ketika saya mengujinya (kemungkinan besar sesuatu yang saya lakukan salah atau tidak mengerti haha). Saya akan mencobanya sebagai plugin kali ini, dan akan merespons kembali dengan hasil apa pun. Terima kasih lagi!
Keith Pocock
@KeithPocock Ups! Saya menemukan sedikit bug dalam kode saya - itu harus bekerja di salah satu plugin atau functions.phpsekarang (walaupun jujur ​​saya belum benar-benar mengujinya Oo). Biarkan saya tahu bagaimana kelanjutannya!
bosco