読者です 読者をやめる 読者になる 読者になる

BuddyPressにアクティビティへのコメントの新着コメント数を出す方法

<完成画像>

f:id:aquashine:20161114112846j:plain

 

<考え方>

1.コメントがあるとDBのusermetaにコメントがあったレコードを追加する

2.コメントをみると、そのメタデータを削除する

 

<方法>

まずは、コメントが入った際に、メタデータに記録する。

 

/wp-content/plugins/buddypress/bp-activity/bp-activity-functions.php に、

function bp_update_user_meta( )があるので、DBに書き込むには、

この関数を使えばよさそう。

 

コメントが入ったときに実行されるフィルターを探すと、以下が見つかった。

 bp_activity_secondary_item_id_before_save

 

(※フィルターを探す方法はよくわからなかた。

以下のサイトでとにかく探しまくった。

http://hookr.io/plugins/buddypress/2.6.2/filters/#index=a

 

<プログラム>

以下の関数をテーマ内のfunction.phpに書く。

------------------

/*つぶやきへのコメントが入った際に、usermetaに書き込む*/

/* bp_activity_secondary_item_id_before_save()が実行される際、comment_record()を実行する */

add_filter('bp_activity_secondary_item_id_before_save', 'comment_record', 10, 1);

function comment_record ($array) {

//$arrayは、'bp_activity_secondary_item_id_before_save'から「secondary_item_id」が渡される


 //「secondary_item_id」から元ツイートのuser_idを出す

global $wpdb;
$results = $wpdb->get_results("SELECT id, user_id, item_id FROM wp1_bp_activity WHERE id = '".$array."' ORDER BY id DESC LIMIT 1" );
foreach ($results as $value) {
    $user_id = $value->user_id;
    $id = $value->id; //直接コメントしたコメントのid
    $item_id = $value->item_id;//大元のid
    if ($item_id==0) { //大元のスレッドのitemp_idは0になっている
        $item_id = $id;
    }
}

$new_comment_count = (int) bp_get_user_meta( $user_id, 'bp_new_comment_count', true );
$new_comments = bp_get_user_meta( $user_id, 'bp_new_comments', true );

// bp_new_commentsには以下のように記録する
//Array(
// [$id] => array(コメント数, 大元のid)
// [$id] => array(コメント数, 大元のid)
// ・・・・
//)

// Make sure new mentions is an array.
if ( empty( $new_comments ) ) {
     $new_comments = array();
}

if (array_key_exists($id, $new_comments)) { /*その$activity_idが既に存在している場合はインクリメント*/

     $new_comment_count = $new_comments[$id][0] + 1;
     $new_comments[$id] = array($new_comment_count, $item_id);
} else {
     $new_comments[$id] = array(1, $item_id);
}

//usermetaに書き込む関数

bp_update_user_meta( $user_id, 'bp_new_comments', $new_comments);

return $array;
}

------------------

 

上記をfunctionに書くと、DBのusermetaに

 Array(
   [$id] => array(コメント数, 大元のid)
   [$id] => array(コメント数, 大元のid)
 ・・・・
)

の形で書き込まれる。

 

<トップページへの表示>

次に、トップページへ表示させる。

 まず、function.phpに以下を書く。

-------------------------------

/*トップページのお知らせにつぶやきへのコメント数を表示させる*/

function comment_view () {

    global $wpdb;

    $user_id = bp_loggedin_user_id();

    $comment = bp_get_user_meta( $user_id, 'bp_new_comments', true );

    return $comment;

}

-------------------------------

 

 

そして、トップページ(または別のページ)のテンプレートファイルの表示させたい部分に以下を書く。

-------------------------------

 <?php
    $comment = comment_view();
    foreach ($comment as $key => $value){
        // $commentの構造=array(コメント数, 大元のスレッドid)
        echo "<a href='/activity/p/".$value[1]."?del_com=1&id=".$key."'>あなたのつぶやき(id:".$key.")への新規のコメントが、".$value[0]."件あります。</a><br>";
    }
?>

-------------------------------

 

<お知らせを押すと、お知らせを消す>

function.phpに以下を書く。

------------------------------------

/*トップページのお知らせにつぶやきへのコメント数を消す*/

function comment_del($id) {
    $user_id = bp_loggedin_user_id();
    $new_comments = bp_get_user_meta( $user_id, 'bp_new_comments', true );

    unset( $new_comments[$id] );

    //更新後のデータでusermetaを登録
    bp_update_user_meta( $user_id, 'bp_new_comments', $new_comments);
}

------------------------------------

 

上述のように、トップページに書くお知らせのリンク先URLを以下のようにする。

------------------------------------

<?php

foreach ($comment as $key => $value){

    echo "<a href='/activity/p/".$value[1]."?del_com=1&id=".$key."'>あなたのつぶやき(id:".$key.")への新規のコメントが、".$value[0]."件あります。</a><br>";

}

?>

 

------------------------------------

 

 

リンクを押したときに開くテンプレートファイルに以下を書く。

(私の場合、/wp-content/themes/twentysixteen/template-parts/content-page.php

------------------------------------

<?php
if (isset($_GET['del_com']) && isset($_GET['id']) && $_GET['del_com']==1){
    $id = htmlspecialchars($_GET['id'], ENT_QUOTES);
    comment_del($id);
}
?>

------------------------------------

 

以上。

めでたしめでたし(笑