Skip to:
Content

BuddyPress.org

Ticket #4988: 4988.01.patch

File 4988.01.patch, 25.8 KB (added by r-a-y, 12 years ago)

Updated patch to support nested relation queries and negative filters.

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

     
    312312                        'in'                => false,      // Array of ids to limit query by (IN)
    313313                        'meta_query'        => false,      // Filter by activitymeta
    314314                        'date_query'        => false,      // Filter by date
     315                        'filter_query'      => false,      // Advanced filtering - see BP_Activity_Query
    315316                        'filter'            => false,      // See self::get_filter_sql()
     317                        'scope'             => false,      // Preset activity arguments
    316318                        'search_terms'      => false,      // Terms to search by
    317319                        'display_comments'  => false,      // Whether to include activity comments
    318320                        'show_hidden'       => false,      // Show items marked hide_sitewide
     
    321323                        'count_total'       => false,
    322324                );
    323325                $r = wp_parse_args( $args, $defaults );
    324                 extract( $r );
    325326
    326327                // Select conditions
    327328                $select_sql = "SELECT DISTINCT a.id";
     
    336337                // Excluded types
    337338                $excluded_types = array();
    338339
     340                // Scope takes precedence
     341                if ( ! empty( $r['scope'] ) ) {
     342                        $scope_query = self::get_scope_query_sql( $r['scope'], $r );
     343
     344                        if ( ! empty( $scope_query['sql'] ) ) {
     345                                $where_conditions['scope_query_sql'] = $scope_query['sql'];
     346                        }
     347
     348                        // override some arguments if needed
     349                        if ( ! empty( $scope_query['override'] ) ) {
     350                                $r = array_replace_recursive( $r, $scope_query['override'] );
     351                        }
     352
     353                // Advanced filtering
     354                } elseif ( ! empty( $r['filter_query'] ) ) {
     355                        $filter_query = new BP_Activity_Query( $r['filter_query'] );
     356                        if ( $filter_query = $filter_query->get_sql() ) {
     357                                $where_conditions['filter_query_sql'] = $filter_query;
     358                        }
     359                }
     360
     361                // Regular filtering
     362                if ( $r['filter'] && $filter_sql = BP_Activity_Activity::get_filter_sql( $r['filter'] ) ) {
     363                        $where_conditions['filter_sql'] = $filter_sql;
     364                }
     365
    339366                // Spam
    340                 if ( 'ham_only' == $spam )
     367                if ( 'ham_only' == $r['spam'] ) {
    341368                        $where_conditions['spam_sql'] = 'a.is_spam = 0';
    342                 elseif ( 'spam_only' == $spam )
     369                } elseif ( 'spam_only' == $spam ) {
    343370                        $where_conditions['spam_sql'] = 'a.is_spam = 1';
     371                }
    344372
    345373                // Searching
    346                 if ( $search_terms ) {
    347                         $search_terms_like = '%' . bp_esc_like( $search_terms ) . '%';
     374                if ( $r['search_terms'] ) {
     375                        $search_terms_like = '%' . bp_esc_like( $r['search_terms'] ) . '%';
    348376                        $where_conditions['search_sql'] = $wpdb->prepare( 'a.content LIKE %s', $search_terms_like );
    349377                }
    350378
    351                 // Filtering
    352                 if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )
    353                         $where_conditions['filter_sql'] = $filter_sql;
    354 
    355379                // Sorting
    356                 if ( $sort != 'ASC' && $sort != 'DESC' )
     380                $sort = $r['sort'];
     381                if ( $sort != 'ASC' && $sort != 'DESC' ) {
    357382                        $sort = 'DESC';
     383                }
    358384
    359385                // Hide Hidden Items?
    360                 if ( !$show_hidden )
     386                if ( ! $r['show_hidden'] )
    361387                        $where_conditions['hidden_sql'] = "a.hide_sitewide = 0";
    362388
    363389                // Exclude specified items
    364                 if ( !empty( $exclude ) ) {
    365                         $exclude = implode( ',', wp_parse_id_list( $exclude ) );
     390                if ( ! empty( $r['exclude'] ) ) {
     391                        $exclude = implode( ',', wp_parse_id_list( $r['exclude'] ) );
    366392                        $where_conditions['exclude'] = "a.id NOT IN ({$exclude})";
    367393                }
    368394
    369395                // The specific ids to which you want to limit the query
    370                 if ( !empty( $in ) ) {
    371                         $in = implode( ',', wp_parse_id_list( $in ) );
     396                if ( ! empty( $r['in'] ) ) {
     397                        $in = implode( ',', wp_parse_id_list( $r['in'] ) );
    372398                        $where_conditions['in'] = "a.id IN ({$in})";
    373399                }
    374400
    375401                // Process meta_query into SQL
    376                 $meta_query_sql = self::get_meta_query_sql( $meta_query );
     402                $meta_query_sql = self::get_meta_query_sql( $r['meta_query'] );
    377403
    378404                if ( ! empty( $meta_query_sql['join'] ) ) {
    379405                        $join_sql .= $meta_query_sql['join'];
     
    384410                }
    385411
    386412                // Process date_query into SQL
    387                 $date_query_sql = self::get_date_query_sql( $date_query );
     413                $date_query_sql = self::get_date_query_sql( $r['date_query'] );
    388414
    389415                if ( ! empty( $date_query_sql ) ) {
    390416                        $where_conditions['date'] = $date_query_sql;
     
    393419                // Alter the query based on whether we want to show activity item
    394420                // comments in the stream like normal comments or threaded below
    395421                // the activity.
    396                 if ( false === $display_comments || 'threaded' === $display_comments ) {
     422                if ( false === $r['display_comments'] || 'threaded' === $r['display_comments'] ) {
    397423                        $excluded_types[] = 'activity_comment';
    398424                }
    399425
    400426                // Exclude 'last_activity' items unless the 'action' filter has
    401427                // been explicitly set
    402                 if ( empty( $filter['object'] ) ) {
     428                if ( empty( $r['filter']['object'] ) ) {
    403429                        $excluded_types[] = 'last_activity';
    404430                }
    405431
     
    437463                }
    438464
    439465                // Sanitize page and per_page parameters
    440                 $page     = absint( $page     );
    441                 $per_page = absint( $per_page );
     466                $page     = absint( $r['page']     );
     467                $per_page = absint( $r['per_page'] );
    442468
    443469                $retval = array(
    444470                        'activities'     => null,
     
    495521                        $activity_ids[] = $activity->id;
    496522                }
    497523
    498                 if ( ! empty( $activity_ids ) && $update_meta_cache ) {
     524                if ( ! empty( $activity_ids ) && $r['update_meta_cache'] ) {
    499525                        bp_activity_update_meta_cache( $activity_ids );
    500526                }
    501527
    502                 if ( $activities && $display_comments )
    503                         $activities = BP_Activity_Activity::append_comments( $activities, $spam );
     528                if ( $activities && $r['display_comments'] ) {
     529                        $activities = BP_Activity_Activity::append_comments( $activities, $r['spam'] );
     530                }
    504531
    505532                // Pre-fetch data associated with activity users and other objects
    506533                BP_Activity_Activity::prefetch_object_data( $activities );
     
    516543                        $total_activities_sql = apply_filters( 'bp_activity_total_activities_sql', "SELECT count(DISTINCT a.id) FROM {$bp->activity->table_name} a {$join_sql} {$where_sql}", $where_sql, $sort );
    517544                        $total_activities     = $wpdb->get_var( $total_activities_sql );
    518545
    519                         if ( !empty( $max ) ) {
    520                                 if ( (int) $total_activities > (int) $max )
    521                                         $total_activities = $max;
     546                        if ( !empty( $r['max'] ) ) {
     547                                if ( (int) $total_activities > (int) $r['max'] )
     548                                        $total_activities = $r['max'];
    522549                        }
    523550
    524551                        $retval['total'] = $total_activities;
     
    737764        }
    738765
    739766        /**
     767         * Get the SQL for the 'scope' param in BP_Activity_Activity::get().
     768         *
     769         * A scope is a predetermined set of activity arguments.  This method is used
     770         * to grab these activity arguments and override any existing args if needed.
     771         *
     772         * Can handle multple scopes.
     773         *
     774         * @since BuddyPress (2.2.0)
     775         *
     776         * @param string $scope The activity scope
     777         * @param array $filter_array Current activity arguments
     778         * @return array 'sql' WHERE SQL string and 'override' activity args
     779         */
     780        public static function get_scope_query_sql( $scope = '', $filter_array = array() ) {
     781                $query_args = array();
     782                $override   = array();
     783                $retval     = array();
     784
     785                $scopes = explode( ',', $scope );
     786
     787                if ( empty( $scopes ) ) {
     788                        return $sql;
     789                }
     790
     791                // helper to easily grab the 'user_id'
     792                if ( ! empty( $filter_array['filter']['user_id'] ) ) {
     793                        $filter_array['user_id'] = $filter_array['filter']['user_id'];
     794                }
     795                if ( empty( $filter_array['user_id'] ) ) {
     796                        $filter_array['user_id'] = bp_displayed_user_id() ? bp_displayed_user_id() : bp_loggedin_user_id();
     797                }
     798
     799                // parse each scope; yes! we handle multiples!
     800                foreach ( $scopes as $scope ) {
     801                        $scope_args = array();
     802
     803                        switch ( $scope ) {
     804                                // this is new as of BP 2.2
     805                                // primarily to be used when combining with other scopes
     806                                case 'personal' :
     807                                        $scope_args['user_id'] = $filter_array['user_id'];
     808
     809                                        break;
     810
     811                                case 'just-me' :
     812                                        $scope_args['override']['display_comments'] = 'stream';
     813
     814                                        break;
     815
     816                                case 'favorites':
     817                                        $favs = bp_activity_get_user_favorites( $filter_array['user_id'] );
     818                                        if ( empty( $favs ) ) {
     819                                                return $scope_args;
     820                                        }
     821
     822                                        $scope_args['id'] = implode( ',', (array) $favs );
     823                                        $scope_args['override']['display_comments']  = true;
     824                                        $scope_args['override']['filter']['user_id'] = 0;
     825
     826                                        break;
     827
     828                                case 'mentions':
     829                                        // Are mentions disabled?
     830                                        if ( ! bp_activity_do_mentions() ) {
     831                                                return $scope_args;
     832                                        }
     833
     834                                        // Start search at @ symbol and stop search at closing tag delimiter.
     835                                        $scope_args['override']['search_terms'] = '@' . bp_activity_get_user_mentionname( $filter_array['user_id'] ) . '<';
     836                                        $scope_args['override']['display_comments'] = 'stream';
     837                                        $scope_args['override']['filter']['user_id'] = 0;
     838
     839                                        break;
     840
     841                                // plugins can hook here to set their scope args
     842                                //
     843                                // - scope args use the activity DB column as the array key
     844                                // - the 'override' array is to override existing activity args if needed.
     845                                //   arguments match those passed in BP_Activity_Activity::get()
     846                                default :
     847                                        $scope_args = apply_filters( "bp_activity_set_{$scope}_scope_args", array(), $filter_array );
     848                                        break;
     849                        }
     850
     851                        if ( ! empty( $scope_args ) ) {
     852                                // @todo Fix 'hide_sitewide' with multiple scopes... needs more testing
     853                                if ( 'friends' !== $scope ) {
     854                                        //$scope_args['hide_sitewide'] = ( $filter_array['user_id'] == bp_loggedin_user_id() ) ? 1 : 0;
     855                                }
     856
     857                                // merge override properties from other scopes
     858                                // this might be a problem...
     859                                if ( ! empty( $scope_args['override'] ) ) {
     860                                        $override = array_merge( $override, $scope_args['override'] );
     861                                        unset( $scope_args['override'] );
     862                                }
     863
     864                                // save scope args
     865                                if ( ! empty( $scope_args ) ) {
     866                                        $query_args[] = $scope_args;
     867                                }
     868                        }
     869                }
     870
     871                if ( ! empty( $query_args ) ) {
     872                        // set relation to OR
     873                        $query_args['relation'] = 'OR';
     874
     875                        $query = new BP_Activity_Query( $query_args );
     876
     877                        if ( $sql = $query->get_sql() ) {
     878                                $retval['sql'] = $sql;
     879                        }
     880                }
     881
     882                if ( ! empty( $override ) ) {
     883                        $retval['override'] = $override;
     884                }
     885
     886                return $retval;
     887        }
     888
     889        /**
    740890         * In BuddyPress 1.2.x, this was used to retrieve specific activity stream items (for example, on an activity's permalink page).
    741891         *
    742892         * As of 1.5.x, use BP_Activity_Activity::get() with an 'in' parameter instead.
     
    13951545}
    13961546
    13971547/**
     1548 * Generate a MySQL WHERE clause for the specified activity-based parameters.
     1549 *
     1550 * This is for complicated activity queries.
     1551 *
     1552 * @since BuddyPress (2.2.0)
     1553 */
     1554class BP_Activity_Query {
     1555        /**
     1556         * List of activity queries.
     1557         *
     1558         * @since BuddyPress (2.2.0)
     1559         * @access public
     1560         * @var array
     1561         */
     1562        public $queries = array();
     1563
     1564        /**
     1565         * The relation between the queries. Can be one of 'AND' or 'OR'.
     1566         *
     1567         * @since BuddyPress (2.2.0)
     1568         * @access public
     1569         * @var string
     1570         */
     1571        public $relation;
     1572
     1573        /**
     1574         * Constructor
     1575         *
     1576         * @param array $query_args
     1577         */
     1578        function __construct( $query_args = false ) {
     1579                if ( ! $query_args ) {
     1580                        return;
     1581                }
     1582
     1583                if ( isset( $query_args['relation'] ) && strtoupper( $query_args['relation'] ) == 'OR' ) {
     1584                        $this->relation = 'OR';
     1585                } else {
     1586                        $this->relation = 'AND';
     1587                }
     1588
     1589                $this->queries = array();
     1590
     1591                foreach ( $query_args as $key => $query ) {
     1592                        if ( ! is_array( $query ) )
     1593                                continue;
     1594
     1595                        $this->queries[] = $query;
     1596                }
     1597        }
     1598
     1599        /**
     1600         * Turns an array of activity query parameters into a MySQL string.
     1601         *
     1602         * @since BuddyPress (2.2.0)
     1603         * @access public
     1604         *
     1605         * @return string MySQL WHERE parameters
     1606         */
     1607        public function get_sql() {
     1608                $where = array();
     1609
     1610                foreach ( $this->queries as $key => $query ) {
     1611                        $where[] = $this->get_sql_for_subquery( $query );
     1612                }
     1613
     1614                $where = array_filter( $where );
     1615
     1616                if ( empty( $where ) ) {
     1617                        $where = '';
     1618                } else {
     1619                        $where = "( " . implode( "\n\t{$this->relation} ", $where ) . "\n)";
     1620                }
     1621
     1622                return apply_filters( 'bp_get_activity_query_sql', $where, $this->queries );
     1623        }
     1624
     1625        /**
     1626         * Turns a single activity subquery into pieces for a WHERE clause.
     1627         *
     1628         * @since BuddyPress (2.2.0)
     1629         * return array
     1630         */
     1631        protected function get_sql_for_subquery( $query ) {
     1632                $count = count( $query );
     1633
     1634                // simple query
     1635                if ( $count < 2 ) {
     1636                        $key = key( $query );
     1637
     1638                        return "\n\t( " . BP_Activity_Activity::get_in_operator_sql( $key, $query[$key] ) . " )";
     1639
     1640                // relational query
     1641                } else {
     1642                        global $wpdb;
     1643
     1644                        $sql_array = array();
     1645
     1646                        // get relation
     1647                        if ( ! empty( $query['relation'] ) ) {
     1648                                $relation = $query['relation'];
     1649                                unset( $query['relation'] );
     1650
     1651                        // default relation to 'AND' for subqueries if nothing is found
     1652                        } else {
     1653                                $relation = 'AND';
     1654                        }
     1655
     1656                        // get compare
     1657                        if ( ! empty( $query['compare'] ) ) {
     1658                                $compare = $query['compare'];
     1659                                unset( $query['compare'] );
     1660
     1661                        // default compare to 'IN' for subqueries if nothing is found
     1662                        } else {
     1663                                $compare = 'IN';
     1664                        }
     1665
     1666                        foreach ( $query as $key => $value ) {
     1667                                // nested query
     1668                                if ( is_numeric( $key ) ) {
     1669                                        $sql_array[] = $this->get_sql_for_subquery( $value );
     1670
     1671                                // tinyint
     1672                                } elseif ( true === in_array( $key, array( 'hide_sitewide', 'is_spam' ) ) ) {
     1673                                        $sql_array[$key] = $wpdb->prepare( "{$key} = %d", $value );
     1674
     1675                                // anything else uses the IN operator
     1676                                } else {
     1677                                        $sql_array[$key] = BP_Activity_Activity::get_in_operator_sql( $key, $value );
     1678
     1679                                        // 'NOT IN' operator is as easy as a string replace!
     1680                                        if ( 'NOT IN' === $compare ) {
     1681                                                $sql_array[$key] = str_replace( 'IN', 'NOT IN', $sql_array[$key] );
     1682                                        }
     1683                                }
     1684                        }
     1685
     1686                        return "\n\t( " . implode( " {$relation} ", $sql_array ) . " )";
     1687                }
     1688        }
     1689}
     1690
     1691/**
    13981692 * Create a RSS feed using the activity component.
    13991693 *
    14001694 * You should only construct a new feed when you've validated that you're on
  • src/bp-activity/bp-activity-functions.php

     
    10201020                'search_terms'      => false,        // Pass search terms as a string
    10211021                'meta_query'        => false,        // Filter by activity meta. See WP_Meta_Query for format
    10221022                'date_query'        => false,        // Filter by date. See first parameter of WP_Date_Query for format
     1023                'filter_query'      => false,
    10231024                'show_hidden'       => false,        // Show activity items that are hidden site-wide?
    10241025                'exclude'           => false,        // Comma-separated list of activity IDs to exclude
    10251026                'in'                => false,        // Comma-separated list or array of activity IDs to which you want to limit the query
    10261027                'spam'              => 'ham_only',   // 'ham_only' (default), 'spam_only' or 'all'.
    10271028                'update_meta_cache' => true,
    10281029                'count_total'       => false,
     1030                'scope'             => false,
    10291031
    10301032                /**
    10311033                 * Pass filters as an array -- all filter items can be multiple values comma separated:
     
    10411043        ) );
    10421044
    10431045        // Attempt to return a cached copy of the first page of sitewide activity.
    1044         if ( ( 1 === (int) $r['page'] ) && empty( $r['max'] ) && empty( $r['search_terms'] ) && empty( $r['meta_query'] ) && empty( $r['date_query'] ) && empty( $r['filter'] ) && empty( $r['exclude'] ) && empty( $r['in'] ) && ( 'DESC' === $r['sort'] ) && empty( $r['exclude'] ) && ( 'ham_only' === $r['spam'] ) ) {
     1046        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'] ) ) {
    10451047
    10461048                $activity = wp_cache_get( 'bp_activity_sitewide_front', 'bp' );
    10471049                if ( false === $activity ) {
     
    10541056                                'search_terms'      => $r['search_terms'],
    10551057                                'meta_query'        => $r['meta_query'],
    10561058                                'date_query'        => $r['date_query'],
     1059                                'filter_query'      => $r['filter_query'],
    10571060                                'filter'            => $r['filter'],
     1061                                'scope'             => $r['scope'],
    10581062                                'display_comments'  => $r['display_comments'],
    10591063                                'show_hidden'       => $r['show_hidden'],
    10601064                                'spam'              => $r['spam'],
     
    10741078                        'search_terms'     => $r['search_terms'],
    10751079                        'meta_query'       => $r['meta_query'],
    10761080                        'date_query'       => $r['date_query'],
     1081                        'filter_query'     => $r['filter_query'],
    10771082                        'filter'           => $r['filter'],
     1083                        'scope'            => $r['scope'],
    10781084                        'display_comments' => $r['display_comments'],
    10791085                        'show_hidden'      => $r['show_hidden'],
    10801086                        'exclude'          => $r['exclude'],
  • src/bp-activity/bp-activity-template.php

     
    176176                        'exclude'           => false,
    177177                        'in'                => false,
    178178                        'filter'            => false,
     179                        'scope'             => false,
    179180                        'search_terms'      => false,
    180181                        'meta_query'        => false,
    181182                        'date_query'        => false,
     183                        'filter_query'      => false,
    182184                        'display_comments'  => 'threaded',
    183185                        'show_hidden'       => false,
    184186                        'spam'              => 'ham_only',
     
    222224                                'search_terms'      => $search_terms,
    223225                                'meta_query'        => $meta_query,
    224226                                'date_query'        => $date_query,
     227                                'filter_query'      => $filter_query,
    225228                                'filter'            => $filter,
     229                                'scope'             => $scope,
    226230                                'show_hidden'       => $show_hidden,
    227231                                'exclude'           => $exclude,
    228232                                'in'                => $in,
     
    570574
    571575                'meta_query'        => false,        // filter on activity meta. See WP_Meta_Query for format
    572576                'date_query'        => false,        // filter by date. See first parameter of WP_Date_Query for format
     577                'filter_query'      => false,        // advanced filtering.  This overrides a lot of stuff.
    573578
    574579                // Searching
    575580                'search_terms'      => false,        // specify terms to search on
     
    594599        if ( empty( $search_terms ) && ! empty( $_REQUEST['s'] ) )
    595600                $search_terms = $_REQUEST['s'];
    596601
    597         // If you have passed a "scope" then this will override any filters you have passed.
    598         if ( 'just-me' == $scope || 'friends' == $scope || 'groups' == $scope || 'favorites' == $scope || 'mentions' == $scope ) {
    599                 if ( 'just-me' == $scope )
    600                         $display_comments = 'stream';
    601 
    602                 // determine which user_id applies
    603                 if ( empty( $user_id ) )
    604                         $user_id = bp_displayed_user_id() ? bp_displayed_user_id() : bp_loggedin_user_id();
    605 
    606                 // are we displaying user specific activity?
    607                 if ( is_numeric( $user_id ) ) {
    608                         $show_hidden = ( $user_id == bp_loggedin_user_id() && $scope != 'friends' ) ? 1 : 0;
    609 
    610                         switch ( $scope ) {
    611                                 case 'friends':
    612                                         if ( bp_is_active( 'friends' ) )
    613                                                 $friends = friends_get_friend_user_ids( $user_id );
    614                                                 if ( empty( $friends ) )
    615                                                         return false;
    616 
    617                                                 $user_id = implode( ',', (array) $friends );
    618                                         break;
    619                                 case 'groups':
    620                                         if ( bp_is_active( 'groups' ) ) {
    621                                                 $groups = groups_get_user_groups( $user_id );
    622                                                 if ( empty( $groups['groups'] ) )
    623                                                         return false;
    624 
    625                                                 $object = $bp->groups->id;
    626                                                 $primary_id = implode( ',', (array) $groups['groups'] );
    627 
    628                                                 $user_id = 0;
    629                                         }
    630                                         break;
    631                                 case 'favorites':
    632                                         $favs = bp_activity_get_user_favorites( $user_id );
    633                                         if ( empty( $favs ) )
    634                                                 return false;
    635 
    636                                         $in = implode( ',', (array) $favs );
    637                                         $display_comments = true;
    638                                         $user_id = 0;
    639                                         break;
    640                                 case 'mentions':
    641 
    642                                         // Are mentions disabled?
    643                                         if ( ! bp_activity_do_mentions() ) {
    644                                                 return false;
    645                                         }
    646 
    647                                         // Start search at @ symbol and stop search at closing tag delimiter.
    648                                         $search_terms     = '@' . bp_activity_get_user_mentionname( $user_id ) . '<';
    649                                         $display_comments = 'stream';
    650                                         $user_id = 0;
    651                                         break;
    652                         }
    653                 }
    654         }
    655 
    656602        // Do not exceed the maximum per page
    657603        if ( !empty( $max ) && ( (int) $per_page > (int) $max ) )
    658604                $per_page = $max;
     
    660606        // Support for basic filters in earlier BP versions is disabled by default. To enable, put
    661607        //   add_filter( 'bp_activity_enable_afilter_support', '__return_true' );
    662608        // into bp-custom.php or your theme's functions.php
    663         if ( isset( $_GET['afilter'] ) && apply_filters( 'bp_activity_enable_afilter_support', false ) )
     609        if ( isset( $_GET['afilter'] ) && apply_filters( 'bp_activity_enable_afilter_support', false ) ) {
    664610                $filter = array( 'object' => $_GET['afilter'] );
    665         else if ( ! empty( $user_id ) || ! empty( $object ) || ! empty( $action ) || ! empty( $primary_id ) || ! empty( $secondary_id ) || ! empty( $offset ) || ! empty( $since ) )
     611        } else if ( ! empty( $user_id ) || ! empty( $object ) || ! empty( $action ) || ! empty( $primary_id ) || ! empty( $secondary_id ) || ! empty( $offset ) || ! empty( $since ) ) {
    666612                $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id, 'offset' => $offset, 'since' => $since );
    667         else
     613        } else {
    668614                $filter = false;
     615        }
    669616
    670617        // If specific activity items have been requested, override the $hide_spam argument. This prevents backpat errors with AJAX.
    671         if ( !empty( $include ) && ( 'ham_only' == $spam ) )
     618        if ( !empty( $include ) && ( 'ham_only' == $spam ) ) {
    672619                $spam = 'all';
     620        }
    673621
    674622        $template_args = array(
    675623                'page'              => $page,
     
    681629                'exclude'           => $exclude,
    682630                'in'                => $in,
    683631                'filter'            => $filter,
     632                'scope'             => $scope,
    684633                'search_terms'      => $search_terms,
    685634                'meta_query'        => $meta_query,
    686635                'date_query'        => $date_query,
     636                'filter_query'      => $filter_query,
    687637                'display_comments'  => $display_comments,
    688638                'show_hidden'       => $show_hidden,
    689639                'spam'              => $spam,
  • src/bp-friends/bp-friends-activity.php

     
    207207add_filter( 'bp_activity_prefetch_object_data', 'bp_friends_prefetch_activity_object_data' );
    208208
    209209/**
     210 * Set up activity arguments for use with the 'friends' scope.
     211 *
     212 * @since BuddyPress (2.2.0)
     213 *
     214 * @param array $retval Empty array by default
     215 * @param array $filter Current activity arguments
     216 * @return array
     217 */
     218function bp_friends_filter_activity_scope( $retval, $filter ) {
     219        $friends = friends_get_friend_user_ids( $filter['user_id'] );
     220
     221        if ( empty( $friends ) ) {
     222                return $retval;
     223        }
     224
     225        $retval['user_id'] = implode( ',', (array) $friends );
     226
     227        // wipe out the user ID
     228        $retval['override']['filter']['user_id'] = 0;
     229
     230        return $retval;
     231}
     232add_filter( 'bp_activity_set_friends_scope_args', 'bp_friends_filter_activity_scope', 10, 2 );
     233
     234/**
    210235 * Add activity stream items when one members accepts another members request
    211236 * for virtual friendship.
    212237 *
  • src/bp-groups/bp-groups-activity.php

     
    178178add_filter( 'bp_activity_prefetch_object_data', 'bp_groups_prefetch_activity_object_data' );
    179179
    180180/**
     181 * Set up activity arguments for use with the 'groups' scope.
     182 *
     183 * @since BuddyPress (2.2.0)
     184 *
     185 * @param array $retval Empty array by default
     186 * @param array $filter Current activity arguments
     187 * @return array
     188 */
     189function bp_groups_filter_activity_scope( $retval, $filter ) {
     190        $groups = groups_get_user_groups( $filter['user_id'] );
     191
     192        if ( empty( $groups['groups'] ) ) {
     193                return $retval;
     194        }
     195
     196        $retval['component'] = buddypress()->groups->id;
     197        $retval['item_id']   = implode( ',', (array) $groups['groups'] );
     198
     199        // wipe out the user ID
     200        $retval['override']['filter']['user_id'] = 0;
     201
     202        return $retval;
     203}
     204add_filter( 'bp_activity_set_groups_scope_args', 'bp_groups_filter_activity_scope', 10, 2 );
     205
     206/**
    181207 * Record an activity item related to the Groups component.
    182208 *
    183209 * A wrapper for {@link bp_activity_add()} that provides some Groups-specific
  • tests/phpunit/testcases/activity/template.php

     
    117117        }
    118118
    119119        /**
     120         * @group scope
     121         */
     122        function test_bp_has_activities_multiple_scope() {
     123                $u1 = $this->create_user();
     124                $u2 = $this->create_user();
     125                $u3 = $this->create_user();
     126
     127                // user 1 becomes friends with user 2
     128                friends_add_friend( $u1, $u2, true );
     129
     130                // user 1 joins a group
     131                $g1 = $this->factory->group->create( array( 'creator_id' => $u1 ) );
     132
     133                $now = time();
     134
     135                // friend status update
     136                $a1 = $this->factory->activity->create( array(
     137                        'user_id' => $u2,
     138                        'type' => 'activity_update',
     139                        'recorded_time' => date( 'Y-m-d H:i:s', $now ),
     140                ) );
     141
     142                // group activity
     143                $a2 = $this->factory->activity->create( array(
     144                        'user_id'   => $u3,
     145                        'component' => 'groups',
     146                        'item_id'   => $g1,
     147                        'type'      => 'joined_group',
     148                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 100 ),
     149                ) );
     150
     151                // misc activity items
     152                $this->factory->activity->create( array(
     153                        'user_id'   => $u3,
     154                        'component' => 'blogs',
     155                        'item_id'   => 1,
     156                        'type'      => 'new_blog_post',
     157                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 100 ),
     158                ) );
     159                $this->factory->activity->create( array(
     160                        'user_id'   => $u3,
     161                        'component' => 'activity',
     162                        'type'      => 'activity_update',
     163                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 100 ),
     164                ) );
     165                $this->factory->activity->create( array(
     166                        'user_id'   => $u3,
     167                        'component' => 'groups',
     168                        'item_id'   => 324,
     169                        'type'      => 'activity_update',
     170                        'recorded_time' => date( 'Y-m-d H:i:s', $now - 100 ),
     171                ) );
     172
     173                // groan. It sucks that you have to invoke the global
     174                global $activities_template;
     175
     176                // grab activities from multiple scopes
     177                bp_has_activities( array(
     178                        'user_id' => $u1,
     179                        'scope' => 'groups,friends',
     180                ) );
     181
     182                // assert!
     183                $this->assertEqualSets( array( $a1, $a2 ), wp_list_pluck( $activities_template->activities, 'id' ) );
     184
     185                // clean up!
     186                $activities_template = null;
     187        }
     188
     189        /**
    120190         * Integration test for 'meta_query' param
    121191         */
    122192        function test_bp_has_activities_with_meta_query() {