Skip to:
Content

Ticket #7218: 7218.02.patch

File 7218.02.patch, 40.5 KB (added by r-a-y, 9 months ago)

For the Activity component - refreshed for 2.9. Also conditionally loads activity RSS feeds and notification settings.

  • src/bp-activity/bp-activity-actions.php

     
    1313defined( 'ABSPATH' ) || exit; 
    1414 
    1515/** 
    16  * Allow core components and dependent plugins to register activity actions. 
    17  * 
    18  * @since 1.2.0 
    19  * 
    20  */ 
    21 function bp_register_activity_actions() { 
    22  
    23         /** 
    24          * Fires on bp_init to allow core components and dependent plugins to register activity actions. 
    25          * 
    26          * @since 1.2.0 
    27          */ 
    28         do_action( 'bp_register_activity_actions' ); 
    29 } 
    30 add_action( 'bp_init', 'bp_register_activity_actions', 8 ); 
    31  
    32 /** 
    3316 * Catch and route requests for single activity item permalinks. 
    3417 * 
    3518 * @since 1.2.0 
     
    428411        bp_core_redirect( wp_get_referer() . '#activity-' . bp_action_variable( 0 ) ); 
    429412} 
    430413add_action( 'bp_actions', 'bp_activity_action_remove_favorite' ); 
    431  
    432 /** 
    433  * Load the sitewide activity feed. 
    434  * 
    435  * @since 1.0.0 
    436  * 
    437  * @return bool False on failure. 
    438  */ 
    439 function bp_activity_action_sitewide_feed() { 
    440         $bp = buddypress(); 
    441  
    442         if ( ! bp_is_activity_component() || ! bp_is_current_action( 'feed' ) || bp_is_user() || ! empty( $bp->groups->current_group ) ) 
    443                 return false; 
    444  
    445         // Setup the feed. 
    446         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    447                 'id'            => 'sitewide', 
    448  
    449                 /* translators: Sitewide activity RSS title - "[Site Name] | Site Wide Activity" */ 
    450                 'title'         => sprintf( __( '%s | Site-Wide Activity', 'buddypress' ), bp_get_site_name() ), 
    451  
    452                 'link'          => bp_get_activity_directory_permalink(), 
    453                 'description'   => __( 'Activity feed for the entire site.', 'buddypress' ), 
    454                 'activity_args' => 'display_comments=threaded' 
    455         ) ); 
    456 } 
    457 add_action( 'bp_actions', 'bp_activity_action_sitewide_feed' ); 
    458  
    459 /** 
    460  * Load a user's personal activity feed. 
    461  * 
    462  * @since 1.0.0 
    463  * 
    464  * @return bool False on failure. 
    465  */ 
    466 function bp_activity_action_personal_feed() { 
    467         if ( ! bp_is_user_activity() || ! bp_is_current_action( 'feed' ) ) { 
    468                 return false; 
    469         } 
    470  
    471         // Setup the feed. 
    472         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    473                 'id'            => 'personal', 
    474  
    475                 /* translators: Personal activity RSS title - "[Site Name] | [User Display Name] | Activity" */ 
    476                 'title'         => sprintf( __( '%1$s | %2$s | Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
    477  
    478                 'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() ), 
    479                 'description'   => sprintf( __( 'Activity feed for %s.', 'buddypress' ), bp_get_displayed_user_fullname() ), 
    480                 'activity_args' => 'user_id=' . bp_displayed_user_id() 
    481         ) ); 
    482 } 
    483 add_action( 'bp_actions', 'bp_activity_action_personal_feed' ); 
    484  
    485 /** 
    486  * Load a user's friends' activity feed. 
    487  * 
    488  * @since 1.0.0 
    489  * 
    490  * @return bool False on failure. 
    491  */ 
    492 function bp_activity_action_friends_feed() { 
    493         if ( ! bp_is_active( 'friends' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_friends_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
    494                 return false; 
    495         } 
    496  
    497         // Setup the feed. 
    498         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    499                 'id'            => 'friends', 
    500  
    501                 /* translators: Friends activity RSS title - "[Site Name] | [User Display Name] | Friends Activity" */ 
    502                 'title'         => sprintf( __( '%1$s | %2$s | Friends Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
    503  
    504                 'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() ), 
    505                 'description'   => sprintf( __( "Activity feed for %s's friends.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
    506                 'activity_args' => 'scope=friends' 
    507         ) ); 
    508 } 
    509 add_action( 'bp_actions', 'bp_activity_action_friends_feed' ); 
    510  
    511 /** 
    512  * Load the activity feed for a user's groups. 
    513  * 
    514  * @since 1.2.0 
    515  * 
    516  * @return bool False on failure. 
    517  */ 
    518 function bp_activity_action_my_groups_feed() { 
    519         if ( ! bp_is_active( 'groups' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_groups_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
    520                 return false; 
    521         } 
    522  
    523         // Get displayed user's group IDs. 
    524         $groups    = groups_get_user_groups(); 
    525         $group_ids = implode( ',', $groups['groups'] ); 
    526  
    527         // Setup the feed. 
    528         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    529                 'id'            => 'mygroups', 
    530  
    531                 /* translators: Member groups activity RSS title - "[Site Name] | [User Display Name] | Groups Activity" */ 
    532                 'title'         => sprintf( __( '%1$s | %2$s | Group Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
    533  
    534                 'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() ), 
    535                 'description'   => sprintf( __( "Public group activity feed of which %s is a member.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
    536                 'activity_args' => array( 
    537                         'object'           => buddypress()->groups->id, 
    538                         'primary_id'       => $group_ids, 
    539                         'display_comments' => 'threaded' 
    540                 ) 
    541         ) ); 
    542 } 
    543 add_action( 'bp_actions', 'bp_activity_action_my_groups_feed' ); 
    544  
    545 /** 
    546  * Load a user's @mentions feed. 
    547  * 
    548  * @since 1.2.0 
    549  * 
    550  * @return bool False on failure. 
    551  */ 
    552 function bp_activity_action_mentions_feed() { 
    553         if ( ! bp_activity_do_mentions() ) { 
    554                 return false; 
    555         } 
    556  
    557         if ( !bp_is_user_activity() || ! bp_is_current_action( 'mentions' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
    558                 return false; 
    559         } 
    560  
    561         // Setup the feed. 
    562         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    563                 'id'            => 'mentions', 
    564  
    565                 /* translators: User mentions activity RSS title - "[Site Name] | [User Display Name] | Mentions" */ 
    566                 'title'         => sprintf( __( '%1$s | %2$s | Mentions', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
    567  
    568                 'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/', 
    569                 'description'   => sprintf( __( "Activity feed mentioning %s.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
    570                 'activity_args' => array( 
    571                         'search_terms' => '@' . bp_core_get_username( bp_displayed_user_id() ) 
    572                 ) 
    573         ) ); 
    574 } 
    575 add_action( 'bp_actions', 'bp_activity_action_mentions_feed' ); 
    576  
    577 /** 
    578  * Load a user's favorites feed. 
    579  * 
    580  * @since 1.2.0 
    581  * 
    582  * @return bool False on failure. 
    583  */ 
    584 function bp_activity_action_favorites_feed() { 
    585         if ( ! bp_is_user_activity() || ! bp_is_current_action( 'favorites' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
    586                 return false; 
    587         } 
    588  
    589         // Get displayed user's favorite activity IDs. 
    590         $favs = bp_activity_get_user_favorites( bp_displayed_user_id() ); 
    591         $fav_ids = implode( ',', (array) $favs ); 
    592  
    593         // Setup the feed. 
    594         buddypress()->activity->feed = new BP_Activity_Feed( array( 
    595                 'id'            => 'favorites', 
    596  
    597                 /* translators: User activity favorites RSS title - "[Site Name] | [User Display Name] | Favorites" */ 
    598                 'title'         => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
    599  
    600                 'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/', 
    601                 'description'   => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
    602                 'activity_args' => 'include=' . $fav_ids 
    603         ) ); 
    604 } 
    605 add_action( 'bp_actions', 'bp_activity_action_favorites_feed' ); 
    606  
    607 /** 
    608  * AJAX endpoint for Suggestions API lookups. 
    609  * 
    610  * @since 2.1.0 
    611  */ 
    612 function bp_ajax_get_suggestions() { 
    613         if ( ! bp_is_user_active() || empty( $_GET['term'] ) || empty( $_GET['type'] ) ) { 
    614                 wp_send_json_error( 'missing_parameter' ); 
    615                 exit; 
    616         } 
    617  
    618         $args = array( 
    619                 'term' => sanitize_text_field( $_GET['term'] ), 
    620                 'type' => sanitize_text_field( $_GET['type'] ), 
    621         ); 
    622  
    623         // Support per-Group suggestions. 
    624         if ( ! empty( $_GET['group-id'] ) ) { 
    625                 $args['group_id'] = absint( $_GET['group-id'] ); 
    626         } 
    627  
    628         $results = bp_core_get_suggestions( $args ); 
    629  
    630         if ( is_wp_error( $results ) ) { 
    631                 wp_send_json_error( $results->get_error_message() ); 
    632                 exit; 
    633         } 
    634  
    635         wp_send_json_success( $results ); 
    636 } 
    637 add_action( 'wp_ajax_bp_get_suggestions', 'bp_ajax_get_suggestions' ); 
    638  
    639 /** 
    640  * Detect a change in post type status, and initiate an activity update if necessary. 
    641  * 
    642  * @since 2.2.0 
    643  * 
    644  * @todo Support untrashing better. 
    645  * 
    646  * @param string $new_status New status for the post. 
    647  * @param string $old_status Old status for the post. 
    648  * @param object $post       Post data. 
    649  */ 
    650 function bp_activity_catch_transition_post_type_status( $new_status, $old_status, $post ) { 
    651         if ( ! post_type_supports( $post->post_type, 'buddypress-activity' ) ) { 
    652                 return; 
    653         } 
    654  
    655         // This is an edit. 
    656         if ( $new_status === $old_status ) { 
    657                 // An edit of an existing post should update the existing activity item. 
    658                 if ( $new_status == 'publish' ) { 
    659                         $edit = bp_activity_post_type_update( $post ); 
    660  
    661                         // Post was never recorded into activity stream, so record it now! 
    662                         if ( null === $edit ) { 
    663                                 bp_activity_post_type_publish( $post->ID, $post ); 
    664                         } 
    665  
    666                 // Allow plugins to eventually deal with other post statuses. 
    667                 } else { 
    668                         /** 
    669                          * Fires when editing the post and the new status is not 'publish'. 
    670                          * 
    671                          * This is a variable filter that is dependent on the post type 
    672                          * being untrashed. 
    673                          * 
    674                          * @since 2.5.0 
    675                          * 
    676                          * @param WP_Post $post Post data. 
    677                          * @param string $new_status New status for the post. 
    678                          * @param string $old_status Old status for the post. 
    679                          */ 
    680                         do_action( 'bp_activity_post_type_edit_' . $post->post_type, $post, $new_status, $old_status ); 
    681                 } 
    682  
    683                 return; 
    684         } 
    685  
    686         // Publishing a previously unpublished post. 
    687         if ( 'publish' === $new_status ) { 
    688                 // Untrashing the post type - nothing here yet. 
    689                 if ( 'trash' == $old_status ) { 
    690  
    691                         /** 
    692                          * Fires if untrashing post in a post type. 
    693                          * 
    694                          * This is a variable filter that is dependent on the post type 
    695                          * being untrashed. 
    696                          * 
    697                          * @since 2.2.0 
    698                          * 
    699                          * @param WP_Post $post Post data. 
    700                          */ 
    701                         do_action( 'bp_activity_post_type_untrash_' . $post->post_type, $post ); 
    702                 } else { 
    703                         // Record the post. 
    704                         bp_activity_post_type_publish( $post->ID, $post ); 
    705                 } 
    706  
    707         // Unpublishing a previously published post. 
    708         } elseif ( 'publish' === $old_status ) { 
    709                 // Some form of pending status - only remove the activity entry. 
    710                 bp_activity_post_type_unpublish( $post->ID, $post ); 
    711  
    712         // For any other cases, allow plugins to eventually deal with it. 
    713         } else { 
    714                 /** 
    715                  * Fires when the old and the new post status are not 'publish'. 
    716                  * 
    717                  * This is a variable filter that is dependent on the post type 
    718                  * being untrashed. 
    719                  * 
    720                  * @since 2.5.0 
    721                  * 
    722                  * @param WP_Post $post Post data. 
    723                  * @param string $new_status New status for the post. 
    724                  * @param string $old_status Old status for the post. 
    725                  */ 
    726                 do_action( 'bp_activity_post_type_transition_status_' . $post->post_type, $post, $new_status, $old_status ); 
    727         } 
    728 } 
    729 add_action( 'transition_post_status', 'bp_activity_catch_transition_post_type_status', 10, 3 ); 
    730  
    731 /** 
    732  * When a post type comment status transition occurs, update the relevant activity's status. 
    733  * 
    734  * @since 2.5.0 
    735  * 
    736  * @param string     $new_status New comment status. 
    737  * @param string     $old_status Previous comment status. 
    738  * @param WP_Comment $comment Comment data. 
    739  */ 
    740 function bp_activity_transition_post_type_comment_status( $new_status, $old_status, $comment ) { 
    741         $post_type = get_post_type( $comment->comment_post_ID ); 
    742         if ( ! $post_type ) { 
    743                 return; 
    744         } 
    745  
    746         // Get the post type tracking args. 
    747         $activity_post_object = bp_activity_get_post_type_tracking_args( $post_type ); 
    748  
    749         // Bail if the activity type does not exist 
    750         if ( empty( $activity_post_object->comments_tracking->action_id ) ) { 
    751                 return false; 
    752  
    753         // Set the $activity_comment_object 
    754         } else { 
    755                 $activity_comment_object = $activity_post_object->comments_tracking; 
    756         } 
    757  
    758         // Init an empty activity ID 
    759         $activity_id = 0; 
    760  
    761         /** 
    762          * Activity currently doesn't have any concept of a trash, or an unapproved/approved state. 
    763          * 
    764          * If a blog comment transitions to a "delete" or "hold" status, delete the activity item. 
    765          * If a blog comment transitions to trashed, or spammed, mark the activity as spam. 
    766          * If a blog comment transitions to approved (and the activity exists), mark the activity as ham. 
    767          * If a blog comment transitions to unapproved (and the activity exists), mark the activity as spam. 
    768          * Otherwise, record the comment into the activity stream. 
    769          */ 
    770  
    771         // This clause handles delete/hold. 
    772         if ( in_array( $new_status, array( 'delete', 'hold' ) ) ) { 
    773                 return bp_activity_post_type_remove_comment( $comment->comment_ID, $activity_post_object ); 
    774  
    775         // These clauses handle trash, spam, and un-spams. 
    776         } elseif ( in_array( $new_status, array( 'trash', 'spam', 'unapproved' ) ) ) { 
    777                 $action = 'spam_activity'; 
    778         } elseif ( 'approved' == $new_status ) { 
    779                 $action = 'ham_activity'; 
    780         } 
    781  
    782         // Get the activity 
    783         if ( bp_disable_blogforum_comments() ) { 
    784                 $activity_id = bp_activity_get_activity_id( array( 
    785                         'component'         => $activity_comment_object->component_id, 
    786                         'item_id'           => get_current_blog_id(), 
    787                         'secondary_item_id' => $comment->comment_ID, 
    788                         'type'              => $activity_comment_object->action_id, 
    789                 ) ); 
    790         } else { 
    791                 $activity_id = get_comment_meta( $comment->comment_ID, 'bp_activity_comment_id', true ); 
    792         } 
    793  
    794         /** 
    795          * Leave a chance to plugins to manage activity comments differently. 
    796          * 
    797          * @since  2.5.0 
    798          * 
    799          * @param bool        $value       True to override BuddyPress management. 
    800          * @param string      $post_type   The post type name. 
    801          * @param int         $activity_id The post type activity (0 if not found). 
    802          * @param string      $new_status  The new status of the post type comment. 
    803          * @param string      $old_status  The old status of the post type comment. 
    804          * @param WP_Comment  $comment Comment data. 
    805          */ 
    806         if ( true === apply_filters( 'bp_activity_pre_transition_post_type_comment_status', false, $post_type, $activity_id, $new_status, $old_status, $comment ) ) { 
    807                 return false; 
    808         } 
    809  
    810         // Check activity item exists 
    811         if ( empty( $activity_id ) ) { 
    812                 // If no activity exists, but the comment has been approved, record it into the activity table. 
    813                 if ( 'approved' == $new_status ) { 
    814                         return bp_activity_post_type_comment( $comment->comment_ID, true, $activity_post_object ); 
    815                 } 
    816  
    817                 return; 
    818         } 
    819  
    820         // Create an activity object 
    821         $activity = new BP_Activity_Activity( $activity_id ); 
    822         if ( empty( $activity->component ) ) { 
    823                 return; 
    824         } 
    825  
    826         // Spam/ham the activity if it's not already in that state 
    827         if ( 'spam_activity' === $action && ! $activity->is_spam ) { 
    828                 bp_activity_mark_as_spam( $activity ); 
    829         } elseif ( 'ham_activity' == $action) { 
    830                 bp_activity_mark_as_ham( $activity ); 
    831         } 
    832  
    833         // Add "new_post_type_comment" to the whitelisted activity types, so that the activity's Akismet history is generated 
    834         $post_type_comment_action = $activity_comment_object->action_id; 
    835         $comment_akismet_history = function ( $activity_types ) use ( $post_type_comment_action ) { 
    836                 $activity_types[] = $post_type_comment_action; 
    837  
    838                 return $activity_types; 
    839         }; 
    840         add_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
    841  
    842         // Make sure the activity change won't edit the comment if sync is on 
    843         remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
    844  
    845         // Save the updated activity 
    846         $activity->save(); 
    847  
    848         // Restore the action 
    849         add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
    850  
    851         // Remove the "new_blog_comment" activity type whitelist so we don't break anything 
    852         remove_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
    853 } 
    854 add_action( 'transition_comment_status', 'bp_activity_transition_post_type_comment_status', 10, 3 ); 
  • new file src/bp-activity/bp-activity-feeds.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Feeds. 
     4 * 
     5 * @package BuddyPress 
     6 * @subpackage ActivityFeeds 
     7 * @since 2.9.0 
     8 */ 
     9 
     10/** 
     11 * Load the sitewide activity feed. 
     12 * 
     13 * @since 1.0.0 
     14 * 
     15 * @return bool False on failure. 
     16 */ 
     17function bp_activity_action_sitewide_feed() { 
     18        $bp = buddypress(); 
     19 
     20        if ( ! bp_is_activity_component() || ! bp_is_current_action( 'feed' ) || bp_is_user() || ! empty( $bp->groups->current_group ) ) 
     21                return false; 
     22 
     23        // Setup the feed. 
     24        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     25                'id'            => 'sitewide', 
     26 
     27                /* translators: Sitewide activity RSS title - "[Site Name] | Site Wide Activity" */ 
     28                'title'         => sprintf( __( '%s | Site-Wide Activity', 'buddypress' ), bp_get_site_name() ), 
     29 
     30                'link'          => bp_get_activity_directory_permalink(), 
     31                'description'   => __( 'Activity feed for the entire site.', 'buddypress' ), 
     32                'activity_args' => 'display_comments=threaded' 
     33        ) ); 
     34} 
     35add_action( 'bp_actions', 'bp_activity_action_sitewide_feed' ); 
     36 
     37/** 
     38 * Load a user's personal activity feed. 
     39 * 
     40 * @since 1.0.0 
     41 * 
     42 * @return bool False on failure. 
     43 */ 
     44function bp_activity_action_personal_feed() { 
     45        if ( ! bp_is_user_activity() || ! bp_is_current_action( 'feed' ) ) { 
     46                return false; 
     47        } 
     48 
     49        // Setup the feed. 
     50        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     51                'id'            => 'personal', 
     52 
     53                /* translators: Personal activity RSS title - "[Site Name] | [User Display Name] | Activity" */ 
     54                'title'         => sprintf( __( '%1$s | %2$s | Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     55 
     56                'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() ), 
     57                'description'   => sprintf( __( 'Activity feed for %s.', 'buddypress' ), bp_get_displayed_user_fullname() ), 
     58                'activity_args' => 'user_id=' . bp_displayed_user_id() 
     59        ) ); 
     60} 
     61add_action( 'bp_actions', 'bp_activity_action_personal_feed' ); 
     62 
     63/** 
     64 * Load a user's friends' activity feed. 
     65 * 
     66 * @since 1.0.0 
     67 * 
     68 * @return bool False on failure. 
     69 */ 
     70function bp_activity_action_friends_feed() { 
     71        if ( ! bp_is_active( 'friends' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_friends_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     72                return false; 
     73        } 
     74 
     75        // Setup the feed. 
     76        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     77                'id'            => 'friends', 
     78 
     79                /* translators: Friends activity RSS title - "[Site Name] | [User Display Name] | Friends Activity" */ 
     80                'title'         => sprintf( __( '%1$s | %2$s | Friends Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     81 
     82                'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() ), 
     83                'description'   => sprintf( __( "Activity feed for %s's friends.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     84                'activity_args' => 'scope=friends' 
     85        ) ); 
     86} 
     87add_action( 'bp_actions', 'bp_activity_action_friends_feed' ); 
     88 
     89/** 
     90 * Load the activity feed for a user's groups. 
     91 * 
     92 * @since 1.2.0 
     93 * 
     94 * @return bool False on failure. 
     95 */ 
     96function bp_activity_action_my_groups_feed() { 
     97        if ( ! bp_is_active( 'groups' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_groups_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     98                return false; 
     99        } 
     100 
     101        // Get displayed user's group IDs. 
     102        $groups    = groups_get_user_groups(); 
     103        $group_ids = implode( ',', $groups['groups'] ); 
     104 
     105        // Setup the feed. 
     106        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     107                'id'            => 'mygroups', 
     108 
     109                /* translators: Member groups activity RSS title - "[Site Name] | [User Display Name] | Groups Activity" */ 
     110                'title'         => sprintf( __( '%1$s | %2$s | Group Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     111 
     112                'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() ), 
     113                'description'   => sprintf( __( "Public group activity feed of which %s is a member.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     114                'activity_args' => array( 
     115                        'object'           => buddypress()->groups->id, 
     116                        'primary_id'       => $group_ids, 
     117                        'display_comments' => 'threaded' 
     118                ) 
     119        ) ); 
     120} 
     121add_action( 'bp_actions', 'bp_activity_action_my_groups_feed' ); 
     122 
     123/** 
     124 * Load a user's @mentions feed. 
     125 * 
     126 * @since 1.2.0 
     127 * 
     128 * @return bool False on failure. 
     129 */ 
     130function bp_activity_action_mentions_feed() { 
     131        if ( ! bp_activity_do_mentions() ) { 
     132                return false; 
     133        } 
     134 
     135        if ( !bp_is_user_activity() || ! bp_is_current_action( 'mentions' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     136                return false; 
     137        } 
     138 
     139        // Setup the feed. 
     140        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     141                'id'            => 'mentions', 
     142 
     143                /* translators: User mentions activity RSS title - "[Site Name] | [User Display Name] | Mentions" */ 
     144                'title'         => sprintf( __( '%1$s | %2$s | Mentions', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     145 
     146                'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/', 
     147                'description'   => sprintf( __( "Activity feed mentioning %s.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     148                'activity_args' => array( 
     149                        'search_terms' => '@' . bp_core_get_username( bp_displayed_user_id() ) 
     150                ) 
     151        ) ); 
     152} 
     153add_action( 'bp_actions', 'bp_activity_action_mentions_feed' ); 
     154 
     155/** 
     156 * Load a user's favorites feed. 
     157 * 
     158 * @since 1.2.0 
     159 * 
     160 * @return bool False on failure. 
     161 */ 
     162function bp_activity_action_favorites_feed() { 
     163        if ( ! bp_is_user_activity() || ! bp_is_current_action( 'favorites' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     164                return false; 
     165        } 
     166 
     167        // Get displayed user's favorite activity IDs. 
     168        $favs = bp_activity_get_user_favorites( bp_displayed_user_id() ); 
     169        $fav_ids = implode( ',', (array) $favs ); 
     170 
     171        // Setup the feed. 
     172        buddypress()->activity->feed = new BP_Activity_Feed( array( 
     173                'id'            => 'favorites', 
     174 
     175                /* translators: User activity favorites RSS title - "[Site Name] | [User Display Name] | Favorites" */ 
     176                'title'         => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     177 
     178                'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/', 
     179                'description'   => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     180                'activity_args' => 'include=' . $fav_ids 
     181        ) ); 
     182} 
     183add_action( 'bp_actions', 'bp_activity_action_favorites_feed' ); 
  • src/bp-activity/bp-activity-functions.php

     
    14281428add_action( 'bp_make_ham_user', 'bp_activity_ham_all_user_data' ); 
    14291429 
    14301430/** 
     1431 * Allow core components and dependent plugins to register activity actions. 
     1432 * 
     1433 * @since 1.2.0 
     1434 * 
     1435 */ 
     1436function bp_register_activity_actions() { 
     1437 
     1438        /** 
     1439         * Fires on bp_init to allow core components and dependent plugins to register activity actions. 
     1440         * 
     1441         * @since 1.2.0 
     1442         */ 
     1443        do_action( 'bp_register_activity_actions' ); 
     1444} 
     1445add_action( 'bp_init', 'bp_register_activity_actions', 8 ); 
     1446 
     1447/** 
    14311448 * Register the activity stream actions for updates. 
    14321449 * 
    14331450 * @since 1.6.0 
     
    38383855         */ 
    38393856        return (bool) apply_filters( 'bp_activity_do_heartbeat', $retval ); 
    38403857} 
     3858 
     3859 
     3860/** 
     3861 * AJAX endpoint for Suggestions API lookups. 
     3862 * 
     3863 * @since 2.1.0 
     3864 */ 
     3865function bp_ajax_get_suggestions() { 
     3866        if ( ! bp_is_user_active() || empty( $_GET['term'] ) || empty( $_GET['type'] ) ) { 
     3867                wp_send_json_error( 'missing_parameter' ); 
     3868                exit; 
     3869        } 
     3870 
     3871        $args = array( 
     3872                'term' => sanitize_text_field( $_GET['term'] ), 
     3873                'type' => sanitize_text_field( $_GET['type'] ), 
     3874        ); 
     3875 
     3876        // Support per-Group suggestions. 
     3877        if ( ! empty( $_GET['group-id'] ) ) { 
     3878                $args['group_id'] = absint( $_GET['group-id'] ); 
     3879        } 
     3880 
     3881        $results = bp_core_get_suggestions( $args ); 
     3882 
     3883        if ( is_wp_error( $results ) ) { 
     3884                wp_send_json_error( $results->get_error_message() ); 
     3885                exit; 
     3886        } 
     3887 
     3888        wp_send_json_success( $results ); 
     3889} 
     3890add_action( 'wp_ajax_bp_get_suggestions', 'bp_ajax_get_suggestions' ); 
     3891 
     3892/** 
     3893 * Detect a change in post type status, and initiate an activity update if necessary. 
     3894 * 
     3895 * @since 2.2.0 
     3896 * 
     3897 * @todo Support untrashing better. 
     3898 * 
     3899 * @param string $new_status New status for the post. 
     3900 * @param string $old_status Old status for the post. 
     3901 * @param object $post       Post data. 
     3902 */ 
     3903function bp_activity_catch_transition_post_type_status( $new_status, $old_status, $post ) { 
     3904        if ( ! post_type_supports( $post->post_type, 'buddypress-activity' ) ) { 
     3905                return; 
     3906        } 
     3907 
     3908        // This is an edit. 
     3909        if ( $new_status === $old_status ) { 
     3910                // An edit of an existing post should update the existing activity item. 
     3911                if ( $new_status == 'publish' ) { 
     3912                        $edit = bp_activity_post_type_update( $post ); 
     3913 
     3914                        // Post was never recorded into activity stream, so record it now! 
     3915                        if ( null === $edit ) { 
     3916                                bp_activity_post_type_publish( $post->ID, $post ); 
     3917                        } 
     3918 
     3919                // Allow plugins to eventually deal with other post statuses. 
     3920                } else { 
     3921                        /** 
     3922                         * Fires when editing the post and the new status is not 'publish'. 
     3923                         * 
     3924                         * This is a variable filter that is dependent on the post type 
     3925                         * being untrashed. 
     3926                         * 
     3927                         * @since 2.5.0 
     3928                         * 
     3929                         * @param WP_Post $post Post data. 
     3930                         * @param string $new_status New status for the post. 
     3931                         * @param string $old_status Old status for the post. 
     3932                         */ 
     3933                        do_action( 'bp_activity_post_type_edit_' . $post->post_type, $post, $new_status, $old_status ); 
     3934                } 
     3935 
     3936                return; 
     3937        } 
     3938 
     3939        // Publishing a previously unpublished post. 
     3940        if ( 'publish' === $new_status ) { 
     3941                // Untrashing the post type - nothing here yet. 
     3942                if ( 'trash' == $old_status ) { 
     3943 
     3944                        /** 
     3945                         * Fires if untrashing post in a post type. 
     3946                         * 
     3947                         * This is a variable filter that is dependent on the post type 
     3948                         * being untrashed. 
     3949                         * 
     3950                         * @since 2.2.0 
     3951                         * 
     3952                         * @param WP_Post $post Post data. 
     3953                         */ 
     3954                        do_action( 'bp_activity_post_type_untrash_' . $post->post_type, $post ); 
     3955                } else { 
     3956                        // Record the post. 
     3957                        bp_activity_post_type_publish( $post->ID, $post ); 
     3958                } 
     3959 
     3960        // Unpublishing a previously published post. 
     3961        } elseif ( 'publish' === $old_status ) { 
     3962                // Some form of pending status - only remove the activity entry. 
     3963                bp_activity_post_type_unpublish( $post->ID, $post ); 
     3964 
     3965        // For any other cases, allow plugins to eventually deal with it. 
     3966        } else { 
     3967                /** 
     3968                 * Fires when the old and the new post status are not 'publish'. 
     3969                 * 
     3970                 * This is a variable filter that is dependent on the post type 
     3971                 * being untrashed. 
     3972                 * 
     3973                 * @since 2.5.0 
     3974                 * 
     3975                 * @param WP_Post $post Post data. 
     3976                 * @param string $new_status New status for the post. 
     3977                 * @param string $old_status Old status for the post. 
     3978                 */ 
     3979                do_action( 'bp_activity_post_type_transition_status_' . $post->post_type, $post, $new_status, $old_status ); 
     3980        } 
     3981} 
     3982add_action( 'transition_post_status', 'bp_activity_catch_transition_post_type_status', 10, 3 ); 
     3983 
     3984/** 
     3985 * When a post type comment status transition occurs, update the relevant activity's status. 
     3986 * 
     3987 * @since 2.5.0 
     3988 * 
     3989 * @param string     $new_status New comment status. 
     3990 * @param string     $old_status Previous comment status. 
     3991 * @param WP_Comment $comment Comment data. 
     3992 */ 
     3993function bp_activity_transition_post_type_comment_status( $new_status, $old_status, $comment ) { 
     3994        $post_type = get_post_type( $comment->comment_post_ID ); 
     3995        if ( ! $post_type ) { 
     3996                return; 
     3997        } 
     3998 
     3999        // Get the post type tracking args. 
     4000        $activity_post_object = bp_activity_get_post_type_tracking_args( $post_type ); 
     4001 
     4002        // Bail if the activity type does not exist 
     4003        if ( empty( $activity_post_object->comments_tracking->action_id ) ) { 
     4004                return false; 
     4005 
     4006        // Set the $activity_comment_object 
     4007        } else { 
     4008                $activity_comment_object = $activity_post_object->comments_tracking; 
     4009        } 
     4010 
     4011        // Init an empty activity ID 
     4012        $activity_id = 0; 
     4013 
     4014        /** 
     4015         * Activity currently doesn't have any concept of a trash, or an unapproved/approved state. 
     4016         * 
     4017         * If a blog comment transitions to a "delete" or "hold" status, delete the activity item. 
     4018         * If a blog comment transitions to trashed, or spammed, mark the activity as spam. 
     4019         * If a blog comment transitions to approved (and the activity exists), mark the activity as ham. 
     4020         * If a blog comment transitions to unapproved (and the activity exists), mark the activity as spam. 
     4021         * Otherwise, record the comment into the activity stream. 
     4022         */ 
     4023 
     4024        // This clause handles delete/hold. 
     4025        if ( in_array( $new_status, array( 'delete', 'hold' ) ) ) { 
     4026                return bp_activity_post_type_remove_comment( $comment->comment_ID, $activity_post_object ); 
     4027 
     4028        // These clauses handle trash, spam, and un-spams. 
     4029        } elseif ( in_array( $new_status, array( 'trash', 'spam', 'unapproved' ) ) ) { 
     4030                $action = 'spam_activity'; 
     4031        } elseif ( 'approved' == $new_status ) { 
     4032                $action = 'ham_activity'; 
     4033        } 
     4034 
     4035        // Get the activity 
     4036        if ( bp_disable_blogforum_comments() ) { 
     4037                $activity_id = bp_activity_get_activity_id( array( 
     4038                        'component'         => $activity_comment_object->component_id, 
     4039                        'item_id'           => get_current_blog_id(), 
     4040                        'secondary_item_id' => $comment->comment_ID, 
     4041                        'type'              => $activity_comment_object->action_id, 
     4042                ) ); 
     4043        } else { 
     4044                $activity_id = get_comment_meta( $comment->comment_ID, 'bp_activity_comment_id', true ); 
     4045        } 
     4046 
     4047        /** 
     4048         * Leave a chance to plugins to manage activity comments differently. 
     4049         * 
     4050         * @since  2.5.0 
     4051         * 
     4052         * @param bool        $value       True to override BuddyPress management. 
     4053         * @param string      $post_type   The post type name. 
     4054         * @param int         $activity_id The post type activity (0 if not found). 
     4055         * @param string      $new_status  The new status of the post type comment. 
     4056         * @param string      $old_status  The old status of the post type comment. 
     4057         * @param WP_Comment  $comment Comment data. 
     4058         */ 
     4059        if ( true === apply_filters( 'bp_activity_pre_transition_post_type_comment_status', false, $post_type, $activity_id, $new_status, $old_status, $comment ) ) { 
     4060                return false; 
     4061        } 
     4062 
     4063        // Check activity item exists 
     4064        if ( empty( $activity_id ) ) { 
     4065                // If no activity exists, but the comment has been approved, record it into the activity table. 
     4066                if ( 'approved' == $new_status ) { 
     4067                        return bp_activity_post_type_comment( $comment->comment_ID, true, $activity_post_object ); 
     4068                } 
     4069 
     4070                return; 
     4071        } 
     4072 
     4073        // Create an activity object 
     4074        $activity = new BP_Activity_Activity( $activity_id ); 
     4075        if ( empty( $activity->component ) ) { 
     4076                return; 
     4077        } 
     4078 
     4079        // Spam/ham the activity if it's not already in that state 
     4080        if ( 'spam_activity' === $action && ! $activity->is_spam ) { 
     4081                bp_activity_mark_as_spam( $activity ); 
     4082        } elseif ( 'ham_activity' == $action) { 
     4083                bp_activity_mark_as_ham( $activity ); 
     4084        } 
     4085 
     4086        // Add "new_post_type_comment" to the whitelisted activity types, so that the activity's Akismet history is generated 
     4087        $post_type_comment_action = $activity_comment_object->action_id; 
     4088        $comment_akismet_history = function ( $activity_types ) use ( $post_type_comment_action ) { 
     4089                $activity_types[] = $post_type_comment_action; 
     4090 
     4091                return $activity_types; 
     4092        }; 
     4093        add_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
     4094 
     4095        // Make sure the activity change won't edit the comment if sync is on 
     4096        remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
     4097 
     4098        // Save the updated activity 
     4099        $activity->save(); 
     4100 
     4101        // Restore the action 
     4102        add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
     4103 
     4104        // Remove the "new_blog_comment" activity type whitelist so we don't break anything 
     4105        remove_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
     4106} 
     4107add_action( 'transition_comment_status', 'bp_activity_transition_post_type_comment_status', 10, 3 ); 
  • src/bp-activity/bp-activity-screens.php

     
    300300} 
    301301add_action( 'bp_screens', 'bp_activity_screen_single_activity_permalink' ); 
    302302 
    303 /** 
    304  * Add activity notifications settings to the notifications settings page. 
    305  * 
    306  * @since 1.2.0 
    307  * 
    308  */ 
    309 function bp_activity_screen_notification_settings() { 
    310  
    311         if ( bp_activity_do_mentions() ) { 
    312                 if ( ! $mention = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_mention', true ) ) { 
    313                         $mention = 'yes'; 
    314                 } 
    315         } 
    316  
    317         if ( ! $reply = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_reply', true ) ) { 
    318                 $reply = 'yes'; 
    319         } 
    320  
    321         ?> 
    322  
    323         <table class="notification-settings" id="activity-notification-settings"> 
    324                 <thead> 
    325                         <tr> 
    326                                 <th class="icon">&nbsp;</th> 
    327                                 <th class="title"><?php _e( 'Activity', 'buddypress' ) ?></th> 
    328                                 <th class="yes"><?php _e( 'Yes', 'buddypress' ) ?></th> 
    329                                 <th class="no"><?php _e( 'No', 'buddypress' )?></th> 
    330                         </tr> 
    331                 </thead> 
    332  
    333                 <tbody> 
    334                         <?php if ( bp_activity_do_mentions() ) : ?> 
    335                                 <tr id="activity-notification-settings-mentions"> 
    336                                         <td>&nbsp;</td> 
    337                                         <td><?php printf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) ) ?></td> 
    338                                         <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 
    339                                                 /* translators: accessibility text */ 
    340                                                 _e( 'Yes, send email', 'buddypress' ); 
    341                                         ?></label></td> 
    342                                         <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 
    343                                                 /* translators: accessibility text */ 
    344                                                 _e( 'No, do not send email', 'buddypress' ); 
    345                                         ?></label></td> 
    346                                 </tr> 
    347                         <?php endif; ?> 
    348  
    349                         <tr id="activity-notification-settings-replies"> 
    350                                 <td>&nbsp;</td> 
    351                                 <td><?php _e( "A member replies to an update or comment you've posted", 'buddypress' ) ?></td> 
    352                                 <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 
    353                                         /* translators: accessibility text */ 
    354                                         _e( 'Yes, send email', 'buddypress' ); 
    355                                 ?></label></td> 
    356                                 <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 
    357                                         /* translators: accessibility text */ 
    358                                         _e( 'No, do not send email', 'buddypress' ); 
    359                                 ?></label></td> 
    360                         </tr> 
    361  
    362                         <?php 
    363  
    364                         /** 
    365                          * Fires inside the closing </tbody> tag for activity screen notification settings. 
    366                          * 
    367                          * @since 1.2.0 
    368                          */ 
    369                         do_action( 'bp_activity_screen_notification_settings' ) ?> 
    370                 </tbody> 
    371         </table> 
    372  
    373 <?php 
    374 } 
    375 add_action( 'bp_notification_settings', 'bp_activity_screen_notification_settings', 1 ); 
    376  
    377303/** Theme Compatibility *******************************************************/ 
    378304 
    379305new BP_Activity_Theme_Compat(); 
  • new file src/bp-activity/bp-activity-settings.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Settings. 
     4 * 
     5 * @package BuddyPress 
     6 * @subpackage ActivitySettings 
     7 * @since 2.9.0 
     8 */ 
     9 
     10// Exit if accessed directly. 
     11defined( 'ABSPATH' ) || exit; 
     12 
     13/** 
     14 * Add activity notifications settings to the notifications settings page. 
     15 * 
     16 * @since 1.2.0 
     17 * 
     18 */ 
     19function bp_activity_screen_notification_settings() { 
     20 
     21        if ( bp_activity_do_mentions() ) { 
     22                if ( ! $mention = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_mention', true ) ) { 
     23                        $mention = 'yes'; 
     24                } 
     25        } 
     26 
     27        if ( ! $reply = bp_get_user_meta( bp_displayed_user_id(), 'notification_activity_new_reply', true ) ) { 
     28                $reply = 'yes'; 
     29        } 
     30 
     31        ?> 
     32 
     33        <table class="notification-settings" id="activity-notification-settings"> 
     34                <thead> 
     35                        <tr> 
     36                                <th class="icon">&nbsp;</th> 
     37                                <th class="title"><?php _e( 'Activity', 'buddypress' ) ?></th> 
     38                                <th class="yes"><?php _e( 'Yes', 'buddypress' ) ?></th> 
     39                                <th class="no"><?php _e( 'No', 'buddypress' )?></th> 
     40                        </tr> 
     41                </thead> 
     42 
     43                <tbody> 
     44                        <?php if ( bp_activity_do_mentions() ) : ?> 
     45                                <tr id="activity-notification-settings-mentions"> 
     46                                        <td>&nbsp;</td> 
     47                                        <td><?php printf( __( 'A member mentions you in an update using "@%s"', 'buddypress' ), bp_core_get_username( bp_displayed_user_id() ) ) ?></td> 
     48                                        <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 
     49                                                /* translators: accessibility text */ 
     50                                                _e( 'Yes, send email', 'buddypress' ); 
     51                                        ?></label></td> 
     52                                        <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 
     53                                                /* translators: accessibility text */ 
     54                                                _e( 'No, do not send email', 'buddypress' ); 
     55                                        ?></label></td> 
     56                                </tr> 
     57                        <?php endif; ?> 
     58 
     59                        <tr id="activity-notification-settings-replies"> 
     60                                <td>&nbsp;</td> 
     61                                <td><?php _e( "A member replies to an update or comment you've posted", 'buddypress' ) ?></td> 
     62                                <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 
     63                                        /* translators: accessibility text */ 
     64                                        _e( 'Yes, send email', 'buddypress' ); 
     65                                ?></label></td> 
     66                                <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 
     67                                        /* translators: accessibility text */ 
     68                                        _e( 'No, do not send email', 'buddypress' ); 
     69                                ?></label></td> 
     70                        </tr> 
     71 
     72                        <?php 
     73 
     74                        /** 
     75                         * Fires inside the closing </tbody> tag for activity screen notification settings. 
     76                         * 
     77                         * @since 1.2.0 
     78                         */ 
     79                        do_action( 'bp_activity_screen_notification_settings' ) ?> 
     80                </tbody> 
     81        </table> 
     82 
     83<?php 
     84} 
     85add_action( 'bp_notification_settings', 'bp_activity_screen_notification_settings', 1 ); 
     86 No newline at end of file 
  • src/bp-activity/classes/class-bp-activity-component.php

     
    5151                // Files to include. 
    5252                $includes = array( 
    5353                        'cssjs', 
    54                         'actions', 
    55                         'screens', 
    5654                        'filters', 
    5755                        'adminbar', 
    5856                        'template', 
     
    7876                        $includes[] = 'embeds'; 
    7977                } 
    8078 
     79                // Include frontend action code for test suite. 
     80                if ( function_exists( 'tests_add_filter' ) ) { 
     81                        $includes[] = 'actions'; 
     82                        $includes[] = 'screens'; 
     83 
     84                // Otherwise, only include frontend action code when on activity component. 
     85                } else { 
     86                        add_action( 'bp_setup_canonical_stack', array( $this, 'late_includes' ), 20 ); 
     87                } 
     88 
    8189                if ( is_admin() ) { 
    8290                        $includes[] = 'admin'; 
    8391                } 
     
    8694        } 
    8795 
    8896        /** 
     97         * Late includes method 
     98         * 
     99         * Only load up certain code when on a specific activity page. 
     100         * 
     101         * @since 2.9.0 
     102         */ 
     103        public function late_includes() { 
     104                // Activity notifications HTML table. 
     105                if ( bp_is_user_settings_notifications() ) { 
     106                        require $this->path . 'bp-activity/bp-activity-settings.php'; 
     107 
     108                // RSS feeds. 
     109                } elseif ( bp_is_current_action( 'feed' ) || bp_is_action_variable( 'feed', 0 ) ) { 
     110                        require $this->path . 'bp-activity/bp-activity-feeds.php'; 
     111 
     112                // Not activity component? Bail. 
     113                } elseif ( ! bp_is_current_component( 'activity' ) ) { 
     114                        return; 
     115                } 
     116 
     117                // Laod activity action and screen code. 
     118                require $this->path . 'bp-activity/bp-activity-actions.php'; 
     119                require $this->path . 'bp-activity/bp-activity-screens.php'; 
     120        } 
     121 
     122        /** 
    89123         * Set up component global variables. 
    90124         * 
    91125         * The BP_ACTIVITY_SLUG constant is deprecated, and only used here for