web-dev-qa-db-ja.com

ユーザーがログインしていない場合にのみ、BuddypressがEメール通知を送信する

あるメンバーが別のメンバーにメッセージを送信すると、受信者はbuddypressでメッセージと電子メールを受信します。

私はそれを変更したいのですが、あなたがログインしていてもあなたのメールボックスにはたくさんのメールがあるのですから。

どこにコードを追加したのかわかりましたが、フックする方法がわかりません(add_actionまたはadd_filter)ファイルは次のとおりです。

そして、変更はファイルの最後にあり、電子メールを送信する前にifテストを追加するだけです。

if (!is_user_online($recipient->user_id)) {
     wp_mail( $email_to, $email_subject, $email_content );
}

どうすれば私はbuddypressのコアファイルを変更せずにこれを行うことができますか?

3
Arystark

受信者がログインしている場合は、$email_toをフィルタリングして空の文字列を返すことができます。これにより、wp_mail()はメッセージの送信に失敗し、falseを返します。以下をtheme functions.phpまたはbp-custom.phpファイルに追加してください。

add_filter('messages_notification_new_message_to', 'disable_loggedin_email_notification');
function disable_loggedin_email_notification($email_to) {
    $user = get_user_by('email',$email_to);
    if (bp_has_members("type=online&include=$user->ID")) {
        $email_to = '';
    }
    return $email_to;
}

編集:あなたが使っているプラ​​グインを使ってあなたのケースに考えられる解決策は、そのEメールを持っているすべてのユーザーを入手し、誰かがオンラインかどうかチェックすることです。そのリストをbp_has_members()関数に渡します。

add_filter('messages_notification_new_message_to', 'disable_loggedin_email_notification');

function disable_loggedin_email_notification($email_to) {
    $users = get_users(array(
        'search' => $email_to
    ));
    $ids = array();
    foreach ($users as $user) {
        $ids[] = $user->ID;
    }
    $ids = implode(',', $ids);
    if (bp_has_members("type=online&include=$ids")) {
        $email_to = '';
    }
    return $email_to;
}
1
Ahmad M