[ Index ] |
PHP Cross Reference of BuddyPress |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Activity functions 4 * 5 * @since 3.0.0 6 * @version 8.0.0 7 */ 8 9 // Exit if accessed directly. 10 defined( 'ABSPATH' ) || exit; 11 12 /** 13 * Register Scripts for the Activity component 14 * 15 * @since 3.0.0 16 * 17 * @param array $scripts The array of scripts to register. 18 * 19 * @return array The same array with the specific activity scripts. 20 */ 21 function bp_nouveau_activity_register_scripts( $scripts = array() ) { 22 if ( ! isset( $scripts['bp-nouveau'] ) ) { 23 return $scripts; 24 } 25 26 return array_merge( $scripts, array( 27 'bp-nouveau-activity' => array( 28 'file' => 'js/buddypress-activity%s.js', 29 'dependencies' => array( 'bp-nouveau' ), 30 'footer' => true, 31 ), 32 'bp-nouveau-activity-post-form' => array( 33 'file' => 'js/buddypress-activity-post-form%s.js', 34 'dependencies' => array( 'bp-nouveau', 'bp-nouveau-activity', 'json2', 'wp-backbone' ), 35 'footer' => true, 36 ), 37 ) ); 38 } 39 40 /** 41 * Enqueue the activity scripts 42 * 43 * @since 3.0.0 44 */ 45 function bp_nouveau_activity_enqueue_scripts() { 46 if ( ! bp_is_activity_component() && ! bp_is_group_activity() ) { 47 return; 48 } 49 50 wp_enqueue_script( 'bp-nouveau-activity' ); 51 } 52 53 /** 54 * Localize the strings needed for the Activity Post form UI 55 * 56 * @since 3.0.0 57 * 58 * @param array $params Associative array containing the JS Strings needed by scripts. 59 * 60 * @return array The same array with specific strings for the Activity Post form UI if needed. 61 */ 62 function bp_nouveau_activity_localize_scripts( $params = array() ) { 63 if ( ! bp_is_activity_component() && ! bp_is_group_activity() ) { 64 return $params; 65 } 66 67 $activity_params = array( 68 'user_id' => bp_loggedin_user_id(), 69 'object' => 'user', 70 'backcompat' => array( 71 'before_post_form' => (bool) has_action( 'bp_before_activity_post_form' ), 72 'post_form_options' => (bool) has_action( 'bp_activity_post_form_options' ), 73 ), 74 'post_nonce' => wp_create_nonce( 'post_update', '_wpnonce_post_update' ), 75 ); 76 77 $user_displayname = bp_get_loggedin_user_fullname(); 78 79 if ( buddypress()->avatar->show_avatars ) { 80 $width = bp_core_avatar_thumb_width(); 81 $height = bp_core_avatar_thumb_height(); 82 $activity_params = array_merge( $activity_params, array( 83 'avatar_url' => bp_get_loggedin_user_avatar( array( 84 'width' => $width, 85 'height' => $height, 86 'html' => false, 87 ) ), 88 'avatar_width' => $width, 89 'avatar_height' => $height, 90 'user_domain' => bp_loggedin_user_domain(), 91 'avatar_alt' => sprintf( 92 /* translators: %s: member name */ 93 __( 'Profile photo of %s', 'buddypress' ), 94 $user_displayname 95 ), 96 ) ); 97 } 98 99 /** 100 * Filters the included, specific, Action buttons. 101 * 102 * @since 3.0.0 103 * 104 * @param array $value The array containing the button params. Must look like: 105 * array( 'buttonid' => array( 106 * 'id' => 'buttonid', // Id for your action 107 * 'caption' => __( 'Button caption', 'text-domain' ), 108 * 'icon' => 'dashicons-*', // The dashicon to use 109 * 'order' => 0, 110 * 'handle' => 'button-script-handle', // The handle of the registered script to enqueue 111 * ); 112 */ 113 $activity_buttons = apply_filters( 'bp_nouveau_activity_buttons', array() ); 114 115 if ( ! empty( $activity_buttons ) ) { 116 $activity_params['buttons'] = bp_sort_by_key( $activity_buttons, 'order', 'num' ); 117 118 // Enqueue Buttons scripts and styles 119 foreach ( $activity_params['buttons'] as $key_button => $buttons ) { 120 if ( empty( $buttons['handle'] ) ) { 121 continue; 122 } 123 124 if ( wp_style_is( $buttons['handle'], 'registered' ) ) { 125 wp_enqueue_style( $buttons['handle'] ); 126 } 127 128 if ( wp_script_is( $buttons['handle'], 'registered' ) ) { 129 wp_enqueue_script( $buttons['handle'] ); 130 } 131 132 unset( $activity_params['buttons'][ $key_button ]['handle'] ); 133 } 134 } 135 136 // Activity Objects 137 if ( ! bp_is_single_item() && ! bp_is_user() ) { 138 $activity_objects = array( 139 'profile' => array( 140 'text' => __( 'Post in: Profile', 'buddypress' ), 141 'autocomplete_placeholder' => '', 142 'priority' => 5, 143 ), 144 ); 145 146 // the groups component is active & the current user is at least a member of 1 group 147 if ( bp_is_active( 'groups' ) && bp_has_groups( array( 'user_id' => bp_loggedin_user_id(), 'max' => 1 ) ) ) { 148 $activity_objects['group'] = array( 149 'text' => __( 'Post in: Group', 'buddypress' ), 150 'autocomplete_placeholder' => __( 'Start typing the group name...', 'buddypress' ), 151 'priority' => 10, 152 ); 153 } 154 155 /** 156 * Filters the activity objects to apply for localized javascript data. 157 * 158 * @since 3.0.0 159 * 160 * @param array $activity_objects Array of activity objects. 161 */ 162 $activity_params['objects'] = apply_filters( 'bp_nouveau_activity_objects', $activity_objects ); 163 } 164 165 $activity_strings = array( 166 'whatsnewPlaceholder' => sprintf( __( "What's new, %s?", 'buddypress' ), bp_get_user_firstname( $user_displayname ) ), 167 'whatsnewLabel' => __( 'Post what\'s new', 'buddypress' ), 168 'whatsnewpostinLabel' => __( 'Post in', 'buddypress' ), 169 'postUpdateButton' => __( 'Post Update', 'buddypress' ), 170 'cancelButton' => __( 'Cancel', 'buddypress' ), 171 ); 172 173 if ( bp_is_group() ) { 174 $activity_params = array_merge( 175 $activity_params, 176 array( 177 'object' => 'group', 178 'item_id' => bp_get_current_group_id(), 179 ) 180 ); 181 } 182 183 $params['activity'] = array( 184 'params' => $activity_params, 185 'strings' => $activity_strings, 186 ); 187 188 return $params; 189 } 190 191 /** 192 * @since 3.0.0 193 */ 194 function bp_nouveau_get_activity_directory_nav_items() { 195 $nav_items = array(); 196 197 $nav_items['all'] = array( 198 'component' => 'activity', 199 'slug' => 'all', // slug is used because BP_Core_Nav requires it, but it's the scope 200 'li_class' => array( 'dynamic' ), 201 'link' => bp_get_activity_directory_permalink(), 202 'text' => __( 'All Members', 'buddypress' ), 203 'count' => '', 204 'position' => 5, 205 ); 206 207 // deprecated hooks 208 $deprecated_hooks = array( 209 array( 'bp_before_activity_type_tab_all', 'activity', 0 ), 210 array( 'bp_activity_type_tabs', 'activity', 46 ), 211 ); 212 213 if ( is_user_logged_in() ) { 214 $deprecated_hooks = array_merge( 215 $deprecated_hooks, 216 array( 217 array( 'bp_before_activity_type_tab_friends', 'activity', 6 ), 218 array( 'bp_before_activity_type_tab_groups', 'activity', 16 ), 219 array( 'bp_before_activity_type_tab_favorites', 'activity', 26 ), 220 ) 221 ); 222 223 // If the user has favorite create a nav item 224 if ( bp_get_total_favorite_count_for_user( bp_loggedin_user_id() ) ) { 225 $nav_items['favorites'] = array( 226 'component' => 'activity', 227 'slug' => 'favorites', // slug is used because BP_Core_Nav requires it, but it's the scope 228 'li_class' => array(), 229 'link' => bp_loggedin_user_domain() . bp_nouveau_get_component_slug( 'activity' ) . '/favorites/', 230 'text' => __( 'My Favorites', 'buddypress' ), 231 'count' => false, 232 'position' => 35, 233 ); 234 } 235 236 // The friends component is active and user has friends 237 if ( bp_is_active( 'friends' ) && bp_get_total_friend_count( bp_loggedin_user_id() ) ) { 238 $nav_items['friends'] = array( 239 'component' => 'activity', 240 'slug' => 'friends', // slug is used because BP_Core_Nav requires it, but it's the scope 241 'li_class' => array( 'dynamic' ), 242 'link' => bp_loggedin_user_domain() . bp_nouveau_get_component_slug( 'activity' ) . '/' . bp_nouveau_get_component_slug( 'friends' ) . '/', 243 'text' => __( 'My Friends', 'buddypress' ), 244 'count' => '', 245 'position' => 15, 246 ); 247 } 248 249 // The groups component is active and user has groups 250 if ( bp_is_active( 'groups' ) && bp_get_total_group_count_for_user( bp_loggedin_user_id() ) ) { 251 $nav_items['groups'] = array( 252 'component' => 'activity', 253 'slug' => 'groups', // slug is used because BP_Core_Nav requires it, but it's the scope 254 'li_class' => array( 'dynamic' ), 255 'link' => bp_loggedin_user_domain() . bp_nouveau_get_component_slug( 'activity' ) . '/' . bp_nouveau_get_component_slug( 'groups' ) . '/', 256 'text' => __( 'My Groups', 'buddypress' ), 257 'count' => '', 258 'position' => 25, 259 ); 260 } 261 262 // Mentions are allowed 263 if ( bp_activity_do_mentions() ) { 264 $deprecated_hooks[] = array( 'bp_before_activity_type_tab_mentions', 'activity', 36 ); 265 266 $count = ''; 267 if ( bp_get_total_mention_count_for_user( bp_loggedin_user_id() ) ) { 268 $count = bp_get_total_mention_count_for_user( bp_loggedin_user_id() ); 269 } 270 271 $nav_items['mentions'] = array( 272 'component' => 'activity', 273 'slug' => 'mentions', // slug is used because BP_Core_Nav requires it, but it's the scope 274 'li_class' => array( 'dynamic' ), 275 'link' => bp_loggedin_user_domain() . bp_nouveau_get_component_slug( 'activity' ) . '/mentions/', 276 'text' => __( 'Mentions', 'buddypress' ), 277 'count' => $count, 278 'position' => 45, 279 ); 280 } 281 } 282 283 // Check for deprecated hooks : 284 foreach ( $deprecated_hooks as $deprectated_hook ) { 285 list( $hook, $component, $position ) = $deprectated_hook; 286 287 $extra_nav_items = bp_nouveau_parse_hooked_dir_nav( $hook, $component, $position ); 288 289 if ( ! empty( $extra_nav_items ) ) { 290 $nav_items = array_merge( $nav_items, $extra_nav_items ); 291 } 292 } 293 294 /** 295 * Filters the activity directory navigation items. 296 * 297 * Use this filter to introduce your custom nav items for the activity directory. 298 * 299 * @since 3.0.0 300 * 301 * @param array $nav_items The list of the activity directory nav items. 302 */ 303 return apply_filters( 'bp_nouveau_get_activity_directory_nav_items', $nav_items ); 304 } 305 306 /** 307 * Make sure bp_get_activity_show_filters() will return the filters and the context 308 * instead of the output. 309 * 310 * @since 3.0.0 311 * 312 * @param string $output HTML output 313 * @param array $filters Optional. 314 * @param string $context 315 * 316 * @return array 317 */ 318 function bp_nouveau_get_activity_filters_array( $output = '', $filters = array(), $context = '' ) { 319 return array( 320 'filters' => $filters, 321 'context' => $context, 322 ); 323 } 324 325 /** 326 * Get Dropdown filters of the activity component 327 * 328 * @since 3.0.0 329 * 330 * @return array the filters 331 */ 332 function bp_nouveau_get_activity_filters() { 333 add_filter( 'bp_get_activity_show_filters', 'bp_nouveau_get_activity_filters_array', 10, 3 ); 334 335 $filters_data = bp_get_activity_show_filters(); 336 337 remove_filter( 'bp_get_activity_show_filters', 'bp_nouveau_get_activity_filters_array', 10, 3 ); 338 339 $action = ''; 340 if ( 'group' === $filters_data['context'] ) { 341 $action = 'bp_group_activity_filter_options'; 342 } elseif ( 'member' === $filters_data['context'] || 'member_groups' === $filters_data['context'] ) { 343 $action = 'bp_member_activity_filter_options'; 344 } else { 345 $action = 'bp_activity_filter_options'; 346 } 347 348 $filters = $filters_data['filters']; 349 350 if ( $action ) { 351 return bp_nouveau_parse_hooked_options( $action, $filters ); 352 } 353 354 return $filters; 355 } 356 357 /** 358 * @since 3.0.0 359 */ 360 function bp_nouveau_activity_secondary_avatars( $action, $activity ) { 361 switch ( $activity->component ) { 362 case 'groups': 363 case 'friends': 364 $secondary_avatar = bp_get_activity_secondary_avatar( array( 'linked' => false ) ); 365 366 // Only insert avatar if one exists. 367 if ( $secondary_avatar ) { 368 $link_close = '">'; 369 $first_link = strpos( $action, $link_close ); 370 $second_link = strpos( $action, $link_close, $first_link + strlen( $link_close ) ); 371 $action = substr_replace( $action, $secondary_avatar, $second_link + 2, 0 ); 372 } 373 break; 374 } 375 376 return $action; 377 } 378 379 /** 380 * @since 3.0.0 381 */ 382 function bp_nouveau_activity_scope_newest_class( $classes = '' ) { 383 if ( ! is_user_logged_in() ) { 384 return $classes; 385 } 386 387 $user_id = bp_loggedin_user_id(); 388 $my_classes = array(); 389 390 /* 391 * HeartBeat requests will transport the scope. 392 * See bp_nouveau_ajax_querystring(). 393 */ 394 $scope = ''; 395 396 if ( ! empty( $_POST['data']['bp_heartbeat']['scope'] ) ) { 397 $scope = sanitize_key( $_POST['data']['bp_heartbeat']['scope'] ); 398 } 399 400 // Add specific classes to perform specific actions on the client side. 401 if ( $scope && bp_is_activity_directory() ) { 402 $component = bp_get_activity_object_name(); 403 404 /* 405 * These classes will be used to count the number of newest activities for 406 * the 'Mentions', 'My Groups' & 'My Friends' tabs 407 */ 408 if ( 'all' === $scope ) { 409 if ( 'groups' === $component && bp_is_active( $component ) ) { 410 // Is the current user a member of the group the activity is attached to? 411 if ( groups_is_user_member( $user_id, bp_get_activity_item_id() ) ) { 412 $my_classes[] = 'bp-my-groups'; 413 } 414 } 415 416 // Friends can post in groups the user is a member of 417 if ( bp_is_active( 'friends' ) && (int) $user_id !== (int) bp_get_activity_user_id() ) { 418 if ( friends_check_friendship( $user_id, bp_get_activity_user_id() ) ) { 419 $my_classes[] = 'bp-my-friends'; 420 } 421 } 422 423 // A mention can be posted by a friend within a group 424 if ( true === bp_activity_do_mentions() ) { 425 $new_mentions = bp_get_user_meta( $user_id, 'bp_new_mentions', true ); 426 427 // The current activity is one of the new mentions 428 if ( is_array( $new_mentions ) && in_array( bp_get_activity_id(), $new_mentions, true ) ) { 429 $my_classes[] = 'bp-my-mentions'; 430 } 431 } 432 433 /* 434 * This class will be used to highlight the newest activities when 435 * viewing the 'Mentions', 'My Groups' or the 'My Friends' tabs 436 */ 437 } elseif ( 'friends' === $scope || 'groups' === $scope || 'mentions' === $scope ) { 438 $my_classes[] = 'newest_' . $scope . '_activity'; 439 } 440 441 // Leave other components do their specific stuff if needed. 442 /** 443 * Filters the classes to be applied to the newest activity item. 444 * 445 * Leave other components do their specific stuff if needed. 446 * 447 * @since 3.0.0 448 * 449 * @param array $my_classes Array of classes to output to class attribute. 450 * @param string $scope Current scope for the activity type. 451 */ 452 $my_classes = (array) apply_filters( 'bp_nouveau_activity_scope_newest_class', $my_classes, $scope ); 453 454 if ( ! empty( $my_classes ) ) { 455 $classes .= ' ' . join( ' ', $my_classes ); 456 } 457 } 458 459 return $classes; 460 } 461 462 /** 463 * Get the activity query args for the widget. 464 * 465 * @since 3.0.0 466 * 467 * @return array The activity arguments. 468 */ 469 function bp_nouveau_activity_widget_query() { 470 $args = array(); 471 $bp_nouveau = bp_nouveau(); 472 473 if ( isset( $bp_nouveau->activity->widget_args ) ) { 474 $args = $bp_nouveau->activity->widget_args; 475 } 476 477 /** 478 * Filter to edit the activity widget arguments. 479 * 480 * @since 3.0.0 481 * 482 * @param array $args The activity arguments. 483 */ 484 return apply_filters( 'bp_nouveau_activity_widget_query', $args ); 485 } 486 487 /** 488 * Register notifications filters for the activity component. 489 * 490 * @since 3.0.0 491 */ 492 function bp_nouveau_activity_notification_filters() { 493 $notifications = array( 494 array( 495 'id' => 'new_at_mention', 496 'label' => __( 'New mentions', 'buddypress' ), 497 'position' => 5, 498 ), 499 array( 500 'id' => 'update_reply', 501 'label' => __( 'New update replies', 'buddypress' ), 502 'position' => 15, 503 ), 504 array( 505 'id' => 'comment_reply', 506 'label' => __( 'New update comment replies', 'buddypress' ), 507 'position' => 25, 508 ), 509 ); 510 511 foreach ( $notifications as $notification ) { 512 bp_nouveau_notifications_register_filter( $notification ); 513 } 514 } 515 516 /** 517 * Add controls for the settings of the customizer for the activity component. 518 * 519 * @since 3.0.0 520 * 521 * @param array $controls Optional. The controls to add. 522 * 523 * @return array the controls to add. 524 */ 525 function bp_nouveau_activity_customizer_controls( $controls = array() ) { 526 return array_merge( $controls, array( 527 'act_dir_layout' => array( 528 'label' => __( 'Use column navigation for the Activity directory.', 'buddypress' ), 529 'section' => 'bp_nouveau_dir_layout', 530 'settings' => 'bp_nouveau_appearance[activity_dir_layout]', 531 'type' => 'checkbox', 532 ), 533 'act_dir_tabs' => array( 534 'label' => __( 'Use tab styling for Activity directory navigation.', 'buddypress' ), 535 'section' => 'bp_nouveau_dir_layout', 536 'settings' => 'bp_nouveau_appearance[activity_dir_tabs]', 537 'type' => 'checkbox', 538 ), 539 ) ); 540 } 541 542 /** 543 * Remove brackets around the "Read more" text. 544 * 545 * @since 7.0.0 546 * 547 * @param string $read_more The read more text. 548 * @return string The read more text without brackets. 549 */ 550 function bp_nouveau_activity_excerpt_append_text( $read_more = '' ) { 551 /** 552 * As this was added during a string freeze period, we 553 * are using the `str_replace()` function. 554 */ 555 return str_replace( array( '[', ']' ), '', $read_more ); 556 } 557 add_filter( 'bp_activity_excerpt_append_text', 'bp_nouveau_activity_excerpt_append_text', 10, 1 );
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 |