Собственные уведомления в BuddyPress

Недавно передо мной встала задача выводить собственные уведомления в buddybar одного сайта на Wordpress + BuddyPress. Недолго думая, я полез в гугл, и знаете что? Ни фигашеньки не нашел. Мдааа, этим BuddyPress одновременно и бесит, и нравится. Во всем приходится ковыряться и разбираться самому, но в то же время вызов - это всегда так занимательно.

Спойлер: да, я разобрался, как это сделать =)

Первым делом я полез в таблицу wp_bp_notifications, чтобы посмотреть, как там что устроено, и обнаружил следующие поля:
id, user_id (для кого уведомление), item_id, secondary_item_id, component_name, component_action , date_notified, is_new

Для чего нужны component_name и component_action я сначала не понял. При отправке сообщений в эту таблицу добавлялась запись со значениями 'messages' и 'new_message' соответственно. Но когда я пробовал вставить в базу что-то свое, например 'members' и 'new_thanks', уведомление не появлялось, и я начал рыть глубже. Нужно было разобраться, что это за component и какие action они делают.

Если глянуть в файл /wp-content/plugins/buddypress/bp-core/bp-core-loader.php, то мы заметим, что есть опциональные компоненты и обязательные:

$bp->optional_components = apply_filters( 'bp_optional_components', array( 'activity', 'blogs', 'forums', 'friends', 'groups', 'messages', 'settings', 'xprofile' ) );
$bp->required_components = apply_filters( 'bp_required_components', array( 'members' ) );

Нам ни к чему создавать отдельный новый компонент (да и не очень-то хочется), так что я решил использовать компонент members. Тут вообще нет разницы, какой компонент использовать, лишь бы он был включен (например, у меня на сайте были отключены Friend connections и Activity stream). А вообще, мне нужно было выводить уведомление, мол, "Вас поблагодарили за сообщение!", что-то вроде Like в Facebook, так что тут вообще заморачиваться много не пришлось.

Я сразу решил не делать какие-то корявые костыли, а сделать все красиво, поэтому первый вариант возможного решения я описывать не буду; в нашем нормальном способе нам нужно, чтобы у объекта компонента была задана переменная notification_callback - функция, которая вызывается, когда в базе появляется запись, у которой component_name = members в нашем случае.

Если сравнить файлы /wp-content/plugins/buddypress/bp-activity/bp-activity-loader.php и /wp-content/plugins/buddypress/bp-members/bp-members-loader.php, то у первого в переменной $globals присутствует элемент 'notification_callback', а у второго он вообще не указан, именно поэтому я сразу не понимал, что к чему, но теперь знаю, поэтому делюсь с вами, не тратьте время, ковыряясь в коде ;)

То есть, все, что нам остается, это по образцу указать название своей функции, используемой в качестве callback (т.е. которая будет вызываться при обнаружении в базе уведомлений нужного типа), и затем написать саму эту функцию.

В результате в файле bp-members-loader.php в функции setup_globals() у нас будет что-то вроде этого:

$globals = array( 
            'path'          => BP_PLUGIN_DIR, 
            'slug'          => BP_MEMBERS_SLUG, 
            'root_slug'     => isset( $bp->pages->members->slug ) ? $bp->pages->members->slug : BP_MEMBERS_SLUG, 
            'has_directory' => true, 
            'search_string' => __( 'Search Members...', 'buddypress' ), 
            'notification_callback' => 'bp_members_format_notifications', // здесь мы указываем свою функцию 
        );

Ну и напоследок добавляем эту функцию bp_members_format_notifications() в файл bp-members-functions.php; я просто скопировал ее из bp-activity-functions.php (там была bp_activity_format_notifications) и переделал под себя. Кстати, можно заносить в таблицу и использовать нужные вам значения item_id и secondary_item_id, они потом передаются в функцию параметрами. Получилось вот так просто:

function bp_members_format_notifications( $action, $item_id, $secondary_item_id, $total_items, $format = 'string' ) { 
    global $bp; 
 
    switch ( $action ) { 
        case 'new_thanks': 
            // EXAMPLE of using $item_id and $secondary_item_id 
            $thanks_for      = $item_id; 
            $who_thanked     = $secondary_item_id; 
            // then you can use these variables to format output; I didn't do it in this example 
 
            $link = '/members/'.$bp->loggedin_user->userdata->user_nicename.'/'; 
            $return = '<a href="'.$link.'">You\'ve been thanked!</a>'; 
        break; 
    } 
 
    return $return; 
} 
 

Вот и все! Теперь уведомления будут выводиться в buddybar, а добавлять и удалять их можно легко с помощью функций
bp_core_delete_notifications_by_type($user_id, $component_name, $component_action);
и
bp_core_add_notification( $item_id, $user_id, $component_name, $component_action, $secondary_item_id = 0, $date_notified = false );

Надеюсь, все понятно, но если и нет, свободно задавайте вопросы в комментариях.

 Жду с нетерпением
ваших комментариев!
 

Подписаться на RSS

Вы можете нажать "подписаться", чтобы следить за моими новостями!
Так вы всегда будете в курсе появления новостей на сайте =)
О том, что такое RSS можно прочитать здесь.

Подписаться

Подписаться на Twitter

Я специально зарегистрировался в Твиттере, чтобы вы могли следить за обновлениями на сайте =)

Подписаться

Envato marketplace А эти люди занимаются прокатом карнавальных костюмов и масок в Минске. К слову, я им делал сайт.