Ticket #4988: 4988.01.patch
| File 4988.01.patch, 25.8 KB (added by , 12 years ago) |
|---|
-
src/bp-activity/bp-activity-classes.php
312 312 'in' => false, // Array of ids to limit query by (IN) 313 313 'meta_query' => false, // Filter by activitymeta 314 314 'date_query' => false, // Filter by date 315 'filter_query' => false, // Advanced filtering - see BP_Activity_Query 315 316 'filter' => false, // See self::get_filter_sql() 317 'scope' => false, // Preset activity arguments 316 318 'search_terms' => false, // Terms to search by 317 319 'display_comments' => false, // Whether to include activity comments 318 320 'show_hidden' => false, // Show items marked hide_sitewide … … 321 323 'count_total' => false, 322 324 ); 323 325 $r = wp_parse_args( $args, $defaults ); 324 extract( $r );325 326 326 327 // Select conditions 327 328 $select_sql = "SELECT DISTINCT a.id"; … … 336 337 // Excluded types 337 338 $excluded_types = array(); 338 339 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 339 366 // Spam 340 if ( 'ham_only' == $ spam )367 if ( 'ham_only' == $r['spam'] ) { 341 368 $where_conditions['spam_sql'] = 'a.is_spam = 0'; 342 elseif ( 'spam_only' == $spam )369 } elseif ( 'spam_only' == $spam ) { 343 370 $where_conditions['spam_sql'] = 'a.is_spam = 1'; 371 } 344 372 345 373 // 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'] ) . '%'; 348 376 $where_conditions['search_sql'] = $wpdb->prepare( 'a.content LIKE %s', $search_terms_like ); 349 377 } 350 378 351 // Filtering352 if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )353 $where_conditions['filter_sql'] = $filter_sql;354 355 379 // Sorting 356 if ( $sort != 'ASC' && $sort != 'DESC' ) 380 $sort = $r['sort']; 381 if ( $sort != 'ASC' && $sort != 'DESC' ) { 357 382 $sort = 'DESC'; 383 } 358 384 359 385 // Hide Hidden Items? 360 if ( ! $show_hidden)386 if ( ! $r['show_hidden'] ) 361 387 $where_conditions['hidden_sql'] = "a.hide_sitewide = 0"; 362 388 363 389 // 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'] ) ); 366 392 $where_conditions['exclude'] = "a.id NOT IN ({$exclude})"; 367 393 } 368 394 369 395 // 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'] ) ); 372 398 $where_conditions['in'] = "a.id IN ({$in})"; 373 399 } 374 400 375 401 // 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'] ); 377 403 378 404 if ( ! empty( $meta_query_sql['join'] ) ) { 379 405 $join_sql .= $meta_query_sql['join']; … … 384 410 } 385 411 386 412 // 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'] ); 388 414 389 415 if ( ! empty( $date_query_sql ) ) { 390 416 $where_conditions['date'] = $date_query_sql; … … 393 419 // Alter the query based on whether we want to show activity item 394 420 // comments in the stream like normal comments or threaded below 395 421 // the activity. 396 if ( false === $ display_comments || 'threaded' === $display_comments) {422 if ( false === $r['display_comments'] || 'threaded' === $r['display_comments'] ) { 397 423 $excluded_types[] = 'activity_comment'; 398 424 } 399 425 400 426 // Exclude 'last_activity' items unless the 'action' filter has 401 427 // been explicitly set 402 if ( empty( $ filter['object'] ) ) {428 if ( empty( $r['filter']['object'] ) ) { 403 429 $excluded_types[] = 'last_activity'; 404 430 } 405 431 … … 437 463 } 438 464 439 465 // 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'] ); 442 468 443 469 $retval = array( 444 470 'activities' => null, … … 495 521 $activity_ids[] = $activity->id; 496 522 } 497 523 498 if ( ! empty( $activity_ids ) && $ update_meta_cache) {524 if ( ! empty( $activity_ids ) && $r['update_meta_cache'] ) { 499 525 bp_activity_update_meta_cache( $activity_ids ); 500 526 } 501 527 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 } 504 531 505 532 // Pre-fetch data associated with activity users and other objects 506 533 BP_Activity_Activity::prefetch_object_data( $activities ); … … 516 543 $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 ); 517 544 $total_activities = $wpdb->get_var( $total_activities_sql ); 518 545 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']; 522 549 } 523 550 524 551 $retval['total'] = $total_activities; … … 737 764 } 738 765 739 766 /** 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 /** 740 890 * In BuddyPress 1.2.x, this was used to retrieve specific activity stream items (for example, on an activity's permalink page). 741 891 * 742 892 * As of 1.5.x, use BP_Activity_Activity::get() with an 'in' parameter instead. … … 1395 1545 } 1396 1546 1397 1547 /** 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 */ 1554 class 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 /** 1398 1692 * Create a RSS feed using the activity component. 1399 1693 * 1400 1694 * You should only construct a new feed when you've validated that you're on -
src/bp-activity/bp-activity-functions.php
1020 1020 'search_terms' => false, // Pass search terms as a string 1021 1021 'meta_query' => false, // Filter by activity meta. See WP_Meta_Query for format 1022 1022 'date_query' => false, // Filter by date. See first parameter of WP_Date_Query for format 1023 'filter_query' => false, 1023 1024 'show_hidden' => false, // Show activity items that are hidden site-wide? 1024 1025 'exclude' => false, // Comma-separated list of activity IDs to exclude 1025 1026 'in' => false, // Comma-separated list or array of activity IDs to which you want to limit the query 1026 1027 'spam' => 'ham_only', // 'ham_only' (default), 'spam_only' or 'all'. 1027 1028 'update_meta_cache' => true, 1028 1029 'count_total' => false, 1030 'scope' => false, 1029 1031 1030 1032 /** 1031 1033 * Pass filters as an array -- all filter items can be multiple values comma separated: … … 1041 1043 ) ); 1042 1044 1043 1045 // 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'] ) ) { 1045 1047 1046 1048 $activity = wp_cache_get( 'bp_activity_sitewide_front', 'bp' ); 1047 1049 if ( false === $activity ) { … … 1054 1056 'search_terms' => $r['search_terms'], 1055 1057 'meta_query' => $r['meta_query'], 1056 1058 'date_query' => $r['date_query'], 1059 'filter_query' => $r['filter_query'], 1057 1060 'filter' => $r['filter'], 1061 'scope' => $r['scope'], 1058 1062 'display_comments' => $r['display_comments'], 1059 1063 'show_hidden' => $r['show_hidden'], 1060 1064 'spam' => $r['spam'], … … 1074 1078 'search_terms' => $r['search_terms'], 1075 1079 'meta_query' => $r['meta_query'], 1076 1080 'date_query' => $r['date_query'], 1081 'filter_query' => $r['filter_query'], 1077 1082 'filter' => $r['filter'], 1083 'scope' => $r['scope'], 1078 1084 'display_comments' => $r['display_comments'], 1079 1085 'show_hidden' => $r['show_hidden'], 1080 1086 'exclude' => $r['exclude'], -
src/bp-activity/bp-activity-template.php
176 176 'exclude' => false, 177 177 'in' => false, 178 178 'filter' => false, 179 'scope' => false, 179 180 'search_terms' => false, 180 181 'meta_query' => false, 181 182 'date_query' => false, 183 'filter_query' => false, 182 184 'display_comments' => 'threaded', 183 185 'show_hidden' => false, 184 186 'spam' => 'ham_only', … … 222 224 'search_terms' => $search_terms, 223 225 'meta_query' => $meta_query, 224 226 'date_query' => $date_query, 227 'filter_query' => $filter_query, 225 228 'filter' => $filter, 229 'scope' => $scope, 226 230 'show_hidden' => $show_hidden, 227 231 'exclude' => $exclude, 228 232 'in' => $in, … … 570 574 571 575 'meta_query' => false, // filter on activity meta. See WP_Meta_Query for format 572 576 '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. 573 578 574 579 // Searching 575 580 'search_terms' => false, // specify terms to search on … … 594 599 if ( empty( $search_terms ) && ! empty( $_REQUEST['s'] ) ) 595 600 $search_terms = $_REQUEST['s']; 596 601 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 applies603 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 656 602 // Do not exceed the maximum per page 657 603 if ( !empty( $max ) && ( (int) $per_page > (int) $max ) ) 658 604 $per_page = $max; … … 660 606 // Support for basic filters in earlier BP versions is disabled by default. To enable, put 661 607 // add_filter( 'bp_activity_enable_afilter_support', '__return_true' ); 662 608 // 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 ) ) { 664 610 $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 ) ) { 666 612 $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id, 'offset' => $offset, 'since' => $since ); 667 else613 } else { 668 614 $filter = false; 615 } 669 616 670 617 // 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 ) ) { 672 619 $spam = 'all'; 620 } 673 621 674 622 $template_args = array( 675 623 'page' => $page, … … 681 629 'exclude' => $exclude, 682 630 'in' => $in, 683 631 'filter' => $filter, 632 'scope' => $scope, 684 633 'search_terms' => $search_terms, 685 634 'meta_query' => $meta_query, 686 635 'date_query' => $date_query, 636 'filter_query' => $filter_query, 687 637 'display_comments' => $display_comments, 688 638 'show_hidden' => $show_hidden, 689 639 'spam' => $spam, -
src/bp-friends/bp-friends-activity.php
207 207 add_filter( 'bp_activity_prefetch_object_data', 'bp_friends_prefetch_activity_object_data' ); 208 208 209 209 /** 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 */ 218 function 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 } 232 add_filter( 'bp_activity_set_friends_scope_args', 'bp_friends_filter_activity_scope', 10, 2 ); 233 234 /** 210 235 * Add activity stream items when one members accepts another members request 211 236 * for virtual friendship. 212 237 * -
src/bp-groups/bp-groups-activity.php
178 178 add_filter( 'bp_activity_prefetch_object_data', 'bp_groups_prefetch_activity_object_data' ); 179 179 180 180 /** 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 */ 189 function 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 } 204 add_filter( 'bp_activity_set_groups_scope_args', 'bp_groups_filter_activity_scope', 10, 2 ); 205 206 /** 181 207 * Record an activity item related to the Groups component. 182 208 * 183 209 * A wrapper for {@link bp_activity_add()} that provides some Groups-specific -
tests/phpunit/testcases/activity/template.php
117 117 } 118 118 119 119 /** 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 /** 120 190 * Integration test for 'meta_query' param 121 191 */ 122 192 function test_bp_has_activities_with_meta_query() {