Skip to:
Content

Ticket #7218: 7218.activity-autoload.patch

File 7218.activity-autoload.patch, 82.1 KB (added by r-a-y, 7 months ago)
  • src/bp-activity/bp-activity-actions.php

     
    3333 * Catch and route requests for single activity item permalinks. 
    3434 * 
    3535 * @since 1.2.0 
    36  * 
    37  * @return bool False on failure. 
    3836 */ 
    3937function bp_activity_action_permalink_router() { 
    40  
    4138        // Not viewing activity. 
    42         if ( ! bp_is_activity_component() || ! bp_is_current_action( 'p' ) ) 
    43                 return false; 
    44  
    45         // No activity to display. 
    46         if ( ! bp_action_variable( 0 ) || ! is_numeric( bp_action_variable( 0 ) ) ) 
    47                 return false; 
    48  
    49         // Get the activity details. 
    50         $activity = bp_activity_get_specific( array( 'activity_ids' => bp_action_variable( 0 ), 'show_hidden' => true ) ); 
    51  
    52         // 404 if activity does not exist 
    53         if ( empty( $activity['activities'][0] ) ) { 
    54                 bp_do_404(); 
     39        if ( ! bp_is_activity_component() || ! bp_is_current_action( 'p' ) ) { 
    5540                return; 
    56         } else { 
    57                 $activity = $activity['activities'][0]; 
    5841        } 
    5942 
    60         // Do not redirect at default. 
    61         $redirect = false; 
    62  
    63         // Redirect based on the type of activity. 
    64         if ( bp_is_active( 'groups' ) && $activity->component == buddypress()->groups->id ) { 
    65  
    66                 // Activity is a user update. 
    67                 if ( ! empty( $activity->user_id ) ) { 
    68                         $redirect = bp_core_get_user_domain( $activity->user_id, $activity->user_nicename, $activity->user_login ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
    69  
    70                 // Activity is something else. 
    71                 } else { 
    72  
    73                         // Set redirect to group activity stream. 
    74                         if ( $group = groups_get_group( $activity->item_id ) ) { 
    75                                 $redirect = bp_get_group_permalink( $group ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
    76                         } 
    77                 } 
    78  
    79         // Set redirect to users' activity stream. 
    80         } elseif ( ! empty( $activity->user_id ) ) { 
    81                 $redirect = bp_core_get_user_domain( $activity->user_id, $activity->user_nicename, $activity->user_login ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
    82         } 
    83  
    84         // If set, add the original query string back onto the redirect URL. 
    85         if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { 
    86                 $query_frags = array(); 
    87                 wp_parse_str( $_SERVER['QUERY_STRING'], $query_frags ); 
    88                 $redirect = add_query_arg( urlencode_deep( $query_frags ), $redirect ); 
    89         } 
    90  
    91         /** 
    92          * Filter the intended redirect url before the redirect occurs for the single activity item. 
    93          * 
    94          * @since 1.2.2 
    95          * 
    96          * @param array $value Array with url to redirect to and activity related to the redirect. 
    97          */ 
    98         if ( ! $redirect = apply_filters_ref_array( 'bp_activity_permalink_redirect_url', array( $redirect, &$activity ) ) ) { 
    99                 bp_core_redirect( bp_get_root_domain() ); 
     43        // No activity to display. 
     44        if ( ! bp_action_variable( 0 ) || ! is_numeric( bp_action_variable( 0 ) ) ) { 
     45                return; 
    10046        } 
    10147 
    102         // Redirect to the actual activity permalink page. 
    103         bp_core_redirect( $redirect ); 
     48        new BP_Activity_Action_Permalink_Router; 
    10449} 
    10550add_action( 'bp_actions', 'bp_activity_action_permalink_router' ); 
    10651 
    10752/** 
    108  * Delete specific activity item and redirect to previous page. 
     53 * Delete activity item handler when JS is disabled. 
    10954 * 
    11055 * @since 1.1.0 
    11156 * 
     
    11358 * @return bool False on failure. 
    11459 */ 
    11560function bp_activity_action_delete_activity( $activity_id = 0 ) { 
    116  
    11761        // Not viewing activity or action is not delete. 
    118         if ( !bp_is_activity_component() || !bp_is_current_action( 'delete' ) ) 
     62        if ( ! bp_is_activity_component() || ! bp_is_current_action( 'delete' ) ) { 
    11963                return false; 
     64        } 
    12065 
    121         if ( empty( $activity_id ) && bp_action_variable( 0 ) ) 
     66        if ( empty( $activity_id ) && bp_action_variable( 0 ) ) { 
    12267                $activity_id = (int) bp_action_variable( 0 ); 
     68        } 
    12369 
    12470        // Not viewing a specific activity item. 
    125         if ( empty( $activity_id ) ) 
    126                 return false; 
    127  
    128         // Check the nonce. 
    129         check_admin_referer( 'bp_activity_delete_link' ); 
    130  
    131         // Load up the activity item. 
    132         $activity = new BP_Activity_Activity( $activity_id ); 
    133  
    134         // Check access. 
    135         if ( ! bp_activity_user_can_delete( $activity ) ) 
     71        if ( empty( $activity_id ) ) { 
    13672                return false; 
     73        } 
    13774 
    138         /** 
    139          * Fires before the deletion so plugins can still fetch information about it. 
    140          * 
    141          * @since 1.5.0 
    142          * 
    143          * @param int $activity_id The activity ID. 
    144          * @param int $user_id     The user associated with the activity. 
    145          */ 
    146         do_action( 'bp_activity_before_action_delete_activity', $activity_id, $activity->user_id ); 
    147  
    148         // Delete the activity item and provide user feedback. 
    149         if ( bp_activity_delete( array( 'id' => $activity_id, 'user_id' => $activity->user_id ) ) ) 
    150                 bp_core_add_message( __( 'Activity deleted successfully', 'buddypress' ) ); 
    151         else 
    152                 bp_core_add_message( __( 'There was an error when deleting that activity', 'buddypress' ), 'error' ); 
    153  
    154         /** 
    155          * Fires after the deletion so plugins can act afterwards based on the activity. 
    156          * 
    157          * @since 1.1.0 
    158          * 
    159          * @param int $activity_id The activity ID. 
    160          * @param int $user_id     The user associated with the activity. 
    161          */ 
    162         do_action( 'bp_activity_action_delete_activity', $activity_id, $activity->user_id ); 
    163  
    164         // Check for the redirect query arg, otherwise let WP handle things. 
    165         if ( !empty( $_GET['redirect_to'] ) ) 
    166                 bp_core_redirect( esc_url( $_GET['redirect_to'] ) ); 
    167         else 
    168                 bp_core_redirect( wp_get_referer() ); 
     75        return new BP_Activity_Action_Delete( $activity_id ); 
    16976} 
    17077add_action( 'bp_actions', 'bp_activity_action_delete_activity' ); 
    17178 
    17279/** 
    173  * Mark specific activity item as spam and redirect to previous page. 
     80 * Mark activity item as spam handler when JS is disabled. 
    17481 * 
    17582 * @since 1.6.0 
    17683 * 
     
    17885 * @return bool False on failure. 
    17986 */ 
    18087function bp_activity_action_spam_activity( $activity_id = 0 ) { 
    181         $bp = buddypress(); 
    182  
    18388        // Not viewing activity, or action is not spam, or Akismet isn't present. 
    184         if ( !bp_is_activity_component() || !bp_is_current_action( 'spam' ) || empty( $bp->activity->akismet ) ) 
     89        if ( ! bp_is_activity_component() || !bp_is_current_action( 'spam' ) || empty( buddypress()->activity->akismet ) ) { 
    18590                return false; 
     91        } 
    18692 
    187         if ( empty( $activity_id ) && bp_action_variable( 0 ) ) 
     93        if ( empty( $activity_id ) && bp_action_variable( 0 ) ) { 
    18894                $activity_id = (int) bp_action_variable( 0 ); 
     95        } 
    18996 
    19097        // Not viewing a specific activity item. 
    191         if ( empty( $activity_id ) ) 
    192                 return false; 
    193  
    194         // Is the current user allowed to spam items? 
    195         if ( !bp_activity_user_can_mark_spam() ) 
    196                 return false; 
    197  
    198         // Load up the activity item. 
    199         $activity = new BP_Activity_Activity( $activity_id ); 
    200         if ( empty( $activity->id ) ) 
     98        if ( empty( $activity_id ) ) { 
    20199                return false; 
     100        } 
    202101 
    203         // Check nonce. 
    204         check_admin_referer( 'bp_activity_akismet_spam_' . $activity->id ); 
    205  
    206         /** 
    207          * Fires before the marking activity as spam so plugins can modify things if they want to. 
    208          * 
    209          * @since 1.6.0 
    210          * 
    211          * @param int    $activity_id Activity ID to be marked as spam. 
    212          * @param object $activity    Activity object for the ID to be marked as spam. 
    213          */ 
    214         do_action( 'bp_activity_before_action_spam_activity', $activity->id, $activity ); 
    215  
    216         // Mark as spam. 
    217         bp_activity_mark_as_spam( $activity ); 
    218         $activity->save(); 
    219  
    220         // Tell the user the spamming has been successful. 
    221         bp_core_add_message( __( 'The activity item has been marked as spam and is no longer visible.', 'buddypress' ) ); 
    222  
    223         /** 
    224          * Fires after the marking activity as spam so plugins can act afterwards based on the activity. 
    225          * 
    226          * @since 1.6.0 
    227          * 
    228          * @param int $activity_id Activity ID that was marked as spam. 
    229          * @param int $user_id     User ID associated with activity. 
    230          */ 
    231         do_action( 'bp_activity_action_spam_activity', $activity_id, $activity->user_id ); 
    232  
    233         // Check for the redirect query arg, otherwise let WP handle things. 
    234         if ( !empty( $_GET['redirect_to'] ) ) 
    235                 bp_core_redirect( esc_url( $_GET['redirect_to'] ) ); 
    236         else 
    237                 bp_core_redirect( wp_get_referer() ); 
     102        return new BP_Activity_Action_Spam( $activity_id ); 
    238103} 
    239104add_action( 'bp_actions', 'bp_activity_action_spam_activity' ); 
    240105 
    241106/** 
    242  * Post user/group activity update. 
     107 * Post user/group activity update handler when JS is disabled. 
    243108 * 
    244109 * @since 1.2.0 
    245110 * 
    246111 * @return bool False on failure. 
    247112 */ 
    248113function bp_activity_action_post_update() { 
    249  
    250114        // Do not proceed if user is not logged in, not viewing activity, or not posting. 
    251         if ( !is_user_logged_in() || !bp_is_activity_component() || !bp_is_current_action( 'post' ) ) 
    252                 return false; 
    253  
    254         // Check the nonce. 
    255         check_admin_referer( 'post_update', '_wpnonce_post_update' ); 
    256  
    257         /** 
    258          * Filters the content provided in the activity input field. 
    259          * 
    260          * @since 1.2.0 
    261          * 
    262          * @param string $value Activity message being posted. 
    263          */ 
    264         $content = apply_filters( 'bp_activity_post_update_content', $_POST['whats-new'] ); 
    265  
    266         if ( ! empty( $_POST['whats-new-post-object'] ) ) { 
    267  
    268                 /** 
    269                  * Filters the item type that the activity update should be associated with. 
    270                  * 
    271                  * @since 1.2.0 
    272                  * 
    273                  * @param string $value Item type to associate with. 
    274                  */ 
    275                 $object = apply_filters( 'bp_activity_post_update_object', $_POST['whats-new-post-object'] ); 
    276         } 
    277  
    278         if ( ! empty( $_POST['whats-new-post-in'] ) ) { 
    279  
    280                 /** 
    281                  * Filters what component the activity is being to. 
    282                  * 
    283                  * @since 1.2.0 
    284                  * 
    285                  * @param string $value Chosen component to post activity to. 
    286                  */ 
    287                 $item_id = apply_filters( 'bp_activity_post_update_item_id', $_POST['whats-new-post-in'] ); 
    288         } 
    289  
    290         // No activity content so provide feedback and redirect. 
    291         if ( empty( $content ) ) { 
    292                 bp_core_add_message( __( 'Please enter some content to post.', 'buddypress' ), 'error' ); 
    293                 bp_core_redirect( wp_get_referer() ); 
    294         } 
    295  
    296         // No existing item_id. 
    297         if ( empty( $item_id ) ) { 
    298                 $activity_id = bp_activity_post_update( array( 'content' => $content ) ); 
    299  
    300         // Post to groups object. 
    301         } elseif ( 'groups' == $object && bp_is_active( 'groups' ) ) { 
    302                 if ( (int) $item_id ) { 
    303                         $activity_id = groups_post_update( array( 'content' => $content, 'group_id' => $item_id ) ); 
    304                 } 
    305  
    306         } else { 
    307  
    308                 /** 
    309                  * Filters activity object for BuddyPress core and plugin authors before posting activity update. 
    310                  * 
    311                  * @since 1.2.0 
    312                  * 
    313                  * @param string $object  Activity item being associated to. 
    314                  * @param string $item_id Component ID being posted to. 
    315                  * @param string $content Activity content being posted. 
    316                  */ 
    317                 $activity_id = apply_filters( 'bp_activity_custom_update', $object, $item_id, $content ); 
     115        if ( ! is_user_logged_in() || ! bp_is_activity_component() || ! bp_is_current_action( 'post' ) ) { 
     116                return; 
    318117        } 
    319118 
    320         // Provide user feedback. 
    321         if ( !empty( $activity_id ) ) 
    322                 bp_core_add_message( __( 'Update Posted!', 'buddypress' ) ); 
    323         else 
    324                 bp_core_add_message( __( 'There was an error when posting your update. Please try again.', 'buddypress' ), 'error' ); 
    325  
    326         // Redirect. 
    327         bp_core_redirect( wp_get_referer() ); 
     119        new BP_Activity_Action_Post_Update; 
    328120} 
    329121add_action( 'bp_actions', 'bp_activity_action_post_update' ); 
    330122 
    331123/** 
    332  * Post new activity comment. 
     124 * Post new activity comment handler when JS is disabled. 
    333125 * 
    334126 * @since 1.2.0 
    335127 * 
    336128 * @return bool False on failure. 
    337129 */ 
    338130function bp_activity_action_post_comment() { 
    339  
    340         if ( !is_user_logged_in() || !bp_is_activity_component() || !bp_is_current_action( 'reply' ) ) 
    341                 return false; 
    342  
    343         // Check the nonce. 
    344         check_admin_referer( 'new_activity_comment', '_wpnonce_new_activity_comment' ); 
    345  
    346         /** 
    347          * Filters the activity ID a comment will be in reply to. 
    348          * 
    349          * @since 1.2.0 
    350          * 
    351          * @param string $value ID of the activity being replied to. 
    352          */ 
    353         $activity_id = apply_filters( 'bp_activity_post_comment_activity_id', $_POST['comment_form_id'] ); 
    354  
    355         /** 
    356          * Filters the comment content for a comment reply. 
    357          * 
    358          * @since 1.2.0 
    359          * 
    360          * @param string $value Comment content being posted. 
    361          */ 
    362         $content = apply_filters( 'bp_activity_post_comment_content', $_POST['ac_input_' . $activity_id] ); 
    363  
    364         if ( empty( $content ) ) { 
    365                 bp_core_add_message( __( 'Please do not leave the comment area blank.', 'buddypress' ), 'error' ); 
    366                 bp_core_redirect( wp_get_referer() . '#ac-form-' . $activity_id ); 
     131        if ( ! is_user_logged_in() || ! bp_is_activity_component() || ! bp_is_current_action( 'reply' ) ) { 
     132                return; 
    367133        } 
    368134 
    369         $comment_id = bp_activity_new_comment( array( 
    370                 'content'     => $content, 
    371                 'activity_id' => $activity_id, 
    372                 'parent_id'   => false 
    373         )); 
    374  
    375         if ( !empty( $comment_id ) ) 
    376                 bp_core_add_message( __( 'Reply Posted!', 'buddypress' ) ); 
    377         else 
    378                 bp_core_add_message( __( 'There was an error posting that reply. Please try again.', 'buddypress' ), 'error' ); 
    379  
    380         bp_core_redirect( wp_get_referer() . '#ac-form-' . $activity_id ); 
     135        new BP_Activity_Action_Post_Comment; 
    381136} 
    382137add_action( 'bp_actions', 'bp_activity_action_post_comment' ); 
    383138 
     
    385140 * Mark activity as favorite. 
    386141 * 
    387142 * @since 1.2.0 
    388  * 
    389  * @return bool False on failure. 
    390143 */ 
    391144function bp_activity_action_mark_favorite() { 
     145        if ( ! is_user_logged_in() || ! bp_is_activity_component() || ! bp_is_current_action( 'favorite' ) ) { 
     146                return; 
     147        } 
    392148 
    393         if ( !is_user_logged_in() || !bp_is_activity_component() || !bp_is_current_action( 'favorite' ) ) 
    394                 return false; 
    395  
    396         // Check the nonce. 
    397         check_admin_referer( 'mark_favorite' ); 
    398  
    399         if ( bp_activity_add_user_favorite( bp_action_variable( 0 ) ) ) 
    400                 bp_core_add_message( __( 'Activity marked as favorite.', 'buddypress' ) ); 
    401         else 
    402                 bp_core_add_message( __( 'There was an error marking that activity as a favorite. Please try again.', 'buddypress' ), 'error' ); 
    403  
    404         bp_core_redirect( wp_get_referer() . '#activity-' . bp_action_variable( 0 ) ); 
     149        new BP_Activity_Action_Favorite; 
    405150} 
    406151add_action( 'bp_actions', 'bp_activity_action_mark_favorite' ); 
    407152 
     
    413158 * @return bool False on failure. 
    414159 */ 
    415160function bp_activity_action_remove_favorite() { 
    416  
    417         if ( ! is_user_logged_in() || ! bp_is_activity_component() || ! bp_is_current_action( 'unfavorite' ) ) 
    418                 return false; 
    419  
    420         // Check the nonce. 
    421         check_admin_referer( 'unmark_favorite' ); 
    422  
    423         if ( bp_activity_remove_user_favorite( bp_action_variable( 0 ) ) ) 
    424                 bp_core_add_message( __( 'Activity removed as favorite.', 'buddypress' ) ); 
    425         else 
    426                 bp_core_add_message( __( 'There was an error removing that activity as a favorite. Please try again.', 'buddypress' ), 'error' ); 
    427  
    428         bp_core_redirect( wp_get_referer() . '#activity-' . bp_action_variable( 0 ) ); 
    429 } 
    430 add_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; 
     161        if ( ! is_user_logged_in() || ! bp_is_activity_component() || ! bp_is_current_action( 'unfavorite' ) ) { 
     162                return; 
    587163        } 
    588164 
    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         ) ); 
     165        new BP_Activity_Action_Unfavorite; 
    604166} 
    605 add_action( 'bp_actions', 'bp_activity_action_favorites_feed' ); 
     167add_action( 'bp_actions', 'bp_activity_action_remove_favorite' ); 
    606168 
    607169/** 
    608170 * AJAX endpoint for Suggestions API lookups. 
    609171 * 
    610172 * @since 2.1.0 
     173 * 
     174 * @todo This should be moved out of Activity and into Core or Members. 
    611175 */ 
    612176function 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 ); 
     177        new BP_Core_Ajax_Get_Suggestions; 
    636178} 
    637179add_action( 'wp_ajax_bp_get_suggestions', 'bp_ajax_get_suggestions' ); 
    638180 
     
    648190 * @param object $post       Post data. 
    649191 */ 
    650192function 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         } 
     193        new BP_Activity_Transition_Post_Status( $post, $new_status, $old_status ); 
    728194} 
    729195add_action( 'transition_post_status', 'bp_activity_catch_transition_post_type_status', 10, 3 ); 
    730196 
     
    738204 * @param WP_Comment $comment Comment data. 
    739205 */ 
    740206function 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 ); 
     207        new BP_Activity_Transition_Comment_status( $comment, $new_status, $old_status ); 
    853208} 
    854209add_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 * @since 2.9.0 
     7 */ 
     8 
     9/** 
     10 * Load the sitewide activity feed. 
     11 * 
     12 * @since 1.0.0 
     13 */ 
     14function bp_activity_action_sitewide_feed() { 
     15        if ( ! bp_is_activity_component() || ! bp_is_current_action( 'feed' ) || bp_is_user() || ! empty( buddypress()->groups->current_group ) ) { 
     16                return; 
     17        } 
     18 
     19        new BP_Activity_Action_Feed_Sitewide; 
     20} 
     21add_action( 'bp_actions', 'bp_activity_action_sitewide_feed' ); 
     22 
     23/** 
     24 * Load a user's personal activity feed. 
     25 * 
     26 * @since 1.0.0 
     27 */ 
     28function bp_activity_action_personal_feed() { 
     29        if ( ! bp_is_user_activity() || ! bp_is_current_action( 'feed' ) ) { 
     30                return; 
     31        } 
     32 
     33        new BP_Activity_Action_Feed_Personal; 
     34} 
     35add_action( 'bp_actions', 'bp_activity_action_personal_feed' ); 
     36 
     37/** 
     38 * Load a user's friends' activity feed. 
     39 * 
     40 * @since 1.0.0 
     41 * 
     42 * @return bool False on failure. 
     43 */ 
     44function bp_activity_action_friends_feed() { 
     45        if ( ! bp_is_active( 'friends' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_friends_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     46                return; 
     47        } 
     48 
     49        new BP_Activity_Action_Feed_Friends; 
     50} 
     51add_action( 'bp_actions', 'bp_activity_action_friends_feed' ); 
     52 
     53/** 
     54 * Load the activity feed for a user's groups. 
     55 * 
     56 * @since 1.2.0 
     57 */ 
     58function bp_activity_action_my_groups_feed() { 
     59        if ( ! bp_is_active( 'groups' ) || ! bp_is_user_activity() || ! bp_is_current_action( bp_get_groups_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     60                return; 
     61        } 
     62 
     63        new BP_Activity_Action_Feed_Groups; 
     64} 
     65add_action( 'bp_actions', 'bp_activity_action_my_groups_feed' ); 
     66 
     67/** 
     68 * Load a user's @mentions feed. 
     69 * 
     70 * @since 1.2.0 
     71 */ 
     72function bp_activity_action_mentions_feed() { 
     73        if ( ! bp_activity_do_mentions() || ! bp_is_user_activity() || ! bp_is_current_action( 'mentions' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     74                return; 
     75        } 
     76 
     77        new BP_Activity_Action_Feed_Mentions; 
     78} 
     79add_action( 'bp_actions', 'bp_activity_action_mentions_feed' ); 
     80 
     81/** 
     82 * Load a user's favorites feed. 
     83 * 
     84 * @since 1.2.0 
     85 */ 
     86function bp_activity_action_favorites_feed() { 
     87        if ( ! bp_is_user_activity() || ! bp_is_current_action( 'favorites' ) || ! bp_is_action_variable( 'feed', 0 ) ) { 
     88                return; 
     89        } 
     90 
     91        new BP_Activity_Action_Feed_Favorites; 
     92} 
     93add_action( 'bp_actions', 'bp_activity_action_favorites_feed' ); 
     94 No newline at end of file 
  • src/bp-activity/bp-activity-screens.php

     
    2121 * 
    2222 */ 
    2323function bp_activity_screen_index() { 
    24         if ( bp_is_activity_directory() ) { 
    25                 bp_update_is_directory( true, 'activity' ); 
     24        if ( ! bp_is_activity_directory() ) { 
     25                return; 
     26        } 
    2627 
    27                 /** 
    28                  * Fires right before the loading of the Activity directory screen template file. 
    29                  * 
    30                  * @since 1.5.0 
    31                  */ 
    32                 do_action( 'bp_activity_screen_index' ); 
     28        bp_update_is_directory( true, 'activity' ); 
    3329 
    34                 /** 
    35                  * Filters the template to load for the Activity directory screen. 
    36                  * 
    37                  * @since 1.5.0 
    38                  * 
    39                  * @param string $template Path to the activity template to load. 
    40                  */ 
    41                 bp_core_load_template( apply_filters( 'bp_activity_screen_index', 'activity/index' ) ); 
    42         } 
     30        /** 
     31         * Fires right before the loading of the Activity directory screen template file. 
     32         * 
     33         * @since 1.5.0 
     34         */ 
     35        do_action( 'bp_activity_screen_index' ); 
     36 
     37        /** 
     38         * Filters the template to load for the Activity directory screen. 
     39         * 
     40         * @since 1.5.0 
     41         * 
     42         * @param string $template Path to the activity template to load. 
     43         */ 
     44        bp_core_load_template( apply_filters( 'bp_activity_screen_index', 'activity/index' ) ); 
    4345} 
    4446add_action( 'bp_screens', 'bp_activity_screen_index' ); 
    4547 
     
    5052 * 
    5153 */ 
    5254function bp_activity_screen_my_activity() { 
    53  
    5455        /** 
    5556         * Fires right before the loading of the "My Activity" screen template file. 
    5657         * 
     
    7576 * 
    7677 */ 
    7778function bp_activity_screen_friends() { 
    78         if ( !bp_is_active( 'friends' ) ) 
    79                 return false; 
     79        if ( ! bp_is_active( 'friends' ) ) { 
     80                return; 
     81        } 
    8082 
    8183        bp_update_is_item_admin( bp_current_user_can( 'bp_moderate' ), 'activity' ); 
    8284 
     
    104106 * 
    105107 */ 
    106108function bp_activity_screen_groups() { 
    107         if ( !bp_is_active( 'groups' ) ) 
    108                 return false; 
     109        if ( ! bp_is_active( 'groups' ) ) { 
     110                return; 
     111        } 
    109112 
    110113        bp_update_is_item_admin( bp_current_user_can( 'bp_moderate' ), 'activity' ); 
    111114 
     
    185188 * 
    186189 */ 
    187190function bp_activity_reset_my_new_mentions() { 
    188         if ( bp_is_my_profile() ) 
     191        if ( bp_is_my_profile() ) { 
    189192                bp_activity_clear_new_mentions( bp_loggedin_user_id() ); 
     193        } 
    190194} 
    191195add_action( 'bp_activity_screen_mentions', 'bp_activity_reset_my_new_mentions' ); 
    192196 
     
    194198 * Load the page for a single activity item. 
    195199 * 
    196200 * @since 1.2.0 
    197  * 
    198201 */ 
    199202function bp_activity_screen_single_activity_permalink() { 
    200         $bp = buddypress(); 
    201  
    202         // No displayed user or not viewing activity component. 
    203         if ( !bp_is_activity_component() ) 
    204                 return false; 
    205  
    206         if ( ! bp_current_action() || !is_numeric( bp_current_action() ) ) 
    207                 return false; 
    208  
    209         // Get the activity details. 
    210         $activity = bp_activity_get_specific( array( 'activity_ids' => bp_current_action(), 'show_hidden' => true, 'spam' => 'ham_only', ) ); 
    211  
    212         // 404 if activity does not exist 
    213         if ( empty( $activity['activities'][0] ) || bp_action_variables() ) { 
    214                 bp_do_404(); 
     203        // Not on an activity permalink page? Bail. 
     204        if ( ! bp_is_activity_component() || ! bp_current_action() || ! is_numeric( bp_current_action() ) ) { 
    215205                return; 
    216  
    217         } else { 
    218                 $activity = $activity['activities'][0]; 
    219         } 
    220  
    221         // Default access is true. 
    222         $has_access = true; 
    223  
    224         // If activity is from a group, do an extra cap check. 
    225         if ( isset( $bp->groups->id ) && $activity->component == $bp->groups->id ) { 
    226  
    227                 // Activity is from a group, but groups is currently disabled. 
    228                 if ( !bp_is_active( 'groups') ) { 
    229                         bp_do_404(); 
    230                         return; 
    231                 } 
    232  
    233                 // Check to see if the group is not public, if so, check the 
    234                 // user has access to see this activity. 
    235                 if ( $group = groups_get_group( $activity->item_id ) ) { 
    236  
    237                         // Group is not public. 
    238                         if ( 'public' != $group->status ) { 
    239  
    240                                 // User is not a member of group. 
    241                                 if ( !groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) { 
    242                                         $has_access = false; 
    243                                 } 
    244                         } 
    245                 } 
    246         } 
    247  
    248         // If activity author does not match displayed user, block access. 
    249         if ( true === $has_access && bp_displayed_user_id() !== $activity->user_id ) { 
    250                 $has_access = false; 
    251         } 
    252  
    253         /** 
    254          * Filters the access permission for a single activity view. 
    255          * 
    256          * @since 1.2.0 
    257          * 
    258          * @param array $access Array holding the current $has_access value and current activity item instance. 
    259          */ 
    260         $has_access = apply_filters_ref_array( 'bp_activity_permalink_access', array( $has_access, &$activity ) ); 
    261  
    262         /** 
    263          * Fires before the loading of a single activity template file. 
    264          * 
    265          * @since 1.2.0 
    266          * 
    267          * @param BP_Activity_Activity $activity   Object representing the current activity item being displayed. 
    268          * @param bool                 $has_access Whether or not the current user has access to view activity. 
    269          */ 
    270         do_action( 'bp_activity_screen_single_activity_permalink', $activity, $has_access ); 
    271  
    272         // Access is specifically disallowed. 
    273         if ( false === $has_access ) { 
    274  
    275                 // User feedback. 
    276                 bp_core_add_message( __( 'You do not have access to this activity.', 'buddypress' ), 'error' ); 
    277  
    278                 // Redirect based on logged in status. 
    279                 if ( is_user_logged_in() ) { 
    280                         $url = bp_loggedin_user_domain(); 
    281  
    282                 } else { 
    283                         $url = sprintf( 
    284                                 site_url( 'wp-login.php?redirect_to=%s' ), 
    285                                 urlencode( esc_url_raw( bp_activity_get_permalink( bp_current_action() ) ) ) 
    286                         ); 
    287                 } 
    288  
    289                 bp_core_redirect( $url ); 
    290206        } 
    291207 
    292         /** 
    293          * Filters the template to load for a single activity screen. 
    294          * 
    295          * @since 1.0.0 
    296          * 
    297          * @param string $template Path to the activity template to load. 
    298          */ 
    299         bp_core_load_template( apply_filters( 'bp_activity_template_profile_activity_permalink', 'members/single/activity/permalink' ) ); 
     208        new BP_Activity_Screen_Permalink; 
    300209} 
    301210add_action( 'bp_screens', 'bp_activity_screen_single_activity_permalink' ); 
    302211 
     
    304213 * Add activity notifications settings to the notifications settings page. 
    305214 * 
    306215 * @since 1.2.0 
    307  * 
    308216 */ 
    309217function 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 
     218        new BP_Activity_Screen_User_Settings_Notifications; 
    374219} 
    375220add_action( 'bp_notification_settings', 'bp_activity_screen_notification_settings', 1 ); 
    376221 
  • new file src/bp-activity/classes/class-bp-activity-action-delete.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Delete specific activity item and redirect to previous page. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_delete_activity() 
     18 */ 
     19class BP_Activity_Action_Delete { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         * 
     25         * @param int $activity_id The activity ID. 
     26         */ 
     27        public function __construct( $activity_id = 0 ) { 
     28                // Check the nonce. 
     29                check_admin_referer( 'bp_activity_delete_link' ); 
     30         
     31                // Load up the activity item. 
     32                $activity = new BP_Activity_Activity( $activity_id ); 
     33         
     34                // Check access. 
     35                if ( ! bp_activity_user_can_delete( $activity ) ) { 
     36                        return false; 
     37                } 
     38         
     39                /** 
     40                 * Fires before the deletion so plugins can still fetch information about it. 
     41                 * 
     42                 * @since 1.5.0 
     43                 * 
     44                 * @param int $activity_id The activity ID. 
     45                 * @param int $user_id     The user associated with the activity. 
     46                 */ 
     47                do_action( 'bp_activity_before_action_delete_activity', $activity_id, $activity->user_id ); 
     48         
     49                // Delete the activity item and provide user feedback. 
     50                if ( bp_activity_delete( array( 'id' => $activity_id, 'user_id' => $activity->user_id ) ) ) { 
     51                        bp_core_add_message( __( 'Activity deleted successfully', 'buddypress' ) ); 
     52                } else { 
     53                        bp_core_add_message( __( 'There was an error when deleting that activity', 'buddypress' ), 'error' ); 
     54                } 
     55         
     56                /** 
     57                 * Fires after the deletion so plugins can act afterwards based on the activity. 
     58                 * 
     59                 * @since 1.1.0 
     60                 * 
     61                 * @param int $activity_id The activity ID. 
     62                 * @param int $user_id     The user associated with the activity. 
     63                 */ 
     64                do_action( 'bp_activity_action_delete_activity', $activity_id, $activity->user_id ); 
     65         
     66                // Check for the redirect query arg, otherwise let WP handle things. 
     67                if ( ! empty( $_GET['redirect_to'] ) ) { 
     68                        bp_core_redirect( esc_url( $_GET['redirect_to'] ) ); 
     69                } else { 
     70                        bp_core_redirect( wp_get_referer() ); 
     71                } 
     72        } 
     73} 
     74 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-favorite.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Mark activity as favorite. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_mark_favorite() 
     18 */ 
     19class BP_Activity_Action_Favorite { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Check the nonce. 
     27                check_admin_referer( 'mark_favorite' ); 
     28 
     29                if ( bp_activity_add_user_favorite( bp_action_variable( 0 ) ) ) { 
     30                        bp_core_add_message( __( 'Activity marked as favorite.', 'buddypress' ) ); 
     31                } else { 
     32                        bp_core_add_message( __( 'There was an error marking that activity as a favorite. Please try again.', 'buddypress' ), 'error' ); 
     33                } 
     34 
     35                bp_core_redirect( wp_get_referer() . '#activity-' . bp_action_variable( 0 ) ); 
     36        } 
     37} 
     38 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-favorites.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * User's favorites RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_favorites_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Favorites { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Get displayed user's favorite activity IDs. 
     27                $favs = bp_activity_get_user_favorites( bp_displayed_user_id() ); 
     28                $fav_ids = implode( ',', (array) $favs ); 
     29 
     30                // Setup the feed. 
     31                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     32                        'id'            => 'favorites', 
     33 
     34                        /* translators: User activity favorites RSS title - "[Site Name] | [User Display Name] | Favorites" */ 
     35                        'title'         => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     36 
     37                        'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/', 
     38                        'description'   => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     39                        'activity_args' => 'include=' . $fav_ids 
     40                ) ); 
     41        } 
     42} 
     43 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-friends.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * User's friend RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_friends_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Friends { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Setup the feed. 
     27                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     28                        'id'            => 'friends', 
     29 
     30                        /* translators: Friends activity RSS title - "[Site Name] | [User Display Name] | Friends Activity" */ 
     31                        'title'         => sprintf( __( '%1$s | %2$s | Friends Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     32 
     33                        'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() ), 
     34                        'description'   => sprintf( __( "Activity feed for %s's friends.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     35                        'activity_args' => 'scope=friends' 
     36                ) ); 
     37        } 
     38} 
     39 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-groups.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * User's public group RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_groups_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Groups { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Get displayed user's group IDs. 
     27                $groups    = groups_get_user_groups(); 
     28                $group_ids = implode( ',', $groups['groups'] ); 
     29 
     30                // Setup the feed. 
     31                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     32                        'id'            => 'mygroups', 
     33 
     34                        /* translators: Member groups activity RSS title - "[Site Name] | [User Display Name] | Groups Activity" */ 
     35                        'title'         => sprintf( __( '%1$s | %2$s | Group Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     36 
     37                        'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() ), 
     38                        'description'   => sprintf( __( "Public group activity feed of which %s is a member.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     39                        'activity_args' => array( 
     40                                'object'           => buddypress()->groups->id, 
     41                                'primary_id'       => $group_ids, 
     42                                'display_comments' => 'threaded' 
     43                        ) 
     44                ) ); 
     45        } 
     46} 
     47 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-mentions.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * User's mentions RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_mentions_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Mentions { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Setup the feed. 
     27                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     28                        'id'            => 'mentions', 
     29 
     30                        /* translators: User mentions activity RSS title - "[Site Name] | [User Display Name] | Mentions" */ 
     31                        'title'         => sprintf( __( '%1$s | %2$s | Mentions', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     32 
     33                        'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/', 
     34                        'description'   => sprintf( __( "Activity feed mentioning %s.", 'buddypress' ), bp_get_displayed_user_fullname() ), 
     35                        'activity_args' => array( 
     36                                'search_terms' => '@' . bp_core_get_username( bp_displayed_user_id() ) 
     37                        ) 
     38                ) ); 
     39        } 
     40} 
     41 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-personal.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * User's personal RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_personal_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Personal { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Setup the feed. 
     27                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     28                        'id'            => 'personal', 
     29 
     30                        /* translators: Personal activity RSS title - "[Site Name] | [User Display Name] | Activity" */ 
     31                        'title'         => sprintf( __( '%1$s | %2$s | Activity', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ), 
     32 
     33                        'link'          => trailingslashit( bp_displayed_user_domain() . bp_get_activity_slug() ), 
     34                        'description'   => sprintf( __( 'Activity feed for %s.', 'buddypress' ), bp_get_displayed_user_fullname() ), 
     35                        'activity_args' => 'user_id=' . bp_displayed_user_id() 
     36                ) ); 
     37        } 
     38} 
     39 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-feed-sitewide.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Sitewide RSS feed loader. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_sitewide_feed() 
     18 */ 
     19class BP_Activity_Action_Feed_Sitewide { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Setup the feed. 
     27                buddypress()->activity->feed = new BP_Activity_Feed( array( 
     28                        'id'            => 'sitewide', 
     29 
     30                        /* translators: Sitewide activity RSS title - "[Site Name] | Site Wide Activity" */ 
     31                        'title'         => sprintf( __( '%s | Site-Wide Activity', 'buddypress' ), bp_get_site_name() ), 
     32 
     33                        'link'          => bp_get_activity_directory_permalink(), 
     34                        'description'   => __( 'Activity feed for the entire site.', 'buddypress' ), 
     35                        'activity_args' => 'display_comments=threaded' 
     36                ) ); 
     37        } 
     38} 
     39 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-permalink-router.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Catch and route requests for single activity item permalinks. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_permalink_router() 
     18 */ 
     19class BP_Activity_Action_Permalink_Router { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Get the activity details. 
     27                $activity = bp_activity_get_specific( array( 'activity_ids' => bp_action_variable( 0 ), 'show_hidden' => true ) ); 
     28 
     29                // 404 if activity does not exist 
     30                if ( empty( $activity['activities'][0] ) ) { 
     31                        bp_do_404(); 
     32                        return; 
     33                } else { 
     34                        $activity = $activity['activities'][0]; 
     35                } 
     36 
     37                // Do not redirect at default. 
     38                $redirect = false; 
     39 
     40                // Redirect based on the type of activity. 
     41                if ( bp_is_active( 'groups' ) && $activity->component == buddypress()->groups->id ) { 
     42 
     43                        // Activity is a user update. 
     44                        if ( ! empty( $activity->user_id ) ) { 
     45                                $redirect = bp_core_get_user_domain( $activity->user_id, $activity->user_nicename, $activity->user_login ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
     46 
     47                        // Activity is something else. 
     48                        } else { 
     49 
     50                                // Set redirect to group activity stream. 
     51                                if ( $group = groups_get_group( $activity->item_id ) ) { 
     52                                        $redirect = bp_get_group_permalink( $group ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
     53                                } 
     54                        } 
     55 
     56                // Set redirect to users' activity stream. 
     57                } elseif ( ! empty( $activity->user_id ) ) { 
     58                        $redirect = bp_core_get_user_domain( $activity->user_id, $activity->user_nicename, $activity->user_login ) . bp_get_activity_slug() . '/' . $activity->id . '/'; 
     59                } 
     60 
     61                // If set, add the original query string back onto the redirect URL. 
     62                if ( ! empty( $_SERVER['QUERY_STRING'] ) ) { 
     63                        $query_frags = array(); 
     64                        wp_parse_str( $_SERVER['QUERY_STRING'], $query_frags ); 
     65                        $redirect = add_query_arg( urlencode_deep( $query_frags ), $redirect ); 
     66                } 
     67 
     68                /** 
     69                 * Filter the intended redirect url before the redirect occurs for the single activity item. 
     70                 * 
     71                 * @since 1.2.2 
     72                 * 
     73                 * @param array $value Array with url to redirect to and activity related to the redirect. 
     74                 */ 
     75                if ( ! $redirect = apply_filters_ref_array( 'bp_activity_permalink_redirect_url', array( $redirect, &$activity ) ) ) { 
     76                        bp_core_redirect( bp_get_root_domain() ); 
     77                } 
     78 
     79                // Redirect to the actual activity permalink page. 
     80                bp_core_redirect( $redirect ); 
     81        } 
     82} 
     83 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-post-comment.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Post user/group activity update. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_post_comment() 
     18 */ 
     19class BP_Activity_Action_Post_Comment { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Check the nonce. 
     27                check_admin_referer( 'new_activity_comment', '_wpnonce_new_activity_comment' ); 
     28         
     29                /** 
     30                 * Filters the activity ID a comment will be in reply to. 
     31                 * 
     32                 * @since 1.2.0 
     33                 * 
     34                 * @param string $value ID of the activity being replied to. 
     35                 */ 
     36                $activity_id = apply_filters( 'bp_activity_post_comment_activity_id', $_POST['comment_form_id'] ); 
     37         
     38                /** 
     39                 * Filters the comment content for a comment reply. 
     40                 * 
     41                 * @since 1.2.0 
     42                 * 
     43                 * @param string $value Comment content being posted. 
     44                 */ 
     45                $content = apply_filters( 'bp_activity_post_comment_content', $_POST['ac_input_' . $activity_id] ); 
     46         
     47                if ( empty( $content ) ) { 
     48                        bp_core_add_message( __( 'Please do not leave the comment area blank.', 'buddypress' ), 'error' ); 
     49                        bp_core_redirect( wp_get_referer() . '#ac-form-' . $activity_id ); 
     50                } 
     51         
     52                $comment_id = bp_activity_new_comment( array( 
     53                        'content'     => $content, 
     54                        'activity_id' => $activity_id, 
     55                        'parent_id'   => false 
     56                )); 
     57         
     58                if ( ! empty( $comment_id ) ) { 
     59                        bp_core_add_message( __( 'Reply Posted!', 'buddypress' ) ); 
     60                } else { 
     61                        bp_core_add_message( __( 'There was an error posting that reply. Please try again.', 'buddypress' ), 'error' ); 
     62                } 
     63         
     64                bp_core_redirect( wp_get_referer() . '#ac-form-' . $activity_id ); 
     65        } 
     66} 
     67 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-post-update.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Post user/group activity update. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_post_update() 
     18 */ 
     19class BP_Activity_Action_Post_Update { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Check the nonce. 
     27                check_admin_referer( 'post_update', '_wpnonce_post_update' ); 
     28         
     29                /** 
     30                 * Filters the content provided in the activity input field. 
     31                 * 
     32                 * @since 1.2.0 
     33                 * 
     34                 * @param string $value Activity message being posted. 
     35                 */ 
     36                $content = apply_filters( 'bp_activity_post_update_content', $_POST['whats-new'] ); 
     37         
     38                if ( ! empty( $_POST['whats-new-post-object'] ) ) { 
     39         
     40                        /** 
     41                         * Filters the item type that the activity update should be associated with. 
     42                         * 
     43                         * @since 1.2.0 
     44                         * 
     45                         * @param string $value Item type to associate with. 
     46                         */ 
     47                        $object = apply_filters( 'bp_activity_post_update_object', $_POST['whats-new-post-object'] ); 
     48                } 
     49         
     50                if ( ! empty( $_POST['whats-new-post-in'] ) ) { 
     51         
     52                        /** 
     53                         * Filters what component the activity is being to. 
     54                         * 
     55                         * @since 1.2.0 
     56                         * 
     57                         * @param string $value Chosen component to post activity to. 
     58                         */ 
     59                        $item_id = apply_filters( 'bp_activity_post_update_item_id', $_POST['whats-new-post-in'] ); 
     60                } 
     61         
     62                // No activity content so provide feedback and redirect. 
     63                if ( empty( $content ) ) { 
     64                        bp_core_add_message( __( 'Please enter some content to post.', 'buddypress' ), 'error' ); 
     65                        bp_core_redirect( wp_get_referer() ); 
     66                } 
     67         
     68                // No existing item_id. 
     69                if ( empty( $item_id ) ) { 
     70                        $activity_id = bp_activity_post_update( array( 'content' => $content ) ); 
     71         
     72                // Post to groups object. 
     73                } elseif ( 'groups' == $object && bp_is_active( 'groups' ) ) { 
     74                        if ( (int) $item_id ) { 
     75                                $activity_id = groups_post_update( array( 'content' => $content, 'group_id' => $item_id ) ); 
     76                        } 
     77         
     78                } else { 
     79         
     80                        /** 
     81                         * Filters activity object for BuddyPress core and plugin authors before posting activity update. 
     82                         * 
     83                         * @since 1.2.0 
     84                         * 
     85                         * @param string $object  Activity item being associated to. 
     86                         * @param string $item_id Component ID being posted to. 
     87                         * @param string $content Activity content being posted. 
     88                         */ 
     89                        $activity_id = apply_filters( 'bp_activity_custom_update', $object, $item_id, $content ); 
     90                } 
     91         
     92                // Provide user feedback. 
     93                if ( ! empty( $activity_id ) ) { 
     94                        bp_core_add_message( __( 'Update Posted!', 'buddypress' ) ); 
     95                } else { 
     96                        bp_core_add_message( __( 'There was an error when posting your update. Please try again.', 'buddypress' ), 'error' ); 
     97                } 
     98         
     99                // Redirect. 
     100                bp_core_redirect( wp_get_referer() ); 
     101        } 
     102} 
     103 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-spam.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Mark specific activity item as spam and redirect to previous page. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_spam_activity() 
     18 */ 
     19class BP_Activity_Action_Spam { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         * 
     25         * @param int $activity_id The activity ID. 
     26         */ 
     27        public function __construct( $activity_id = 0 ) { 
     28                // Is the current user allowed to spam items? 
     29                if ( ! bp_activity_user_can_mark_spam() ) { 
     30                        return false; 
     31                } 
     32 
     33                // Load up the activity item. 
     34                $activity = new BP_Activity_Activity( $activity_id ); 
     35                if ( empty( $activity->id ) ) { 
     36                        return false; 
     37                } 
     38 
     39                // Check nonce. 
     40                check_admin_referer( 'bp_activity_akismet_spam_' . $activity->id ); 
     41 
     42                /** 
     43                 * Fires before the marking activity as spam so plugins can modify things if they want to. 
     44                 * 
     45                 * @since 1.6.0 
     46                 * 
     47                 * @param int    $activity_id Activity ID to be marked as spam. 
     48                 * @param object $activity    Activity object for the ID to be marked as spam. 
     49                 */ 
     50                do_action( 'bp_activity_before_action_spam_activity', $activity->id, $activity ); 
     51 
     52                // Mark as spam. 
     53                bp_activity_mark_as_spam( $activity ); 
     54                $activity->save(); 
     55 
     56                // Tell the user the spamming has been successful. 
     57                bp_core_add_message( __( 'The activity item has been marked as spam and is no longer visible.', 'buddypress' ) ); 
     58 
     59                /** 
     60                 * Fires after the marking activity as spam so plugins can act afterwards based on the activity. 
     61                 * 
     62                 * @since 1.6.0 
     63                 * 
     64                 * @param int $activity_id Activity ID that was marked as spam. 
     65                 * @param int $user_id     User ID associated with activity. 
     66                 */ 
     67                do_action( 'bp_activity_action_spam_activity', $activity_id, $activity->user_id ); 
     68 
     69                // Check for the redirect query arg, otherwise let WP handle things. 
     70                if ( ! empty( $_GET['redirect_to'] ) ) { 
     71                        bp_core_redirect( esc_url( $_GET['redirect_to'] ) ); 
     72                } else { 
     73                        bp_core_redirect( wp_get_referer() ); 
     74                } 
     75        } 
     76} 
     77 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-action-unfavorite.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Unfavorite activity items. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_action_remove_favorite() 
     18 */ 
     19class BP_Activity_Action_Unfavorite { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Check the nonce. 
     27                check_admin_referer( 'unmark_favorite' ); 
     28 
     29                if ( bp_activity_remove_user_favorite( bp_action_variable( 0 ) ) ) { 
     30                        bp_core_add_message( __( 'Activity removed as favorite.', 'buddypress' ) ); 
     31                } else { 
     32                        bp_core_add_message( __( 'There was an error removing that activity as a favorite. Please try again.', 'buddypress' ), 'error' ); 
     33                } 
     34 
     35                bp_core_redirect( wp_get_referer() . '#activity-' . bp_action_variable( 0 ) ); 
     36        } 
     37} 
     38 No newline at end of file 
  • src/bp-activity/classes/class-bp-activity-component.php

     
    8686        } 
    8787 
    8888        /** 
     89         * Late includes. 
     90         * 
     91         * @since 2.9.0 
     92         */ 
     93        public function late_includes() { 
     94                // RSS feeds. 
     95                if ( bp_is_current_action( 'feed' ) || bp_is_action_variable( 'feed', 0 ) ) {  
     96                        require $this->path . 'bp-activity/bp-activity-feeds.php';  
     97                } 
     98        } 
     99 
     100        /** 
    89101         * Set up component global variables. 
    90102         * 
    91103         * The BP_ACTIVITY_SLUG constant is deprecated, and only used here for 
  • new file src/bp-activity/classes/class-bp-activity-screen-permalink.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Screen handler for activity permalinks. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_screen_single_activity_permalink() 
     18 */ 
     19class BP_Activity_Screen_Permalink { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         */ 
     25        public function __construct() { 
     26                // Get the activity details. 
     27                $activity = bp_activity_get_specific( array( 'activity_ids' => bp_current_action(), 'show_hidden' => true, 'spam' => 'ham_only', ) ); 
     28 
     29                // 404 if activity does not exist 
     30                if ( empty( $activity['activities'][0] ) || bp_action_variables() ) { 
     31                        bp_do_404(); 
     32                        return; 
     33 
     34                } else { 
     35                        $activity = $activity['activities'][0]; 
     36                } 
     37 
     38                // Default access is true. 
     39                $has_access = true; 
     40 
     41                // If activity is from a group, do an extra cap check. 
     42                if ( isset( buddypress()->groups->id ) && $activity->component == buddypress()->groups->id ) { 
     43                        // Activity is from a group, but groups is currently disabled. 
     44                        if ( ! bp_is_active( 'groups') ) { 
     45                                bp_do_404(); 
     46                                return; 
     47                        } 
     48 
     49                        // Check to see if the group is not public, if so, check the 
     50                        // user has access to see this activity. 
     51                        if ( $group = groups_get_group( $activity->item_id ) ) { 
     52 
     53                                // Group is not public. 
     54                                if ( 'public' != $group->status ) { 
     55 
     56                                        // User is not a member of group. 
     57                                        if ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) { 
     58                                                $has_access = false; 
     59                                        } 
     60                                } 
     61                        } 
     62                } 
     63 
     64                // If activity author does not match displayed user, block access. 
     65                if ( true === $has_access && bp_displayed_user_id() !== $activity->user_id ) { 
     66                        $has_access = false; 
     67                } 
     68 
     69                /** 
     70                 * Filters the access permission for a single activity view. 
     71                 * 
     72                 * @since 1.2.0 
     73                 * 
     74                 * @param array $access Array holding the current $has_access value and current activity item instance. 
     75                 */ 
     76                $has_access = apply_filters_ref_array( 'bp_activity_permalink_access', array( $has_access, &$activity ) ); 
     77 
     78                /** 
     79                 * Fires before the loading of a single activity template file. 
     80                 * 
     81                 * @since 1.2.0 
     82                 * 
     83                 * @param BP_Activity_Activity $activity   Object representing the current activity item being displayed. 
     84                 * @param bool                 $has_access Whether or not the current user has access to view activity. 
     85                 */ 
     86                do_action( 'bp_activity_screen_single_activity_permalink', $activity, $has_access ); 
     87 
     88                // Access is specifically disallowed. 
     89                if ( false === $has_access ) { 
     90                        // User feedback. 
     91                        bp_core_add_message( __( 'You do not have access to this activity.', 'buddypress' ), 'error' ); 
     92 
     93                        // Redirect based on logged in status. 
     94                        if ( is_user_logged_in() ) { 
     95                                $url = bp_loggedin_user_domain(); 
     96 
     97                        } else { 
     98                                $url = sprintf( 
     99                                        site_url( 'wp-login.php?redirect_to=%s' ), 
     100                                        urlencode( esc_url_raw( bp_activity_get_permalink( bp_current_action() ) ) ) 
     101                                ); 
     102                        } 
     103 
     104                        bp_core_redirect( $url ); 
     105                } 
     106 
     107                /** 
     108                 * Filters the template to load for a single activity screen. 
     109                 * 
     110                 * @since 1.0.0 
     111                 * 
     112                 * @param string $template Path to the activity template to load. 
     113                 */ 
     114                bp_core_load_template( apply_filters( 'bp_activity_template_profile_activity_permalink', 'members/single/activity/permalink' ) ); 
     115        } 
     116} 
     117 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-screen-user-settings-notifications.php

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

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Comment status handler for BuddyPress activity items. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_transition_post_type_comment_status() 
     18 */ 
     19class BP_Activity_Transition_Comment_Status { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         * 
     25         * @param WP_Comment $comment    Comment data. 
     26         * @param string     $new_status New comment status. 
     27         * @param string     $old_status Previous comment status. 
     28         */ 
     29        public function __construct( $comment, $new_status, $old_status ) { 
     30                $post_type = get_post_type( $comment->comment_post_ID ); 
     31                if ( ! $post_type ) { 
     32                        return; 
     33                } 
     34 
     35                // Get the post type tracking args. 
     36                $activity_post_object = bp_activity_get_post_type_tracking_args( $post_type ); 
     37 
     38                // Bail if the activity type does not exist 
     39                if ( empty( $activity_post_object->comments_tracking->action_id ) ) { 
     40                        return false; 
     41 
     42                // Set the $activity_comment_object 
     43                } else { 
     44                        $activity_comment_object = $activity_post_object->comments_tracking; 
     45                } 
     46 
     47                // Init an empty activity ID 
     48                $activity_id = 0; 
     49 
     50                /** 
     51                 * Activity currently doesn't have any concept of a trash, or an unapproved/approved state. 
     52                 * 
     53                 * If a blog comment transitions to a "delete" or "hold" status, delete the activity item. 
     54                 * If a blog comment transitions to trashed, or spammed, mark the activity as spam. 
     55                 * If a blog comment transitions to approved (and the activity exists), mark the activity as ham. 
     56                 * If a blog comment transitions to unapproved (and the activity exists), mark the activity as spam. 
     57                 * Otherwise, record the comment into the activity stream. 
     58                 */ 
     59 
     60                // This clause handles delete/hold. 
     61                if ( in_array( $new_status, array( 'delete', 'hold' ) ) ) { 
     62                        return bp_activity_post_type_remove_comment( $comment->comment_ID, $activity_post_object ); 
     63 
     64                // These clauses handle trash, spam, and un-spams. 
     65                } elseif ( in_array( $new_status, array( 'trash', 'spam', 'unapproved' ) ) ) { 
     66                        $action = 'spam_activity'; 
     67                } elseif ( 'approved' == $new_status ) { 
     68                        $action = 'ham_activity'; 
     69                } 
     70 
     71                // Get the activity 
     72                if ( bp_disable_blogforum_comments() ) { 
     73                        $activity_id = bp_activity_get_activity_id( array( 
     74                                'component'         => $activity_comment_object->component_id, 
     75                                'item_id'           => get_current_blog_id(), 
     76                                'secondary_item_id' => $comment->comment_ID, 
     77                                'type'              => $activity_comment_object->action_id, 
     78                        ) ); 
     79                } else { 
     80                        $activity_id = get_comment_meta( $comment->comment_ID, 'bp_activity_comment_id', true ); 
     81                } 
     82 
     83                /** 
     84                 * Leave a chance to plugins to manage activity comments differently. 
     85                 * 
     86                 * @since  2.5.0 
     87                 * 
     88                 * @param bool        $value       True to override BuddyPress management. 
     89                 * @param string      $post_type   The post type name. 
     90                 * @param int         $activity_id The post type activity (0 if not found). 
     91                 * @param string      $new_status  The new status of the post type comment. 
     92                 * @param string      $old_status  The old status of the post type comment. 
     93                 * @param WP_Comment  $comment Comment data. 
     94                 */ 
     95                if ( true === apply_filters( 'bp_activity_pre_transition_post_type_comment_status', false, $post_type, $activity_id, $new_status, $old_status, $comment ) ) { 
     96                        return false; 
     97                } 
     98 
     99                // Check activity item exists 
     100                if ( empty( $activity_id ) ) { 
     101                        // If no activity exists, but the comment has been approved, record it into the activity table. 
     102                        if ( 'approved' == $new_status ) { 
     103                                return bp_activity_post_type_comment( $comment->comment_ID, true, $activity_post_object ); 
     104                        } 
     105 
     106                        return; 
     107                } 
     108 
     109                // Create an activity object 
     110                $activity = new BP_Activity_Activity( $activity_id ); 
     111                if ( empty( $activity->component ) ) { 
     112                        return; 
     113                } 
     114 
     115                // Spam/ham the activity if it's not already in that state 
     116                if ( 'spam_activity' === $action && ! $activity->is_spam ) { 
     117                        bp_activity_mark_as_spam( $activity ); 
     118                } elseif ( 'ham_activity' == $action) { 
     119                        bp_activity_mark_as_ham( $activity ); 
     120                } 
     121 
     122                // Add "new_post_type_comment" to the whitelisted activity types, so that the activity's Akismet history is generated 
     123                $post_type_comment_action = $activity_comment_object->action_id; 
     124                $comment_akismet_history = function ( $activity_types ) use ( $post_type_comment_action ) { 
     125                        $activity_types[] = $post_type_comment_action; 
     126 
     127                        return $activity_types; 
     128                }; 
     129                add_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
     130 
     131                // Make sure the activity change won't edit the comment if sync is on 
     132                remove_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
     133 
     134                // Save the updated activity 
     135                $activity->save(); 
     136 
     137                // Restore the action 
     138                add_action( 'bp_activity_before_save', 'bp_blogs_sync_activity_edit_to_post_comment', 20 ); 
     139 
     140                // Remove the "new_blog_comment" activity type whitelist so we don't break anything 
     141                remove_filter( 'bp_akismet_get_activity_types', $comment_akismet_history ); 
     142        } 
     143} 
     144 No newline at end of file 
  • new file src/bp-activity/classes/class-bp-activity-transition-post-status.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * Post type status handler for BuddyPress activity items. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see bp_activity_catch_transition_post_type_status() 
     18 */ 
     19class BP_Activity_Transition_Post_Status { 
     20        /** 
     21         * Constructor. 
     22         * 
     23         * @since 2.9.0 
     24         * 
     25         * @param object $post       Post data. 
     26         * @param string $new_status New status for the post. 
     27         * @param string $old_status Old status for the post. 
     28         */ 
     29        public function __construct( $post, $new_status, $old_status ) { 
     30                if ( ! post_type_supports( $post->post_type, 'buddypress-activity' ) ) { 
     31                        return; 
     32                } 
     33 
     34                // This is an edit. 
     35                if ( $new_status === $old_status ) { 
     36                        // An edit of an existing post should update the existing activity item. 
     37                        if ( $new_status == 'publish' ) { 
     38                                $edit = bp_activity_post_type_update( $post ); 
     39 
     40                                // Post was never recorded into activity stream, so record it now! 
     41                                if ( null === $edit ) { 
     42                                        bp_activity_post_type_publish( $post->ID, $post ); 
     43                                } 
     44 
     45                        // Allow plugins to eventually deal with other post statuses. 
     46                        } else { 
     47                                /** 
     48                                 * Fires when editing the post and the new status is not 'publish'. 
     49                                 * 
     50                                 * This is a variable filter that is dependent on the post type 
     51                                 * being untrashed. 
     52                                 * 
     53                                 * @since 2.5.0 
     54                                 * 
     55                                 * @param WP_Post $post Post data. 
     56                                 * @param string $new_status New status for the post. 
     57                                 * @param string $old_status Old status for the post. 
     58                                 */ 
     59                                do_action( 'bp_activity_post_type_edit_' . $post->post_type, $post, $new_status, $old_status ); 
     60                        } 
     61 
     62                        return; 
     63                } 
     64 
     65                // Publishing a previously unpublished post. 
     66                if ( 'publish' === $new_status ) { 
     67                        // Untrashing the post type - nothing here yet. 
     68                        if ( 'trash' == $old_status ) { 
     69 
     70                                /** 
     71                                 * Fires if untrashing post in a post type. 
     72                                 * 
     73                                 * This is a variable filter that is dependent on the post type 
     74                                 * being untrashed. 
     75                                 * 
     76                                 * @since 2.2.0 
     77                                 * 
     78                                 * @param WP_Post $post Post data. 
     79                                 */ 
     80                                do_action( 'bp_activity_post_type_untrash_' . $post->post_type, $post ); 
     81                        } else { 
     82                                // Record the post. 
     83                                bp_activity_post_type_publish( $post->ID, $post ); 
     84                        } 
     85 
     86                // Unpublishing a previously published post. 
     87                } elseif ( 'publish' === $old_status ) { 
     88                        // Some form of pending status - only remove the activity entry. 
     89                        bp_activity_post_type_unpublish( $post->ID, $post ); 
     90 
     91                // For any other cases, allow plugins to eventually deal with it. 
     92                } else { 
     93                        /** 
     94                         * Fires when the old and the new post status are not 'publish'. 
     95                         * 
     96                         * This is a variable filter that is dependent on the post type 
     97                         * being untrashed. 
     98                         * 
     99                         * @since 2.5.0 
     100                         * 
     101                         * @param WP_Post $post Post data. 
     102                         * @param string $new_status New status for the post. 
     103                         * @param string $old_status Old status for the post. 
     104                         */ 
     105                        do_action( 'bp_activity_post_type_transition_status_' . $post->post_type, $post, $new_status, $old_status ); 
     106                } 
     107        } 
     108} 
     109 No newline at end of file 
  • src/bp-core/classes/class-bp-component.php

     
    394394        } 
    395395 
    396396        /** 
     397         * Late includes method. 
     398         * 
     399         * Components should include files here only on specific pages using 
     400         * conditionals such as {@link bp_is_current_component()}. Intentionally left 
     401         * empty. 
     402         * 
     403         * @since 2.9.0 
     404         */ 
     405        public function late_includes() {} 
     406 
     407        /** 
    397408         * Set up the actions. 
    398409         * 
    399410         * @since 1.5.0 
     
    414425                // extending this base class. 
    415426                add_action( 'bp_include',                array( $this, 'includes'               ), 8 ); 
    416427 
     428                // Late includes. 
     429                add_action( 'bp_setup_canonical_stack',  array( $this, 'late_includes'          ), 20 ); 
     430 
    417431                // Setup navigation. 
    418432                add_action( 'bp_setup_nav',              array( $this, 'setup_nav'              ), 10 ); 
    419433 
  • new file src/bp-core/classes/class-bp-core-ajax-get-suggestions.php

    new file mode 100644
    - +  
     1<?php 
     2/** 
     3 * BuddyPress Activity Classes 
     4 * 
     5 * @package BuddyPress 
     6 * @since 2.9.0 
     7 */ 
     8 
     9// Exit if accessed directly. 
     10defined( 'ABSPATH' ) || exit; 
     11 
     12/** 
     13 * AJAX handler for Suggestions API lookups. 
     14 * 
     15 * @since 2.9.0 
     16 * 
     17 * @see  bp_ajax_get_suggestions() 
     18 * @todo Add nonce check. 
     19 */ 
     20class BP_Core_Ajax_Get_Suggestions { 
     21        /** 
     22         * Constructor. 
     23         * 
     24         * @since 2.9.0 
     25         */ 
     26        public function __construct() { 
     27                if ( ! bp_is_user_active() || empty( $_GET['term'] ) || empty( $_GET['type'] ) ) { 
     28                        wp_send_json_error( 'missing_parameter' ); 
     29                        exit; 
     30                } 
     31         
     32                $args = array( 
     33                        'term' => sanitize_text_field( $_GET['term'] ), 
     34                        'type' => sanitize_text_field( $_GET['type'] ), 
     35                ); 
     36         
     37                // Support per-Group suggestions. 
     38                if ( ! empty( $_GET['group-id'] ) ) { 
     39                        $args['group_id'] = absint( $_GET['group-id'] ); 
     40                } 
     41         
     42                $results = bp_core_get_suggestions( $args ); 
     43         
     44                if ( is_wp_error( $results ) ) { 
     45                        wp_send_json_error( $results->get_error_message() ); 
     46                        exit; 
     47                } 
     48         
     49                wp_send_json_success( $results ); 
     50        } 
     51} 
     52 No newline at end of file