[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * BuddyPress Activity Notifications. 4 * 5 * @package BuddyPress 6 * @subpackage ActivityNotifications 7 * @since 1.2.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * Format notifications related to activity. 15 * 16 * @since 1.5.0 17 * 18 * @param string $action The type of activity item. Just 'new_at_mention' for now. 19 * @param int $item_id The activity ID. 20 * @param int $secondary_item_id In the case of at-mentions, this is the mentioner's ID. 21 * @param int $total_items The total number of notifications to format. 22 * @param string $format 'string' for notification HTML link or 'array' for separate link and text. 23 * @param int $id Optional. The notification ID. 24 * @return string $return Formatted @mention notification. 25 */ 26 function bp_activity_format_notifications( $action, $item_id, $secondary_item_id, $total_items, $format = 'string', $id = 0 ) { 27 $action_filter = $action; 28 $return = false; 29 $activity_id = $item_id; 30 $user_id = $secondary_item_id; 31 $user_fullname = bp_core_get_user_displayname( $user_id ); 32 33 switch ( $action ) { 34 case 'new_at_mention': 35 $action_filter = 'at_mentions'; 36 $link = bp_loggedin_user_domain() . bp_get_activity_slug() . '/mentions/'; 37 38 /* translators: %s: the current user display name */ 39 $title = sprintf( __( '@%s Mentions', 'buddypress' ), bp_get_loggedin_user_username() ); 40 $amount = 'single'; 41 42 if ( (int) $total_items > 1 ) { 43 /* translators: 1: the number of activity mentions */ 44 $text = sprintf( __( 'You have %1$d new mentions', 'buddypress' ), (int) $total_items ); 45 $amount = 'multiple'; 46 } else { 47 /* translators: 1: the user display name */ 48 $text = sprintf( __( '%1$s mentioned you', 'buddypress' ), $user_fullname ); 49 } 50 break; 51 52 case 'update_reply': 53 $link = bp_get_notifications_permalink(); 54 $title = __( 'New Activity reply', 'buddypress' ); 55 $amount = 'single'; 56 57 if ( (int) $total_items > 1 ) { 58 $link = add_query_arg( 'type', $action, $link ); 59 60 /* translators: 1: the number of activity replies */ 61 $text = sprintf( __( 'You have %1$d new replies', 'buddypress' ), (int) $total_items ); 62 $amount = 'multiple'; 63 } else { 64 $link = add_query_arg( 'rid', (int) $id, bp_activity_get_permalink( $activity_id ) ); 65 66 /* translators: 1: the user display name */ 67 $text = sprintf( __( '%1$s commented on one of your updates', 'buddypress' ), $user_fullname ); 68 } 69 break; 70 71 case 'comment_reply': 72 $link = bp_get_notifications_permalink(); 73 $title = __( 'New Activity comment reply', 'buddypress' ); 74 $amount = 'single'; 75 76 if ( (int) $total_items > 1 ) { 77 $link = add_query_arg( 'type', $action, $link ); 78 79 /* translators: 1: the number of activity comment replies */ 80 $text = sprintf( __( 'You have %1$d new comment replies', 'buddypress' ), (int) $total_items ); 81 $amount = 'multiple'; 82 } else { 83 $link = add_query_arg( 'crid', (int) $id, bp_activity_get_permalink( $activity_id ) ); 84 85 /* translators: 1: the user display name */ 86 $text = sprintf( __( '%1$s replied to one of your activity comments', 'buddypress' ), $user_fullname ); 87 } 88 break; 89 } 90 91 if ( 'string' == $format ) { 92 93 /** 94 * Filters the activity notification for the string format. 95 * 96 * This is a variable filter that is dependent on how many items 97 * need notified about. The two possible hooks are bp_activity_single_at_mentions_notification 98 * or bp_activity_multiple_at_mentions_notification. 99 * 100 * @since 1.5.0 101 * @since 2.6.0 use the $action_filter as a new dynamic portion of the filter name. 102 * 103 * @param string $string HTML anchor tag for the interaction. 104 * @param string $link The permalink for the interaction. 105 * @param int $total_items How many items being notified about. 106 * @param int $activity_id ID of the activity item being formatted. 107 * @param int $user_id ID of the user who inited the interaction. 108 */ 109 $return = apply_filters( 'bp_activity_' . $amount . '_' . $action_filter . '_notification', '<a href="' . esc_url( $link ) . '">' . esc_html( $text ) . '</a>', $link, (int) $total_items, $activity_id, $user_id ); 110 } else { 111 112 /** 113 * Filters the activity notification for any non-string format. 114 * 115 * This is a variable filter that is dependent on how many items need notified about. 116 * The two possible hooks are bp_activity_single_at_mentions_notification 117 * or bp_activity_multiple_at_mentions_notification. 118 * 119 * @since 1.5.0 120 * @since 2.6.0 use the $action_filter as a new dynamic portion of the filter name. 121 * 122 * @param array $array Array holding the content and permalink for the interaction notification. 123 * @param string $link The permalink for the interaction. 124 * @param int $total_items How many items being notified about. 125 * @param int $activity_id ID of the activity item being formatted. 126 * @param int $user_id ID of the user who inited the interaction. 127 */ 128 $return = apply_filters( 'bp_activity_' . $amount . '_' . $action_filter . '_notification', array( 129 'text' => $text, 130 'link' => $link 131 ), $link, (int) $total_items, $activity_id, $user_id ); 132 } 133 134 /** 135 * Fires right before returning the formatted activity notifications. 136 * 137 * @since 1.2.0 138 * 139 * @param string $action The type of activity item. 140 * @param int $item_id The activity ID. 141 * @param int $secondary_item_id The user ID who inited the interaction. 142 * @param int $total_items Total amount of items to format. 143 */ 144 do_action( 'activity_format_notifications', $action, $item_id, $secondary_item_id, $total_items ); 145 146 return $return; 147 } 148 149 /** 150 * Notify a member when their nicename is mentioned in an activity stream item. 151 * 152 * Hooked to the 'bp_activity_sent_mention_email' action, we piggy back off the 153 * existing email code for now, since it does the heavy lifting for us. In the 154 * future when we separate emails from Notifications, this will need its own 155 * 'bp_activity_at_name_send_emails' equivalent helper function. 156 * 157 * @since 1.9.0 158 * 159 * @param object $activity Activity object. 160 * @param string $subject (not used) Notification subject. 161 * @param string $message (not used) Notification message. 162 * @param string $content (not used) Notification content. 163 * @param int $receiver_user_id ID of user receiving notification. 164 */ 165 function bp_activity_at_mention_add_notification( $activity, $subject, $message, $content, $receiver_user_id ) { 166 bp_notifications_add_notification( array( 167 'user_id' => $receiver_user_id, 168 'item_id' => $activity->id, 169 'secondary_item_id' => $activity->user_id, 170 'component_name' => buddypress()->activity->id, 171 'component_action' => 'new_at_mention', 172 'date_notified' => bp_core_current_time(), 173 'is_new' => 1, 174 ) ); 175 } 176 add_action( 'bp_activity_sent_mention_email', 'bp_activity_at_mention_add_notification', 10, 5 ); 177 178 /** 179 * Notify a member one of their activity received a reply. 180 * 181 * @since 2.6.0 182 * 183 * @param BP_Activity_Activity $activity The original activity. 184 * @param int $comment_id ID for the newly received comment. 185 * @param int $commenter_id ID of the user who made the comment. 186 */ 187 function bp_activity_update_reply_add_notification( $activity, $comment_id, $commenter_id ) { 188 bp_notifications_add_notification( array( 189 'user_id' => $activity->user_id, 190 'item_id' => $comment_id, 191 'secondary_item_id' => $commenter_id, 192 'component_name' => buddypress()->activity->id, 193 'component_action' => 'update_reply', 194 'date_notified' => bp_core_current_time(), 195 'is_new' => 1, 196 ) ); 197 } 198 add_action( 'bp_activity_sent_reply_to_update_notification', 'bp_activity_update_reply_add_notification', 10, 3 ); 199 200 /** 201 * Notify a member one of their activity comment received a reply. 202 * 203 * @since 2.6.0 204 * 205 * @param BP_Activity_Activity $activity_comment The parent activity. 206 * @param int $comment_id ID for the newly received comment. 207 * @param int $commenter_id ID of the user who made the comment. 208 */ 209 function bp_activity_comment_reply_add_notification( $activity_comment, $comment_id, $commenter_id ) { 210 bp_notifications_add_notification( array( 211 'user_id' => $activity_comment->user_id, 212 'item_id' => $comment_id, 213 'secondary_item_id' => $commenter_id, 214 'component_name' => buddypress()->activity->id, 215 'component_action' => 'comment_reply', 216 'date_notified' => bp_core_current_time(), 217 'is_new' => 1, 218 ) ); 219 } 220 add_action( 'bp_activity_sent_reply_to_reply_notification', 'bp_activity_comment_reply_add_notification', 10, 3 ); 221 222 /** 223 * Mark at-mention notifications as read when users visit their Mentions page. 224 * 225 * @since 1.5.0 226 * @since 2.5.0 Add the $user_id parameter 227 * 228 * @param int $user_id The id of the user whose notifications are marked as read. 229 */ 230 function bp_activity_remove_screen_notifications( $user_id = 0 ) { 231 // Only mark read if the current user is looking at his own mentions. 232 if ( empty( $user_id ) || (int) $user_id !== (int) bp_loggedin_user_id() ) { 233 return; 234 } 235 236 bp_notifications_mark_notifications_by_type( $user_id, buddypress()->activity->id, 'new_at_mention' ); 237 } 238 add_action( 'bp_activity_clear_new_mentions', 'bp_activity_remove_screen_notifications', 10, 1 ); 239 240 /** 241 * Mark notifications as read when a user visits an activity permalink. 242 * 243 * @since 2.0.0 244 * @since 3.2.0 Marks replies to parent update and replies to an activity comment as read. 245 * 246 * @param BP_Activity_Activity $activity Activity object. 247 */ 248 function bp_activity_remove_screen_notifications_single_activity_permalink( $activity ) { 249 if ( ! is_user_logged_in() ) { 250 return; 251 } 252 253 // Mark as read any notifications for the current user related to this activity item. 254 bp_notifications_mark_notifications_by_item_id( bp_loggedin_user_id(), $activity->id, buddypress()->activity->id, 'new_at_mention' ); 255 256 $comment_id = 0; 257 // For replies to a parent update. 258 if ( ! empty( $_GET['rid'] ) ) { 259 $comment_id = (int) $_GET['rid']; 260 261 // For replies to an activity comment. 262 } elseif ( ! empty( $_GET['crid'] ) ) { 263 $comment_id = (int) $_GET['crid']; 264 } 265 266 // Mark individual activity reply notification as read. 267 if ( ! empty( $comment_id ) ) { 268 BP_Notifications_Notification::update( 269 array( 270 'is_new' => false 271 ), 272 array( 273 'user_id' => bp_loggedin_user_id(), 274 'id' => $comment_id 275 ) 276 ); 277 } 278 } 279 add_action( 'bp_activity_screen_single_activity_permalink', 'bp_activity_remove_screen_notifications_single_activity_permalink' ); 280 281 /** 282 * Mark non-mention notifications as read when user visits our read permalink. 283 * 284 * In particular, 'update_reply' and 'comment_reply' notifications are handled 285 * here. See {@link bp_activity_format_notifications()} for more info. 286 * 287 * @since 2.6.0 288 */ 289 function bp_activity_remove_screen_notifications_for_non_mentions() { 290 if ( false === is_singular() || false === is_user_logged_in() || empty( $_GET['nid'] ) ) { 291 return; 292 } 293 294 // Mark notification as read. 295 BP_Notifications_Notification::update( 296 array( 297 'is_new' => false 298 ), 299 array( 300 'user_id' => bp_loggedin_user_id(), 301 'id' => (int) $_GET['nid'] 302 ) 303 ); 304 } 305 add_action( 'bp_screens', 'bp_activity_remove_screen_notifications_for_non_mentions' ); 306 307 /** 308 * Delete at-mention notifications when the corresponding activity item is deleted. 309 * 310 * @since 2.0.0 311 * 312 * @param array $activity_ids_deleted IDs of deleted activity items. 313 */ 314 function bp_activity_at_mention_delete_notification( $activity_ids_deleted = array() ) { 315 // Let's delete all without checking if content contains any mentions 316 // to avoid a query to get the activity. 317 if ( ! empty( $activity_ids_deleted ) ) { 318 foreach ( $activity_ids_deleted as $activity_id ) { 319 bp_notifications_delete_all_notifications_by_type( $activity_id, buddypress()->activity->id ); 320 } 321 } 322 } 323 add_action( 'bp_activity_deleted_activities', 'bp_activity_at_mention_delete_notification', 10 ); 324 325 /** 326 * Add a notification for post comments to the post author or post commenter. 327 * 328 * Requires "activity stream commenting on posts and comments" to be enabled. 329 * 330 * @since 2.6.0 331 * 332 * @param int $activity_id The activity comment ID. 333 * @param WP_Comment $post_type_comment WP Comment object. 334 * @param array $activity_args Activity comment arguments. 335 * @param object $activity_post_object The post type tracking args object. 336 */ 337 function bp_activity_add_notification_for_synced_blog_comment( $activity_id, $post_type_comment, $activity_args, $activity_post_object ) { 338 // If activity comments are disabled for WP posts, stop now! 339 if ( bp_disable_blogforum_comments() || empty( $activity_id ) ) { 340 return; 341 } 342 343 // Send a notification to the blog post author. 344 if ( (int) $post_type_comment->post->post_author !== (int) $activity_args['user_id'] ) { 345 // Only add a notification if comment author is a registered user. 346 // @todo Should we remove this restriction? 347 if ( ! empty( $post_type_comment->user_id ) ) { 348 bp_notifications_add_notification( array( 349 'user_id' => $post_type_comment->post->post_author, 350 'item_id' => $activity_id, 351 'secondary_item_id' => $post_type_comment->user_id, 352 'component_name' => buddypress()->activity->id, 353 'component_action' => 'update_reply', 354 'date_notified' => $post_type_comment->comment_date_gmt, 355 'is_new' => 1, 356 ) ); 357 } 358 } 359 360 // Send a notification to the parent comment author for follow-up comments. 361 if ( ! empty( $post_type_comment->comment_parent ) ) { 362 $parent_comment = get_comment( $post_type_comment->comment_parent ); 363 364 if ( ! empty( $parent_comment->user_id ) && (int) $parent_comment->user_id !== (int) $activity_args['user_id'] ) { 365 bp_notifications_add_notification( array( 366 'user_id' => $parent_comment->user_id, 367 'item_id' => $activity_id, 368 'secondary_item_id' => $post_type_comment->user_id, 369 'component_name' => buddypress()->activity->id, 370 'component_action' => 'comment_reply', 371 'date_notified' => $post_type_comment->comment_date_gmt, 372 'is_new' => 1, 373 ) ); 374 } 375 } 376 } 377 add_action( 'bp_blogs_comment_sync_activity_comment', 'bp_activity_add_notification_for_synced_blog_comment', 10, 4 ); 378 379 /** 380 * Add activity notifications settings to the notifications settings page. 381 * 382 * @since 1.2.0 383 */ 384 function bp_activity_screen_notification_settings() { 385 if ( bp_activity_do_mentions() ) { 386 if ( ! $mention = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_mention', true ) ) { 387 $mention = 'yes'; 388 } 389 } 390 391 if ( ! $reply = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_reply', true ) ) { 392 $reply = 'yes'; 393 } 394 395 ?> 396 397 <table class="notification-settings" id="activity-notification-settings"> 398 <thead> 399 <tr> 400 <th class="icon"> </th> 401 <th class="title"><?php _e( 'Activity', 'buddypress' ) ?></th> 402 <th class="yes"><?php _e( 'Yes', 'buddypress' ) ?></th> 403 <th class="no"><?php _e( 'No', 'buddypress' )?></th> 404 </tr> 405 </thead> 406 407 <tbody> 408 <?php if ( bp_activity_do_mentions() ) : ?> 409 <tr id="activity-notification-settings-mentions"> 410 <td> </td> 411 <td> 412 <?php 413 /* translators: %s: the displayed user username */ 414 printf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) ); 415 ?> 416 </td> 417 <td class="yes"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-yes" value="yes" <?php checked( $mention, 'yes', true ) ?>/><label for="notification-activity-new-mention-yes" class="bp-screen-reader-text"><?php 418 /* translators: accessibility text */ 419 esc_html_e( 'Yes, send email', 'buddypress' ); 420 ?></label></td> 421 <td class="no"><input type="radio" name="notifications[notification_activity_new_mention]" id="notification-activity-new-mention-no" value="no" <?php checked( $mention, 'no', true ) ?>/><label for="notification-activity-new-mention-no" class="bp-screen-reader-text"><?php 422 /* translators: accessibility text */ 423 esc_html_e( 'No, do not send email', 'buddypress' ); 424 ?></label></td> 425 </tr> 426 <?php endif; ?> 427 428 <tr id="activity-notification-settings-replies"> 429 <td> </td> 430 <td><?php _e( "A member replies to an update or comment you've posted", 'buddypress' ) ?></td> 431 <td class="yes"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-yes" value="yes" <?php checked( $reply, 'yes', true ) ?>/><label for="notification-activity-new-reply-yes" class="bp-screen-reader-text"><?php 432 /* translators: accessibility text */ 433 esc_html_e( 'Yes, send email', 'buddypress' ); 434 ?></label></td> 435 <td class="no"><input type="radio" name="notifications[notification_activity_new_reply]" id="notification-activity-new-reply-no" value="no" <?php checked( $reply, 'no', true ) ?>/><label for="notification-activity-new-reply-no" class="bp-screen-reader-text"><?php 436 /* translators: accessibility text */ 437 esc_html_e( 'No, do not send email', 'buddypress' ); 438 ?></label></td> 439 </tr> 440 441 <?php 442 443 /** 444 * Fires inside the closing </tbody> tag for activity screen notification settings. 445 * 446 * @since 1.2.0 447 */ 448 do_action( 'bp_activity_screen_notification_settings' ) ?> 449 </tbody> 450 </table> 451 452 <?php 453 } 454 add_action( 'bp_notification_settings', 'bp_activity_screen_notification_settings', 1 );
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Dec 22 01:00:54 2024 | Cross-referenced by PHPXref 0.7.1 |