Skip to:
Content

BuddyPress.org

Ticket #6426: 6426.02.patch

File 6426.02.patch, 22.0 KB (added by r-a-y, 9 years ago)
  • src/bp-activity/bp-activity-functions.php

     
    13041304         * @param BP_Activity_Activity $action   Action string being requested.
    13051305         * @param BP_Activity_Activity $activity Activity item object.
    13061306         */
    1307         $action = apply_filters( 'bp_activity_generate_action_string', $activity->action, $activity );
     1307        $action = apply_filters( 'bp_activity_generate_action_string', isset( $activity->action ) ? $activity->action : false, $activity );
    13081308
    13091309        // Remove the filter for future activity items
    13101310        remove_filter( 'bp_activity_generate_action_string', $actions->{$activity->component}->{$activity->type}['format_callback'], 10, 2 );
     
    13201320 * @param string $action   Static activity action.
    13211321 * @param object $activity Activity data object.
    13221322 *
    1323  * @return string
     1323 * @return string|bool Generated string on success; boolean false on failure.
    13241324 */
    13251325function bp_activity_format_activity_action_activity_update( $action, $activity ) {
     1326        if ( false === isset( $activity->user_id ) ) {
     1327                return $action;
     1328        }
     1329
    13261330        $action = sprintf( __( '%s posted an update', 'buddypress' ), bp_core_get_userlink( $activity->user_id ) );
    13271331
    13281332        /**
     
    13441348 * @param string $action   Static activity action.
    13451349 * @param object $activity Activity data object.
    13461350 *
    1347  * @return string
     1351 * @return string|bool Generated string on success; boolean false on failure.
    13481352 */
    13491353function bp_activity_format_activity_action_activity_comment( $action, $activity ) {
     1354        if ( false === isset( $activity->user_id ) ) {
     1355                return $action;
     1356        }
     1357
    13501358        $action = sprintf( __( '%s posted a new activity comment', 'buddypress' ), bp_core_get_userlink( $activity->user_id ) );
    13511359
    13521360        /**
     
    13781386                $bp->activity->track = bp_activity_get_post_types_tracking_args();
    13791387        }
    13801388
    1381         if ( empty( $activity->type ) || empty( $bp->activity->track[ $activity->type ] ) ) {
     1389        if ( empty( $activity->type ) || empty( $bp->activity->track[ $activity->type ] ) || false === isset( $activity->user_id ) || false === isset( $activity->item_id ) ) {
    13821390                return $action;
    13831391        }
    13841392
     
    14541462                'max'               => false,        // Maximum number of results to return
    14551463                'page'              => 1,            // page 1 without a per_page will result in no pagination.
    14561464                'per_page'          => false,        // results per page
     1465                'fields'            => '',           // Fields to return
    14571466                'sort'              => 'DESC',       // sort ASC or DESC
    14581467                'display_comments'  => false,        // false for no comments. 'stream' for within stream display, 'threaded' for below each activity item
    14591468
     
    14831492        ) );
    14841493
    14851494        // Attempt to return a cached copy of the first page of sitewide activity.
    1486         if ( ( 1 === (int) $r['page'] ) && empty( $r['max'] ) && empty( $r['search_terms'] ) && empty( $r['meta_query'] ) && empty( $r['date_query'] ) && empty( $r['filter_query'] ) && empty( $r['filter'] ) && empty( $r['scope'] )&& empty( $r['exclude'] ) && empty( $r['in'] ) && ( 'DESC' === $r['sort'] ) && empty( $r['exclude'] ) && ( 'ham_only' === $r['spam'] ) ) {
     1495        if ( ( 1 === (int) $r['page'] ) && empty( $r['max'] ) && empty( $r['fields'] ) && empty( $r['search_terms'] ) && empty( $r['meta_query'] ) && empty( $r['date_query'] ) && empty( $r['filter_query'] ) && empty( $r['filter'] ) && empty( $r['scope'] )&& empty( $r['exclude'] ) && empty( $r['in'] ) && ( 'DESC' === $r['sort'] ) && empty( $r['exclude'] ) && ( 'ham_only' === $r['spam'] ) ) {
    14871496
    14881497                $activity = wp_cache_get( 'bp_activity_sitewide_front', 'bp' );
    14891498                if ( false === $activity ) {
     
    14921501                                'page'              => $r['page'],
    14931502                                'per_page'          => $r['per_page'],
    14941503                                'max'               => $r['max'],
     1504                                'fields'            => $r['fields'],
    14951505                                'sort'              => $r['sort'],
    14961506                                'search_terms'      => $r['search_terms'],
    14971507                                'meta_query'        => $r['meta_query'],
     
    15141524                        'page'             => $r['page'],
    15151525                        'per_page'         => $r['per_page'],
    15161526                        'max'              => $r['max'],
     1527                        'fields'           => $r['fields'],
    15171528                        'sort'             => $r['sort'],
    15181529                        'search_terms'     => $r['search_terms'],
    15191530                        'meta_query'       => $r['meta_query'],
     
    15651576                'activity_ids'      => false,      // A single activity_id or array of IDs.
    15661577                'display_comments'  => false,      // true or false to display threaded comments for these specific activity items
    15671578                'max'               => false,      // Maximum number of results to return
     1579                'fields'            => '',         // Fields to return
    15681580                'page'              => 1,          // page 1 without a per_page will result in no pagination.
    15691581                'per_page'          => false,      // results per page
    15701582                'show_hidden'       => true,       // When fetching specific items, show all
     
    15771589                'display_comments'  => $r['display_comments'],
    15781590                'in'                => $r['activity_ids'],
    15791591                'max'               => $r['max'],
     1592                'fields'            => $r['fields'],
    15801593                'page'              => $r['page'],
    15811594                'per_page'          => $r['per_page'],
    15821595                'show_hidden'       => $r['show_hidden'],
  • src/bp-activity/classes/class-bp-activity-activity.php

     
    272272         *                                           in no pagination. Default: 1.
    273273         *     @type int|bool     $per_page          Number of results per page. Default: 25.
    274274         *     @type int|bool     $max               Maximum number of results to return. Default: false (unlimited).
     275         *     @type string|array $fields            Fields to return. Any column from the activity DB table is acceptable. Can
     276         *                                           be comma-delimited string or array. 'ids' returns only activity IDs.
    275277         *     @type string       $sort              ASC or DESC. Default: 'DESC'.
    276278         *     @type array        $exclude           Array of activity IDs to exclude. Default: false.
    277279         *     @type array        $in                Array of ids to limit query by (IN). Default: false.
     
    323325                        'page'              => 1,          // The current page
    324326                        'per_page'          => 25,         // Activity items per page
    325327                        'max'               => false,      // Max number of items to return
     328                        'fields'            => '',         // Fields to return
    326329                        'sort'              => 'DESC',     // ASC or DESC
    327330                        'exclude'           => false,      // Array of ids to exclude
    328331                        'in'                => false,      // Array of ids to limit query by (IN)
     
    393396                        $where_conditions['search_sql'] = $wpdb->prepare( 'a.content LIKE %s', $search_terms_like );
    394397                }
    395398
     399                // Custom fields
     400                if ( ! empty( $r['fields'] ) ) {
     401                        $fields = is_array( $r['fields'] ) ? $r['fields'] : explode( ',', $r['fields'] );
     402                } else {
     403                        $fields = array();
     404                }
     405
    396406                // Sorting
    397407                $sort = $r['sort'];
    398408                if ( $sort != 'ASC' && $sort != 'DESC' ) {
     
    562572
    563573                        $activity_ids = $wpdb->get_col( $activity_ids_sql );
    564574
     575                        // Return activity IDs only
     576                        if ( 'ids' === $r['fields'] ) {
     577                                return $activity_ids;
     578                        }
     579
    565580                        $retval['has_more_items'] = ! empty( $per_page ) && count( $activity_ids ) > $per_page;
    566581
    567582                        // If we've fetched more than the $per_page value, we
     
    570585                                array_pop( $activity_ids );
    571586                        }
    572587
    573                         $activities = self::get_activity_data( $activity_ids );
     588                        $activities = self::get_activity_data( $activity_ids, $fields );
    574589                }
    575590
    576591                // Get the fullnames of users so we don't have to query in the loop
    577                 $activities = self::append_user_fullnames( $activities );
     592                if ( empty( $fields ) || in_array( 'user_id', $fields, true ) ) {
     593                        $activities = self::append_user_fullnames( $activities );
     594                }
    578595
    579596                // Get activity meta
    580597                $activity_ids = array();
     
    594611                BP_Activity_Activity::prefetch_object_data( $activities );
    595612
    596613                // Generate action strings
    597                 $activities = BP_Activity_Activity::generate_action_strings( $activities );
     614                if ( empty( $fields ) || in_array( 'action', $fields, true ) ) {
     615                        $activities = BP_Activity_Activity::generate_action_strings( $activities );
     616                }
    598617
    599618                $retval['activities'] = $activities;
    600619
     
    631650         * @since BuddyPress (2.0.0)
    632651         *
    633652         * @param array $activity_ids Array of activity IDs.
     653         * @param array $fields       Fields to return.
    634654         *
    635655         * @return array
    636656         */
    637         protected static function get_activity_data( $activity_ids = array() ) {
     657        protected static function get_activity_data( $activity_ids = array(), $fields = array() ) {
    638658                global $wpdb;
    639659
    640660                // Bail if no activity ID's passed
     
    668688                        $activities[] = wp_cache_get( $activity_id, 'bp_activity' );
    669689                }
    670690
    671                 // Then fetch user data
    672                 $user_query = new BP_User_Query( array(
    673                         'user_ids'        => wp_list_pluck( $activities, 'user_id' ),
    674                         'populate_extras' => false,
    675                 ) );
     691                // Grab all fields and fetch usernames
     692                if ( empty( $fields ) ) {
     693                        // Then fetch user data
     694                        $user_query = new BP_User_Query( array(
     695                                'user_ids'        => wp_list_pluck( $activities, 'user_id' ),
     696                                'populate_extras' => false,
     697                        ) );
     698
     699                        // Associated located user data with activity items
     700                        foreach ( $activities as $a_index => $a_item ) {
     701                                $a_user_id = intval( $a_item->user_id );
     702                                $a_user    = isset( $user_query->results[ $a_user_id ] ) ? $user_query->results[ $a_user_id ] : '';
     703
     704                                if ( ! empty( $a_user ) ) {
     705                                        $activities[ $a_index ]->user_email    = $a_user->user_email;
     706                                        $activities[ $a_index ]->user_nicename = $a_user->user_nicename;
     707                                        $activities[ $a_index ]->user_login    = $a_user->user_login;
     708                                        $activities[ $a_index ]->display_name  = $a_user->display_name;
     709                                }
     710                        }
     711
     712                // Only return custom fields
     713                } else {
     714                        $filtered_activities = array();
     715                        foreach ( $activities as $a_index => $a_item ) {
     716                                $filtered_activities[ $a_index ] = new stdClass;
    676717
    677                 // Associated located user data with activity items
    678                 foreach ( $activities as $a_index => $a_item ) {
    679                         $a_user_id = intval( $a_item->user_id );
    680                         $a_user    = isset( $user_query->results[ $a_user_id ] ) ? $user_query->results[ $a_user_id ] : '';
     718                                // Always add the activity ID
     719                                $filtered_activities[ $a_index ]->id = $a_item->id;
    681720
    682                         if ( !empty( $a_user ) ) {
    683                                 $activities[ $a_index ]->user_email    = $a_user->user_email;
    684                                 $activities[ $a_index ]->user_nicename = $a_user->user_nicename;
    685                                 $activities[ $a_index ]->user_login    = $a_user->user_login;
    686                                 $activities[ $a_index ]->display_name  = $a_user->display_name;
     721                                // Add each custom field
     722                                foreach ( $fields as $field ) {
     723                                        if ( isset( $a_item->$field ) ) {
     724                                                $filtered_activities[ $a_index ]->$field = $a_item->$field;
     725                                        }
     726                                }
    687727                        }
     728
     729                        $activities = $filtered_activities;
    688730                }
    689731
    690732                return $activities;
  • src/bp-blogs/bp-blogs-activity.php

     
    6464 *
    6565 * @since BuddyPress (2.0.0)
    6666 *
    67  * @param string $action   Static activity action.
    68  * @param object $activity Activity data object.
     67 * @param string|bool $action   Static activity action.
     68 * @param object      $activity Activity data object.
    6969 *
    70  * @return string
     70 * @return string|bool Constructed activity action.
    7171 */
    7272function bp_blogs_format_activity_action_new_blog( $action, $activity ) {
     73        if ( false === isset( $activity->item_id ) || false === isset( $activity->user_id ) ) {
     74                return $action;
     75        }
     76
    7377        $blog_url  = bp_blogs_get_blogmeta( $activity->item_id, 'url' );
    7478        $blog_name = bp_blogs_get_blogmeta( $activity->item_id, 'name' );
    7579
     
    103107 *
    104108 * @since BuddyPress (2.0.0)
    105109 *
    106  * @param string $action   Static activity action.
    107  * @param object $activity Activity data object.
     110 * @param string|bool $action   Static activity action.
     111 * @param object      $activity Activity data object.
    108112 *
    109  * @return string Constructed activity action.
     113 * @return string|bool Constructed activity action.
    110114 */
    111115function bp_blogs_format_activity_action_new_blog_post( $action, $activity ) {
     116        if ( false === isset( $activity->item_id ) || false === isset( $activity->secondary_item_id ) || false === isset( $activity->user_id ) ) {
     117                return $action;
     118        }
     119
    112120        $blog_url  = bp_blogs_get_blogmeta( $activity->item_id, 'url' );
    113121        $blog_name = bp_blogs_get_blogmeta( $activity->item_id, 'name' );
    114122
     
    215223 *
    216224 * @since BuddyPress (2.0.0)
    217225 *
    218  * @param string $action   Static activity action.
    219  * @param object $activity Activity data object.
     226 * @param string|bool $action   Static activity action.
     227 * @param object      $activity Activity data object.
    220228 *
    221  * @return string Constructed activity action.
     229 * @return string|bool Constructed activity action.
    222230 */
    223231function bp_blogs_format_activity_action_new_blog_comment( $action, $activity ) {
     232        if ( false === isset( $activity->item_id ) || false === isset( $activity->user_id ) ) {
     233                return $action;
     234        }
     235
    224236        $blog_url  = bp_blogs_get_blogmeta( $activity->item_id, 'url' );
    225237        $blog_name = bp_blogs_get_blogmeta( $activity->item_id, 'name' );
    226238
     
    310322                        continue;
    311323                }
    312324
    313                 $blog_ids[] = $activity->item_id;
     325                if ( isset( $activity->item_id ) ) {
     326                        $blog_ids[] = $activity->item_id;
     327                }
    314328        }
    315329
    316330        if ( ! empty( $blog_ids ) ) {
  • src/bp-friends/bp-friends-activity.php

     
    127127 *
    128128 * @since BuddyPress (2.0.0)
    129129 *
    130  * @param string $action   Activity action string.
    131  * @param object $activity Activity data.
     130 * @param string|bool $action   Activity action string.
     131 * @param object      $activity Activity data.
    132132 *
    133  * @return string $action Formatted activity action.
     133 * @return string|bool $action Formatted activity action.
    134134 */
    135135function bp_friends_format_activity_action_friendship_accepted( $action, $activity ) {
     136        if ( false === isset( $activity->user_id ) || false === isset( $activity->secondary_item_id ) ) {
     137                return $action;
     138        }
     139
    136140        $initiator_link = bp_core_get_userlink( $activity->user_id );
    137141        $friend_link    = bp_core_get_userlink( $activity->secondary_item_id );
    138142
     
    162166 *
    163167 * @since BuddyPress (2.0.0)
    164168 *
    165  * @param string $action   Static activity action.
    166  * @param object $activity Activity data.
     169 * @param string|bool $action   Static activity action.
     170 * @param object      $activity Activity data.
    167171 *
    168  * @return string $action Formatted activity action.
     172 * @return string|bool $action Formatted activity action.
    169173 */
    170174function bp_friends_format_activity_action_friendship_created( $action, $activity ) {
     175        if ( false === isset( $activity->user_id ) || false === isset( $activity->secondary_item_id ) ) {
     176                return $action;
     177        }
     178
    171179        $initiator_link = bp_core_get_userlink( $activity->user_id );
    172180        $friend_link    = bp_core_get_userlink( $activity->secondary_item_id );
    173181
     
    215223                        continue;
    216224                }
    217225
    218                 $friend_ids[] = $activity->secondary_item_id;
     226                if ( isset( $activity->secondary_item_id ) ) {
     227                        $friend_ids[] = $activity->secondary_item_id;
     228                }
    219229        }
    220230
    221231        if ( ! empty( $friend_ids ) ) {
  • src/bp-groups/bp-groups-activity.php

     
    8989 *
    9090 * @since BuddyPress (2.0.0)
    9191 *
    92  * @param string $action   Static activity action.
    93  * @param object $activity Activity data object.
     92 * @param string|bool $action   Static activity action.
     93 * @param object      $activity Activity data object.
    9494 *
    95  * @return string
     95 * @return string|bool Constructed activity action.
    9696 */
    9797function bp_groups_format_activity_action_created_group( $action, $activity ) {
     98        if ( false === isset( $activity->user_id ) || false === isset( $activity->item_id ) ) {
     99                return $action;
     100        }
     101
    98102        $user_link = bp_core_get_userlink( $activity->user_id );
    99103
    100104        $group = groups_get_group( array(
     
    121125 *
    122126 * @since BuddyPress (2.0.0)
    123127 *
    124  * @param string $action   Static activity action.
    125  * @param object $activity Activity data object.
     128 * @param string|bool $action   Static activity action.
     129 * @param object      $activity Activity data object.
    126130 *
    127  * @return string
     131 * @return string|bool Constructed activity action.
    128132 */
    129133function bp_groups_format_activity_action_joined_group( $action, $activity ) {
     134        if ( false === isset( $activity->user_id ) || false === isset( $activity->item_id ) ) {
     135                return $action;
     136        }
     137
    130138        $user_link = bp_core_get_userlink( $activity->user_id );
    131139
    132140        $group = groups_get_group( array(
     
    164172 *
    165173 * @since BuddyPress (2.2.0)
    166174 *
    167  * @param  string $action   Static activity action.
    168  * @param  object $activity Activity data object.
     175 * @param string|bool $action   Static activity action.
     176 * @param object      $activity Activity data object.
    169177 *
    170  * @return string
     178 * @return string|bool Constructed activity action.
    171179 */
    172180function bp_groups_format_activity_action_group_details_updated( $action, $activity ) {
     181        if ( false === isset( $activity->user_id ) || false === isset( $activity->item_id ) || false === isset( $activity->date_recorded ) ) {
     182                return $action;
     183        }
     184
    173185        $user_link = bp_core_get_userlink( $activity->user_id );
    174186
    175187        $group = groups_get_group( array(
     
    236248                        continue;
    237249                }
    238250
    239                 $group_ids[] = $activity->item_id;
     251                if ( isset( $activity->item_id ) ) {
     252                        $group_ids[] = $activity->item_id;
     253                }
    240254        }
    241255
    242256        if ( ! empty( $group_ids ) ) {
  • src/bp-members/bp-members-activity.php

     
    4343 *
    4444 * @since BuddyPress (2.2.0)
    4545 *
    46  * @param string $action   Static activity action.
    47  * @param object $activity Activity object.
     46 * @param string|bool $action   Static activity action.
     47 * @param object      $activity Activity data object.
    4848 *
    49  * @return string
     49 * @return string|bool Constructed activity action.
    5050 */
    5151function bp_members_format_activity_action_new_member( $action, $activity ) {
     52        if ( false === isset( $activity->user_id ) ) {
     53                return $action;
     54        }
     55
    5256        $userlink = bp_core_get_userlink( $activity->user_id );
    5357        $action   = sprintf( __( '%s became a registered member', 'buddypress' ), $userlink );
    5458
  • src/bp-xprofile/bp-xprofile-activity.php

     
    5656 *
    5757 * @since BuddyPress (2.0.0)
    5858 *
    59  * @param string $action Static activity action.
    60  * @param object $activity Activity object.
    61  * @return string
     59 * @param string|bool $action   Static activity action.
     60 * @param object      $activity Activity data object.
     61 *
     62 * @return string|bool Constructed activity action.
    6263 */
    6364function bp_xprofile_format_activity_action_new_avatar( $action, $activity ) {
     65        if ( false === isset( $activity->user_id ) ) {
     66                return $action;
     67        }
     68
    6469        $userlink = bp_core_get_userlink( $activity->user_id );
    6570        $action   = sprintf( __( '%s changed their profile picture', 'buddypress' ), $userlink );
    6671
     
    8590 *
    8691 * @since BuddyPress (2.0.0)
    8792 *
    88  * @param string $action Static activity action.
    89  * @param object $activity Activity object.
    90  * @return string
     93 * @param string|bool $action   Static activity action.
     94 * @param object      $activity Activity data object.
     95 *
     96 * @return string|bool Constructed activity action.
    9197 */
    9298function bp_xprofile_format_activity_action_updated_profile( $action, $activity ) {
     99        if ( false === isset( $activity->user_id ) ) {
     100                return $action;
     101        }
    93102
    94103        // Note for translators: The natural phrasing in English, "Joe updated
    95104        // his profile", requires that we know Joe's gender, which we don't. If
  • tests/phpunit/testcases/activity/class.BP_Activity_Activity.php

     
    55class BP_Tests_Activity_Class extends BP_UnitTestCase {
    66
    77        /**
     8         * @group get
     9         * @group fields
     10         */
     11        public function test_get_with_fields_parameter_by_id() {
     12                $a = $this->factory->activity->create_many( 3, array(
     13                        'type' => 'activity_update',
     14                ) );
     15
     16                // invalid activity items
     17                $invalid_aids = array( $a[2] + 1, $a[2] + 2 );
     18
     19                $result = BP_Activity_Activity::get( array(
     20                        'fields' => 'ids',
     21                        'in'     => array_merge( $a, $invalid_aids ),
     22                ) );
     23
     24                $this->assertEquals( $a, $result );
     25        }
     26
     27        /**
     28         * @group get
     29         * @group fields
     30         */
     31        public function test_get_with_fields_parameter_by_column_names() {
     32                $now = time();
     33                $a1 = $this->factory->activity->create( array(
     34                        'component' => 'activity',
     35                        'type' => 'activity_update',
     36                        'recorded_time' => date( 'Y-m-d H:i:s', $now ),
     37                ) );
     38                $a2 = $this->factory->activity->create( array(
     39                        'component' => 'blogs',
     40                        'type' => 'new_blog_post',
     41                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 60 ),
     42                ) );
     43                $a3 = $this->factory->activity->create( array(
     44                        'component' => 'activity',
     45                        'type' => 'activity_update',
     46                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 120 ),
     47                ) );
     48
     49                // Grab only 'component' and 'type' fields
     50                $result = BP_Activity_Activity::get( array(
     51                        'fields' => 'component,type',
     52                ) );
     53
     54                $expected = array();
     55                $expected['activities'][0] = (object) array(
     56                        'id' => $a1,
     57                        'component' => 'activity',
     58                        'type' => 'activity_update'
     59                );
     60                $expected['activities'][1] = (object) array(
     61                        'id' => $a2,
     62                        'component' => 'blogs',
     63                        'type' => 'new_blog_post'
     64                );
     65                $expected['activities'][2] = (object) array(
     66                        'id' => $a3,
     67                        'component' => 'activity',
     68                        'type' => 'activity_update'
     69                );
     70                $expected['total'] = null;
     71                $expected['has_more_items'] = false;
     72
     73                $this->assertEquals( $expected, $result );
     74        }
     75
     76        /**
    877         * @group check_exists_by_content
    978         */
    1079        public function test_check_exists_by_content() {