「wordpress」タグアーカイブ

コメントページの上のコメント数を「あなたの記事に書かれた、他ユーザーのコメント数」のみカウントする方法 WordPress BuddyPressカスタマイズメモ

管理画面のコメントページでコメント数は「あなたの記事に書かれた、他ユーザーのコメント数」のみカウントさせる

WordPressのSNSプラグイン、BuddyPressを導入すると不特定多数のメンバーが参加することになる。

他人の記事へのコメントを、投稿者に見せる必要はないので、それを非表示にした上で、コメントページの上にある、コメント数のカウントを自分の投稿へのコメントのみカウントするようにする。
 

functions.php へ記述

//投稿者のみ、コメントを「自分の投稿」へのコメント数のみカウント

function myblogs_comments_count() {
 global $pagenow;
 if(is_admin() && current_user_can( 'author' )){ //管理画面かつ投稿者権限の場合
  global $user_ID;
  get_currentuserinfo();
  if ( false === ( $stats = get_transient( 'myblogs_author'.$user_ID.'_comments' ) ) ) {
   $stats = array('moderated'=>0,'approved'=>0,'post-trashed'=>0,'trash'=>0,'total_comments'=>0,'spam'=>0);
   $the_query = new WP_Query( array('author' => $user_ID,'posts_per_page' => -1) );
   if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();
    $comments = myblogs_count_comments(get_the_id()); //それぞれの状態のコメントをカウント
    $stats['moderated'] = $stats['moderated'] + $comments->moderated;
    $stats['approved'] = $stats['approved'] + $comments->approved;
    $stats['post-trashed'] = $stats['post-trashed'] + $comments->{'post-trashed'};
    $stats['trash'] = $stats['trash'] + $comments->trash;
    $stats['total_comments'] = $stats['total_comments'] + $comments->total_comments;
    $stats['spam'] = $stats['spam'] + $comments->spam;
   endwhile;
   endif;
   wp_reset_postdata();
   set_transient( 'myblogs_author'.$user_ID.'_comments', $stats, 60 * 30 );
  }
  return (object) $stats;
 }
}
add_filter('wp_count_comments','myblogs_comments_count');

//「自分の投稿」へのコメント数をカウントの後半

function myblogs_count_comments( $post_id = 0 ) {
 global $wpdb;
 $post_id = (int) $post_id;
 if ( !empty($stats) )
  return $stats;
  $count = wp_cache_get("comments-{$post_id}", 'counts');
 if ( false !== $count )
  return $count;
  $where = '';
 if ( $post_id > 0 )
  $where = $wpdb->prepare( "WHERE comment_post_ID = %d", $post_id );   $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} {$where} GROUP BY comment_approved", ARRAY_A );
  $total = 0;
  $approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed');
 foreach ( (array) $count as $row ) { // 全てで、ゴミ箱のものはカウントしない
  if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] )
   $total += $row['num_comments'];
  if ( isset( $approved[$row['comment_approved']] ) )
   $stats[$approved[$row['comment_approved']]] = $row['num_comments'];
 }
 $stats['total_comments'] = $total;
 foreach ( $approved as $key ) {
  if ( empty($stats[$key]) )
   $stats[$key] = 0;
 }
 $stats = (object) $stats;
 wp_cache_set("comments-{$post_id}", $stats, 'counts');
 return $stats;
}

 
なお、
「コメント」に、「あなたの記事に他ユーザーが書いたコメント」のみを表示させる方法はこちらを参照。

「コメント」に、「あなたの記事に他ユーザーが書いたコメント」のみを表示させる WordPress BuddyPressカスタマイズメモ

「コメント一覧」に「あなたの記事に他ユーザーが書いたコメント」のみを表示する方法

WordPressのSNSプラグイン、BuddyPressを導入すると不特定多数のメンバーが参加することになる。

そのままの状態では、投稿者でも、全員のコメントが見えるし、編集、削除もできてしまう。

管理画面のコメントには、自分の投稿記事に対してつけられたコメントのみを表示する。

コメントの編集権に関しては、人が書いたコメントは編集できないようにしておく。
 

functions.php へ記述

//投稿者のみ、「自分の投稿」へのコメントのみ表示

if (!current_user_can('administrator')) {
function myblogs_user_comments_only($query){
 global $pagenow;
 if('edit-comments.php' != $pagenow || $query->is_admin) { //コメントページで
  return $query;
 } else {
  global $user_ID;
  $query->query_vars['post_author'] = $user_ID; //記事投稿者とログインユーザーIDが一致のものだけ
 }
 return $query;
}
add_filter('pre_get_comments','myblogs_user_comments_only');
}

“管理者”でも非表示にしたい場合は、一番上と一番下の

if (!current_user_can('administrator')) {

}

を削除すればいい。

なお、
投稿者が人のコメントを編集、削除できないようにする方法はこちらを参照。

「あなたのコメント」「あなたの記事へのコメント」の編集権の調整 WordPress BuddyPressカスタマイズメモ

コメントの編集権の調整。投稿者が人のコメントを編集、削除できないようにする

WordPressのSNSプラグイン、BuddyPressを導入すると不特定多数のメンバーが参加することになる。

自分の投稿に対しての、人のコメントは編集させたくない。

人の投稿につけた、自分のコメントは編集できるようにしておく。
 

functions.php へ記述

管理者権限以外の場合、コメントページ(自分の投稿へつけてくれた、人のコメント一覧を表示している)の編集権を剥奪する。

//「自分の投稿」へのコメントの編集権削除と、後半「自分のコメント」の編集権付与
// $allcaps[$cap] = true; が権限与える、 unset( $allcaps[$cap] ); が剥奪

if ( 'edit-comments.php' == $pagenow && !current_user_can('administrator')  ){
function only_edit_comment() {
function remove_comment_cap( $allcaps, $caps, $args ) {
 global $pagenow;
 if ( 'edit_comment' == $args[0] && get_current_user_id() == $args[1] && 'edit-comments.php' == $pagenow ) {
  foreach ( $caps as $cap ) {
   unset( $allcaps[$cap] ); //コメント編集権剥奪
  }
 }
 if ( 'edit_comment' == $args[0] && get_current_user_id() == $args[1] && 'edit-comments-mine.php' == $pagenow ) {
  foreach ( $caps as $cap ) {
   $allcaps[$cap] = true; //「あなたのコメント」ページでは編集権付与
  }
 }
 return $allcaps;
}
add_filter( 'user_has_cap', 'remove_comment_cap', 10, 3 );
}
add_action( 'admin_head-edit-comments.php', 'only_edit_comment', 10, 3);
}

//コメント編集権限与えるため、「あなたのコメントページ」に「edit(編集)とtrash(削除する)」だけ残す

if ( 'edit-comments-mine.php' == $pagenow && !current_user_can('administrator')  ) {
//comment-edit-mineのページのみ
function only_edit_comment_mine() {
//メニュー表示非表示切り替え
function self_comment_del( $actions, $comment ) {
unset($actions['reply']);
unset($actions['approve']);
unset($actions['unapprove']);
unset($actions['quickedit']);
//unset($actions['edit']);
unset($actions['spam']);
//unset($actions['trash']);
 return $actions;
}
add_filter( 'comment_row_actions', 'self_comment_del', 10, 2 );

//編集権を与える時に使う処理

function add_comment_cap( $allcaps, $caps, $args ) {
 global $pagenow;
 foreach ( $caps as $cap ) {
  $allcaps[$cap] = true;
 }
 return $allcaps;
}
add_filter( 'user_has_cap', 'add_comment_cap', 10, 3 );

関連記事:
・「あなたのコメント」を管理画面のメニューに追加

・「あなたのコメント」に投稿者自身が、人の記事に書いたコメントを表示

・「あなたのコメント」の上のコメントメニュー(スパム、承認待ち等を)削除

・「あなたのコメント」の上のコメントメニュー(スパムチェック、一括操作も)削除