web-dev-qa-db-fra.com

Buddypress envoie une notification par courrier électronique uniquement si l'utilisateur n'est pas connecté

Lorsqu'un membre envoie un message à un autre membre, le destinataire reçoit un message dans buddypress ainsi qu'un courrier électronique.

Je souhaite modifier cette option car, si vous recevez de nombreux messages, vous avez trop de messages dans votre boîte aux lettres, même si vous êtes connecté: je souhaite recevoir des messages uniquement si je ne suis pas connecté à buddybress.

J'ai trouvé où l'ajout du code mais je ne sais pas comment accrocher (add_action ou add_filter) Le fichier est: wp-content/plugins/buddypress/bp-messages/bp-messages-notifications.php

et la modification est à la fin du fichier, il suffit d’ajouter le test if avant d’envoyer un courrier électronique:

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

Comment puis-je faire cela sans changer le fichier core de buddypress?

3
Arystark

Une solution consiste à filtrer $email_to et à renvoyer une chaîne vide si le destinataire est connecté. De cette manière, wp_mail() ne pourra pas envoyer le message et renverra false. Ajoutez les éléments suivants au thème functions.php ou au fichier 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;
}

EDIT: Une solution possible pour votre cas avec le plugin que vous utilisez est d’obtenir tous les utilisateurs qui ont ce courrier électronique et de vérifier s’ils sont en ligne. passer cette liste à la fonction 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