[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Filters related to the Activity component. 4 * 5 * @package BuddyPress 6 * @subpackage ActivityFilters 7 * @since 1.0.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /* Filters *******************************************************************/ 14 15 // Apply WordPress defined filters. 16 add_filter( 'bp_get_activity_content_body', 'bp_activity_filter_kses', 1 ); 17 add_filter( 'bp_get_activity_parent_content', 'bp_activity_filter_kses', 1 ); 18 add_filter( 'bp_get_activity_latest_update', 'bp_activity_filter_kses', 1 ); 19 add_filter( 'bp_get_activity_latest_update_excerpt', 'bp_activity_filter_kses', 1 ); 20 add_filter( 'bp_get_activity_feed_item_description', 'bp_activity_filter_kses', 1 ); 21 add_filter( 'bp_activity_content_before_save', 'bp_activity_filter_kses', 1 ); 22 add_filter( 'bp_activity_action_before_save', 'bp_activity_filter_kses', 1 ); 23 add_filter( 'bp_activity_latest_update_content', 'bp_activity_filter_kses', 1 ); 24 25 add_filter( 'bp_get_activity_action', 'force_balance_tags' ); 26 add_filter( 'bp_get_activity_content_body', 'force_balance_tags' ); 27 add_filter( 'bp_get_activity_content', 'force_balance_tags' ); 28 add_filter( 'bp_get_activity_latest_update', 'force_balance_tags' ); 29 add_filter( 'bp_get_activity_latest_update_excerpt', 'force_balance_tags' ); 30 add_filter( 'bp_get_activity_feed_item_description', 'force_balance_tags' ); 31 add_filter( 'bp_activity_content_before_save', 'force_balance_tags' ); 32 add_filter( 'bp_activity_action_before_save', 'force_balance_tags' ); 33 34 add_filter( 'bp_activity_content_before_save', 'wp_encode_emoji' ); 35 36 add_filter( 'bp_get_activity_action', 'wptexturize' ); 37 add_filter( 'bp_get_activity_content_body', 'wptexturize' ); 38 add_filter( 'bp_get_activity_content', 'wptexturize' ); 39 add_filter( 'bp_get_activity_parent_content', 'wptexturize' ); 40 add_filter( 'bp_get_activity_latest_update', 'wptexturize' ); 41 add_filter( 'bp_get_activity_latest_update_excerpt', 'wptexturize' ); 42 add_filter( 'bp_activity_get_embed_excerpt', 'wptexturize' ); 43 44 add_filter( 'bp_get_activity_action', 'convert_smilies' ); 45 add_filter( 'bp_get_activity_content_body', 'convert_smilies' ); 46 add_filter( 'bp_get_activity_content', 'convert_smilies' ); 47 add_filter( 'bp_get_activity_parent_content', 'convert_smilies' ); 48 add_filter( 'bp_get_activity_latest_update', 'convert_smilies' ); 49 add_filter( 'bp_get_activity_latest_update_excerpt', 'convert_smilies' ); 50 add_filter( 'bp_activity_get_embed_excerpt', 'convert_smilies' ); 51 52 add_filter( 'bp_get_activity_action', 'convert_chars' ); 53 add_filter( 'bp_get_activity_content_body', 'convert_chars' ); 54 add_filter( 'bp_get_activity_content', 'convert_chars' ); 55 add_filter( 'bp_get_activity_parent_content', 'convert_chars' ); 56 add_filter( 'bp_get_activity_latest_update', 'convert_chars' ); 57 add_filter( 'bp_get_activity_latest_update_excerpt', 'convert_chars' ); 58 add_filter( 'bp_activity_get_embed_excerpt', 'convert_chars' ); 59 60 add_filter( 'bp_get_activity_action', 'wpautop' ); 61 add_filter( 'bp_get_activity_content_body', 'wpautop' ); 62 add_filter( 'bp_get_activity_content', 'wpautop' ); 63 add_filter( 'bp_get_activity_feed_item_description', 'wpautop' ); 64 add_filter( 'bp_activity_get_embed_excerpt', 'wpautop' ); 65 66 add_filter( 'bp_get_activity_action', 'make_clickable', 9 ); 67 add_filter( 'bp_get_activity_content_body', 'make_clickable', 9 ); 68 add_filter( 'bp_get_activity_content', 'make_clickable', 9 ); 69 add_filter( 'bp_get_activity_parent_content', 'make_clickable', 9 ); 70 add_filter( 'bp_get_activity_latest_update', 'make_clickable', 9 ); 71 add_filter( 'bp_get_activity_latest_update_excerpt', 'make_clickable', 9 ); 72 add_filter( 'bp_get_activity_feed_item_description', 'make_clickable', 9 ); 73 add_filter( 'bp_activity_get_embed_excerpt', 'make_clickable', 9 ); 74 75 add_filter( 'bp_acomment_name', 'stripslashes_deep', 5 ); 76 add_filter( 'bp_get_activity_action', 'stripslashes_deep', 5 ); 77 add_filter( 'bp_get_activity_content', 'stripslashes_deep', 5 ); 78 add_filter( 'bp_get_activity_content_body', 'stripslashes_deep', 5 ); 79 add_filter( 'bp_get_activity_parent_content', 'stripslashes_deep', 5 ); 80 add_filter( 'bp_get_activity_latest_update', 'stripslashes_deep', 5 ); 81 add_filter( 'bp_get_activity_latest_update_excerpt', 'stripslashes_deep', 5 ); 82 add_filter( 'bp_get_activity_feed_item_description', 'stripslashes_deep', 5 ); 83 84 add_filter( 'bp_activity_primary_link_before_save', 'esc_url_raw' ); 85 86 // Apply BuddyPress-defined filters. 87 add_filter( 'bp_get_activity_content', 'bp_activity_make_nofollow_filter' ); 88 add_filter( 'bp_get_activity_content_body', 'bp_activity_make_nofollow_filter' ); 89 add_filter( 'bp_get_activity_parent_content', 'bp_activity_make_nofollow_filter' ); 90 add_filter( 'bp_get_activity_latest_update', 'bp_activity_make_nofollow_filter' ); 91 add_filter( 'bp_get_activity_latest_update_excerpt', 'bp_activity_make_nofollow_filter' ); 92 add_filter( 'bp_get_activity_feed_item_description', 'bp_activity_make_nofollow_filter' ); 93 94 add_filter( 'bp_get_activity_content_body', 'bp_core_add_loading_lazy_attribute' ); 95 add_filter( 'bp_activity_comment_content', 'bp_core_add_loading_lazy_attribute' ); 96 97 add_filter( 'pre_comment_content', 'bp_activity_at_name_filter' ); 98 add_filter( 'the_content', 'bp_activity_at_name_filter' ); 99 add_filter( 'bp_activity_get_embed_excerpt', 'bp_activity_at_name_filter' ); 100 101 add_filter( 'bp_get_activity_parent_content', 'bp_create_excerpt' ); 102 103 add_filter( 'bp_get_activity_content_body', 'bp_activity_truncate_entry', 5 ); 104 add_filter( 'bp_get_activity_content', 'bp_activity_truncate_entry', 5 ); 105 106 add_filter( 'bp_get_total_favorite_count_for_user', 'bp_core_number_format' ); 107 add_filter( 'bp_get_total_mention_count_for_user', 'bp_core_number_format' ); 108 109 add_filter( 'bp_activity_get_embed_excerpt', 'bp_activity_embed_excerpt_onclick_location_filter', 9 ); 110 111 // Personal data export. 112 add_filter( 'wp_privacy_personal_data_exporters', 'bp_activity_register_personal_data_exporter' ); 113 114 /* Actions *******************************************************************/ 115 116 // At-name filter. 117 add_action( 'bp_activity_before_save', 'bp_activity_at_name_filter_updates' ); 118 119 // Activity stream moderation. 120 add_action( 'bp_activity_before_save', 'bp_activity_check_moderation_keys', 2, 1 ); 121 add_action( 'bp_activity_before_save', 'bp_activity_check_disallowed_keys', 2, 1 ); 122 123 /** Functions *****************************************************************/ 124 125 /** 126 * Types of activity stream items to moderate. 127 * 128 * @since 1.6.0 129 * 130 * @return array $types List of the activity types to moderate. 131 */ 132 function bp_activity_get_moderated_activity_types() { 133 $types = array( 134 'activity_comment', 135 'activity_update' 136 ); 137 138 /** 139 * Filters the default activity types that BuddyPress should moderate. 140 * 141 * @since 1.6.0 142 * 143 * @param array $types Default activity types to moderate. 144 */ 145 return apply_filters( 'bp_activity_check_activity_types', $types ); 146 } 147 148 /** 149 * Moderate the posted activity item, if it contains moderate keywords. 150 * 151 * @since 1.6.0 152 * 153 * @param BP_Activity_Activity $activity The activity object to check. 154 */ 155 function bp_activity_check_moderation_keys( $activity ) { 156 157 // Only check specific types of activity updates. 158 if ( ! in_array( $activity->type, bp_activity_get_moderated_activity_types() ) ) { 159 return; 160 } 161 162 // Send back the error so activity update fails. 163 // @todo This is temporary until some kind of moderation is built. 164 $moderate = bp_core_check_for_moderation( $activity->user_id, '', $activity->content, 'wp_error' ); 165 if ( is_wp_error( $moderate ) ) { 166 $activity->errors = $moderate; 167 168 // Backpat. 169 $activity->component = false; 170 } 171 } 172 173 /** 174 * Mark the posted activity as spam, if it contains disallowed keywords. 175 * 176 * @since 7.0.0 177 * 178 * @param BP_Activity_Activity $activity The activity object to check. 179 */ 180 function bp_activity_check_disallowed_keys( $activity ) { 181 182 // Only check specific types of activity updates. 183 if ( ! in_array( $activity->type, bp_activity_get_moderated_activity_types() ) ) { 184 return; 185 } 186 187 // Send back the error so activity update fails. 188 // @todo This is temporary until some kind of trash status is built. 189 $disallowed = bp_core_check_for_disallowed_keys( $activity->user_id, '', $activity->content, 'wp_error' ); 190 if ( is_wp_error( $disallowed ) ) { 191 $activity->errors = $disallowed; 192 193 // Backpat. 194 $activity->component = false; 195 } 196 } 197 198 /** 199 * Custom kses filtering for activity content. 200 * 201 * @since 1.1.0 202 * 203 * @param string $content The activity content. 204 * @return string $content Filtered activity content. 205 */ 206 function bp_activity_filter_kses( $content ) { 207 $activity_allowedtags = bp_get_allowedtags(); 208 209 // Don't allow 'class' or 'id'. 210 foreach ( $activity_allowedtags as $el => &$atts ) { 211 unset( $atts['class'] ); 212 unset( $atts['id'] ); 213 } 214 215 /** 216 * Filters the allowed HTML tags for BuddyPress Activity content. 217 * 218 * @since 1.2.0 219 * 220 * @param array $value Array of allowed HTML tags and attributes. 221 */ 222 $activity_allowedtags = apply_filters( 'bp_activity_allowed_tags', $activity_allowedtags ); 223 return wp_kses( $content, $activity_allowedtags ); 224 } 225 226 /** 227 * Find and link @-mentioned users in the contents of a given item. 228 * 229 * @since 1.2.0 230 * 231 * @param string $content The contents of a given item. 232 * @param int $activity_id The activity id. Deprecated. 233 * @return string $content Content filtered for mentions. 234 */ 235 function bp_activity_at_name_filter( $content, $activity_id = 0 ) { 236 237 // Are mentions disabled? 238 if ( ! bp_activity_do_mentions() ) { 239 return $content; 240 } 241 242 // Try to find mentions. 243 $usernames = bp_activity_find_mentions( $content ); 244 245 // No mentions? Stop now! 246 if ( empty( $usernames ) ) 247 return $content; 248 249 // We don't want to link @mentions that are inside of links, so we 250 // temporarily remove them. 251 $replace_count = 0; 252 $replacements = array(); 253 foreach ( $usernames as $username ) { 254 // Prevent @ name linking inside <a> tags. 255 preg_match_all( '/(<a.*?(?!<\/a>)@' . $username . '.*?<\/a>)/', $content, $content_matches ); 256 if ( ! empty( $content_matches[1] ) ) { 257 foreach ( $content_matches[1] as $replacement ) { 258 $replacements[ '#BPAN' . $replace_count ] = $replacement; 259 $content = str_replace( $replacement, '#BPAN' . $replace_count, $content ); 260 $replace_count++; 261 } 262 } 263 } 264 265 // Linkify the mentions with the username. 266 foreach ( (array) $usernames as $user_id => $username ) { 267 $content = preg_replace( '/(@' . $username . '\b)/', "<a class='bp-suggestions-mention' href='" . bp_core_get_user_domain( $user_id ) . "' rel='nofollow'>@$username</a>", $content ); 268 } 269 270 // Put everything back. 271 if ( ! empty( $replacements ) ) { 272 foreach ( $replacements as $placeholder => $original ) { 273 $content = str_replace( $placeholder, $original, $content ); 274 } 275 } 276 277 // Return the content. 278 return $content; 279 } 280 281 /** 282 * Catch mentions in an activity item before it is saved into the database. 283 * 284 * If mentions are found, replace @mention text with user links and add our 285 * hook to send mention notifications after the activity item is saved. 286 * 287 * @since 1.5.0 288 * 289 * @param BP_Activity_Activity $activity Activity Object. 290 */ 291 function bp_activity_at_name_filter_updates( $activity ) { 292 // Are mentions disabled? 293 if ( ! bp_activity_do_mentions() ) { 294 return; 295 } 296 297 // If activity was marked as spam, stop the rest of this function. 298 if ( ! empty( $activity->is_spam ) ) 299 return; 300 301 // Try to find mentions. 302 $usernames = bp_activity_find_mentions( $activity->content ); 303 304 // We have mentions! 305 if ( ! empty( $usernames ) ) { 306 // Replace @mention text with userlinks. 307 foreach( (array) $usernames as $user_id => $username ) { 308 $activity->content = preg_replace( '/(@' . $username . '\b)/', "<a class='bp-suggestions-mention' href='" . bp_core_get_user_domain( $user_id ) . "' rel='nofollow'>@$username</a>", $activity->content ); 309 } 310 311 // Add our hook to send @mention emails after the activity item is saved. 312 add_action( 'bp_activity_after_save', 'bp_activity_at_name_send_emails' ); 313 314 // Temporary variable to avoid having to run bp_activity_find_mentions() again. 315 buddypress()->activity->mentioned_users = $usernames; 316 } 317 } 318 319 /** 320 * Sends emails and BP notifications for users @-mentioned in an activity item. 321 * 322 * @since 1.7.0 323 * 324 * @param BP_Activity_Activity $activity The BP_Activity_Activity object. 325 */ 326 function bp_activity_at_name_send_emails( $activity ) { 327 // Are mentions disabled? 328 if ( ! bp_activity_do_mentions() ) { 329 return; 330 } 331 332 $bp = buddypress(); 333 334 // If our temporary variable doesn't exist, stop now. 335 if ( empty( $bp->activity->mentioned_users ) ) 336 return; 337 338 // Grab our temporary variable from bp_activity_at_name_filter_updates(). 339 $usernames = $bp->activity->mentioned_users; 340 341 // Get rid of temporary variable. 342 unset( $bp->activity->mentioned_users ); 343 344 // Send @mentions and setup BP notifications. 345 foreach( (array) $usernames as $user_id => $username ) { 346 347 /** 348 * Filters BuddyPress' ability to send email notifications for @mentions. 349 * 350 * @since 1.6.0 351 * @since 2.5.0 Introduced `$user_id` and `$activity` parameters. 352 * 353 * @param bool $value Whether or not BuddyPress should send a notification to the mentioned users. 354 * @param array $usernames Array of users potentially notified. 355 * @param int $user_id ID of the current user being notified. 356 * @param BP_Activity_Activity $activity Activity object. 357 */ 358 if ( apply_filters( 'bp_activity_at_name_do_notifications', true, $usernames, $user_id, $activity ) ) { 359 bp_activity_at_message_notification( $activity->id, $user_id ); 360 } 361 362 // Updates mention count for the user. 363 bp_activity_update_mention_count_for_user( $user_id, $activity->id ); 364 } 365 } 366 367 /** 368 * Catch links in activity text so rel=nofollow can be added. 369 * 370 * @since 1.2.0 371 * 372 * @param string $text Activity text. 373 * @return string $text Text with rel=nofollow added to any links. 374 */ 375 function bp_activity_make_nofollow_filter( $text ) { 376 return preg_replace_callback( '|<a (.+?)>|i', 'bp_activity_make_nofollow_filter_callback', $text ); 377 } 378 379 /** 380 * Adds `rel="nofollow ugc"` to a link. 381 * 382 * @since 1.2.0 Adds the nofollow rel attribute. 383 * @since 7.0.0 Adds the ugc rel attribute. 384 * 385 * @param array $matches Items matched by preg_replace_callback() in bp_activity_make_nofollow_filter(). 386 * @return string $text Link with rel=nofollow added. 387 */ 388 function bp_activity_make_nofollow_filter_callback( $matches ) { 389 $text = $matches[1]; 390 391 // The WP `make_clickable()` formatting function is adding the rel="nofollow" attribute. 392 $text = str_replace( array( ' rel="nofollow"', " rel='nofollow'" ), '', $text ); 393 return "<a $text rel=\"nofollow ugc\">"; 394 } 395 396 /** 397 * Truncate long activity entries when viewed in activity streams. 398 * 399 * This method can only be used inside the Activity loop. 400 * 401 * @since 1.5.0 402 * @since 2.6.0 Added $args parameter. 403 * 404 * @param string $text The original activity entry text. 405 * @param array $args { 406 * Optional parameters. See $options argument of {@link bp_create_excerpt()} 407 * for all available parameters. 408 * } 409 * @return string $excerpt The truncated text. 410 */ 411 function bp_activity_truncate_entry( $text, $args = array() ) { 412 global $activities_template; 413 414 /** 415 * Provides a filter that lets you choose whether to skip this filter on a per-activity basis. 416 * 417 * @since 2.3.0 418 * 419 * @param bool $value If true, text should be checked to see if it needs truncating. 420 */ 421 $maybe_truncate_text = apply_filters( 422 'bp_activity_maybe_truncate_entry', 423 isset( $activities_template->activity->type ) && ! in_array( $activities_template->activity->type, array( 'new_blog_post', ), true ) 424 ); 425 426 // The full text of the activity update should always show on the single activity screen. 427 if ( empty( $args['force_truncate'] ) && ( ! $maybe_truncate_text || bp_is_single_activity() ) ) { 428 return $text; 429 } 430 431 /** 432 * Filters the appended text for the activity excerpt. 433 * 434 * @since 1.5.0 435 * 436 * @param string $value Internationalized "Read more" text. 437 */ 438 $append_text = apply_filters( 'bp_activity_excerpt_append_text', __( '[Read more]', 'buddypress' ) ); 439 440 $excerpt_length = bp_activity_get_excerpt_length(); 441 442 $args = bp_parse_args( 443 $args, 444 array( 445 'ending' => __( '…', 'buddypress' ), 446 ) 447 ); 448 449 // Run the text through the excerpt function. If it's too short, the original text will be returned. 450 $excerpt = bp_create_excerpt( $text, $excerpt_length, $args ); 451 452 /* 453 * If the text returned by bp_create_excerpt() is different from the original text (ie it's 454 * been truncated), add the "Read More" link. Note that bp_create_excerpt() is stripping 455 * shortcodes, so we have strip them from the $text before the comparison. 456 */ 457 if ( strlen( $excerpt ) < strlen( strip_shortcodes( $text ) ) ) { 458 $id = !empty( $activities_template->activity->current_comment->id ) ? 'acomment-read-more-' . $activities_template->activity->current_comment->id : 'activity-read-more-' . bp_get_activity_id(); 459 460 $excerpt = sprintf( '%1$s<span class="activity-read-more" id="%2$s"><a href="%3$s" rel="nofollow">%4$s</a></span>', $excerpt, $id, bp_get_activity_thread_permalink(), $append_text ); 461 } 462 463 /** 464 * Filters the composite activity excerpt entry. 465 * 466 * @since 1.5.0 467 * 468 * @param string $excerpt Excerpt text and markup to be displayed. 469 * @param string $text The original activity entry text. 470 * @param string $append_text The final append text applied. 471 */ 472 return apply_filters( 'bp_activity_truncate_entry', $excerpt, $text, $append_text ); 473 } 474 475 /** 476 * Include extra JavaScript dependencies for activity component. 477 * 478 * @since 2.0.0 479 * 480 * @param array $js_handles The original dependencies. 481 * @return array $js_handles The new dependencies. 482 */ 483 function bp_activity_get_js_dependencies( $js_handles = array() ) { 484 if ( bp_activity_do_heartbeat() ) { 485 $js_handles[] = 'heartbeat'; 486 } 487 488 return $js_handles; 489 } 490 add_filter( 'bp_core_get_js_dependencies', 'bp_activity_get_js_dependencies', 10, 1 ); 491 492 /** 493 * Add a just-posted classes to the most recent activity item. 494 * 495 * We use these classes to avoid pagination issues when items are loaded 496 * dynamically into the activity stream. 497 * 498 * @since 2.0.0 499 * 500 * @param string $classes Array of classes for most recent activity item. 501 * @return string $classes 502 */ 503 function bp_activity_newest_class( $classes = '' ) { 504 $bp = buddypress(); 505 506 if ( ! empty( $bp->activity->last_recorded ) && $bp->activity->last_recorded == bp_get_activity_date_recorded() ) { 507 $classes .= ' new-update'; 508 } 509 510 $classes .= ' just-posted'; 511 return $classes; 512 } 513 514 /** 515 * Check if Activity Heartbeat feature i on to add a timestamp class. 516 * 517 * @since 2.0.0 518 * 519 * @param string $classes Array of classes for timestamp. 520 * @return string $classes 521 */ 522 function bp_activity_timestamp_class( $classes = '' ) { 523 524 if ( ! bp_activity_do_heartbeat() ) { 525 return $classes; 526 } 527 528 $activity_date = bp_get_activity_date_recorded(); 529 530 if ( empty( $activity_date ) ) { 531 return $classes; 532 } 533 534 $classes .= ' date-recorded-' . strtotime( $activity_date ); 535 536 return $classes; 537 } 538 add_filter( 'bp_get_activity_css_class', 'bp_activity_timestamp_class', 9, 1 ); 539 540 /** 541 * Use WordPress Heartbeat API to check for latest activity update. 542 * 543 * @since 2.0.0 544 * 545 * @param array $response Array containing Heartbeat API response. 546 * @param array $data Array containing data for Heartbeat API response. 547 * @return array $response 548 */ 549 function bp_activity_heartbeat_last_recorded( $response = array(), $data = array() ) { 550 if ( empty( $data['bp_activity_last_recorded'] ) ) { 551 return $response; 552 } 553 554 // Use the querystring argument stored in the cookie (to preserve 555 // filters), but force the offset to get only new items. 556 $activity_latest_args = bp_parse_args( 557 bp_ajax_querystring( 'activity' ), 558 array( 'since' => date( 'Y-m-d H:i:s', $data['bp_activity_last_recorded'] ) ), 559 'activity_latest_args' 560 ); 561 562 if ( ! empty( $data['bp_activity_last_recorded_search_terms'] ) && empty( $activity_latest_args['search_terms'] ) ) { 563 $activity_latest_args['search_terms'] = addslashes( $data['bp_activity_last_recorded_search_terms'] ); 564 } 565 566 $newest_activities = array(); 567 $last_activity_recorded = 0; 568 569 // Temporarily add a just-posted class for new activity items. 570 add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 ); 571 572 ob_start(); 573 if ( bp_has_activities( $activity_latest_args ) ) { 574 while ( bp_activities() ) { 575 bp_the_activity(); 576 577 $atime = strtotime( bp_get_activity_date_recorded() ); 578 if ( $last_activity_recorded < $atime ) { 579 $last_activity_recorded = $atime; 580 } 581 582 bp_get_template_part( 'activity/entry' ); 583 } 584 } 585 586 $newest_activities['activities'] = ob_get_contents(); 587 $newest_activities['last_recorded'] = $last_activity_recorded; 588 ob_end_clean(); 589 590 // Remove the temporary filter. 591 remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10 ); 592 593 if ( ! empty( $newest_activities['last_recorded'] ) ) { 594 $response['bp_activity_newest_activities'] = $newest_activities; 595 } 596 597 return $response; 598 } 599 add_filter( 'heartbeat_received', 'bp_activity_heartbeat_last_recorded', 10, 2 ); 600 add_filter( 'heartbeat_nopriv_received', 'bp_activity_heartbeat_last_recorded', 10, 2 ); 601 602 /** 603 * Set the strings for WP HeartBeat API where needed. 604 * 605 * @since 2.0.0 606 * 607 * @param array $strings Localized strings. 608 * @return array $strings 609 */ 610 function bp_activity_heartbeat_strings( $strings = array() ) { 611 612 if ( ! bp_activity_do_heartbeat() ) { 613 return $strings; 614 } 615 616 $global_pulse = 0; 617 618 /** 619 * Filter that checks whether the global heartbeat settings already exist. 620 * 621 * @since 2.0.0 622 * 623 * @param array $value Heartbeat settings array. 624 */ 625 $heartbeat_settings = apply_filters( 'heartbeat_settings', array() ); 626 if ( ! empty( $heartbeat_settings['interval'] ) ) { 627 // 'Fast' is 5. 628 $global_pulse = is_numeric( $heartbeat_settings['interval'] ) ? absint( $heartbeat_settings['interval'] ) : 5; 629 } 630 631 /** 632 * Filters the pulse frequency to be used for the BuddyPress Activity heartbeat. 633 * 634 * @since 2.0.0 635 * 636 * @param int $value The frequency in seconds between pulses. 637 */ 638 $bp_activity_pulse = apply_filters( 'bp_activity_heartbeat_pulse', 15 ); 639 640 /** 641 * Use the global pulse value unless: 642 * a. the BP-specific value has been specifically filtered, or 643 * b. it doesn't exist (ie, BP will be the only one using the heartbeat, 644 * so we're responsible for enabling it) 645 */ 646 if ( has_filter( 'bp_activity_heartbeat_pulse' ) || empty( $global_pulse ) ) { 647 $pulse = $bp_activity_pulse; 648 } else { 649 $pulse = $global_pulse; 650 } 651 652 $strings = array_merge( $strings, array( 653 'newest' => __( 'Load Newest', 'buddypress' ), 654 'pulse' => absint( $pulse ), 655 ) ); 656 657 return $strings; 658 } 659 add_filter( 'bp_core_get_js_strings', 'bp_activity_heartbeat_strings', 10, 1 ); 660 661 /** Scopes ********************************************************************/ 662 663 /** 664 * Set up activity arguments for use with the 'just-me' scope. 665 * 666 * @since 2.2.0 667 * 668 * @param array $retval Empty array by default. 669 * @param array $filter Current activity arguments. 670 * @return array $retval 671 */ 672 function bp_activity_filter_just_me_scope( $retval = array(), $filter = array() ) { 673 674 // Determine the user_id. 675 if ( ! empty( $filter['user_id'] ) ) { 676 $user_id = $filter['user_id']; 677 } else { 678 $user_id = bp_displayed_user_id() 679 ? bp_displayed_user_id() 680 : bp_loggedin_user_id(); 681 } 682 683 // Should we show all items regardless of sitewide visibility? 684 $show_hidden = array(); 685 if ( ! empty( $user_id ) && $user_id !== bp_loggedin_user_id() ) { 686 $show_hidden = array( 687 'column' => 'hide_sitewide', 688 'value' => 0 689 ); 690 } 691 692 $retval = array( 693 'relation' => 'AND', 694 array( 695 'column' => 'user_id', 696 'value' => $user_id 697 ), 698 $show_hidden, 699 700 // Overrides. 701 'override' => array( 702 'display_comments' => 'stream', 703 'filter' => array( 'user_id' => 0 ), 704 'show_hidden' => true 705 ), 706 ); 707 708 return $retval; 709 } 710 add_filter( 'bp_activity_set_just-me_scope_args', 'bp_activity_filter_just_me_scope', 10, 2 ); 711 712 /** 713 * Set up activity arguments for use with the 'favorites' scope. 714 * 715 * @since 2.2.0 716 * 717 * @param array $retval Empty array by default. 718 * @param array $filter Current activity arguments. 719 * @return array $retval 720 */ 721 function bp_activity_filter_favorites_scope( $retval = array(), $filter = array() ) { 722 723 // Determine the user_id. 724 if ( ! empty( $filter['user_id'] ) ) { 725 $user_id = $filter['user_id']; 726 } else { 727 $user_id = bp_displayed_user_id() 728 ? bp_displayed_user_id() 729 : bp_loggedin_user_id(); 730 } 731 732 // Determine the favorites. 733 $favs = bp_activity_get_user_favorites( $user_id ); 734 if ( empty( $favs ) ) { 735 $favs = array( 0 ); 736 } 737 738 // Should we show all items regardless of sitewide visibility? 739 $show_hidden = array(); 740 if ( ! empty( $user_id ) && ( $user_id !== bp_loggedin_user_id() ) ) { 741 $show_hidden = array( 742 'column' => 'hide_sitewide', 743 'value' => 0 744 ); 745 } 746 747 $retval = array( 748 'relation' => 'AND', 749 array( 750 'column' => 'id', 751 'compare' => 'IN', 752 'value' => (array) $favs 753 ), 754 $show_hidden, 755 756 // Overrides. 757 'override' => array( 758 'display_comments' => true, 759 'filter' => array( 'user_id' => 0 ), 760 'show_hidden' => true 761 ), 762 ); 763 764 return $retval; 765 } 766 add_filter( 'bp_activity_set_favorites_scope_args', 'bp_activity_filter_favorites_scope', 10, 2 ); 767 768 769 /** 770 * Set up activity arguments for use with the 'favorites' scope. 771 * 772 * @since 2.2.0 773 * 774 * @param array $retval Empty array by default. 775 * @param array $filter Current activity arguments. 776 * @return array $retval 777 */ 778 function bp_activity_filter_mentions_scope( $retval = array(), $filter = array() ) { 779 780 // Are mentions disabled? 781 if ( ! bp_activity_do_mentions() ) { 782 return $retval; 783 } 784 785 // Determine the user_id. 786 if ( ! empty( $filter['user_id'] ) ) { 787 $user_id = $filter['user_id']; 788 } else { 789 $user_id = bp_displayed_user_id() 790 ? bp_displayed_user_id() 791 : bp_loggedin_user_id(); 792 } 793 794 // Should we show all items regardless of sitewide visibility? 795 $show_hidden = array(); 796 if ( ! empty( $user_id ) && $user_id !== bp_loggedin_user_id() ) { 797 $show_hidden = array( 798 'column' => 'hide_sitewide', 799 'value' => 0 800 ); 801 } 802 803 $retval = array( 804 'relation' => 'AND', 805 array( 806 'column' => 'content', 807 'compare' => 'LIKE', 808 809 // Start search at @ symbol and stop search at closing tag delimiter. 810 'value' => '@' . bp_activity_get_user_mentionname( $user_id ) . '<' 811 ), 812 $show_hidden, 813 814 // Overrides. 815 'override' => array( 816 'display_comments' => 'stream', 817 'filter' => array( 'user_id' => 0 ), 818 'show_hidden' => true 819 ), 820 ); 821 822 return $retval; 823 } 824 add_filter( 'bp_activity_set_mentions_scope_args', 'bp_activity_filter_mentions_scope', 10, 2 ); 825 826 /** 827 * Registers Activity personal data exporter. 828 * 829 * @since 4.0.0 830 * @since 5.0.0 adds an `exporter_bp_friendly_name` param to exporters. 831 * 832 * @param array $exporters An array of personal data exporters. 833 * @return array An array of personal data exporters. 834 */ 835 function bp_activity_register_personal_data_exporter( $exporters ) { 836 $exporters['buddypress-activity'] = array( 837 'exporter_friendly_name' => __( 'BuddyPress Activity Data', 'buddypress' ), 838 'callback' => 'bp_activity_personal_data_exporter', 839 'exporter_bp_friendly_name' => _x( 'Activity Data', 'BuddyPress Activity data exporter friendly name', 'buddypress' ), 840 ); 841 842 return $exporters; 843 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:57 2024 | Cross-referenced by PHPXref 0.7.1 |