Skip to:
Content

BuddyPress.org

Changeset 6948


Ignore:
Timestamp:
04/26/2013 05:46:44 PM (13 years ago)
Author:
boonebgorges
Message:

Introduces meta_query paramater for bp_has_activities() stack

This will allow plugin and theme authors to filter the contents of the activity
stream based on information stored in the activitymeta table, using the
powerful meta_query syntax familiar from the 'meta_query' WP_Query param.

Also adds unit test for 'meta_query' in BP_Activity_Activity::get(), and
integration test for bp_has_activities(). These tests are primarily designed
to ensure that our param gets passed properly down the stack; we rely on WP
to get the meta_query logic right.

See #3521

Props ericlewis

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-activity/bp-activity-classes.php

    r6592 r6948  
    145145                        'exclude'          => false,      // Array of ids to exclude
    146146                        'in'               => false,      // Array of ids to limit query by (IN)
     147                        'meta_query'       => false,      // Filter by activitymeta
    147148                        'filter'           => false,      // See self::get_filter_sql()
    148149                        'search_terms'     => false,      // Terms to search by
    … …  
    159160                $from_sql = " FROM {$bp->activity->table_name} a LEFT JOIN {$wpdb->users} u ON a.user_id = u.ID";
    160161
     162                $join_sql = '';
     163
    161164                // Where conditions
    162165                $where_conditions = array();
    … …  
    198201                }
    199202
     203                // Process meta_query into SQL
     204                $meta_query_sql = self::get_meta_query_sql( $meta_query );
     205
     206                if ( ! empty( $meta_query_sql['join'] ) ) {
     207                        $join_sql .= $meta_query_sql['join'];
     208                }
     209
     210                if ( ! empty( $meta_query_sql['where'] ) ) {
     211                        $where_conditions[] = $meta_query_sql['where'];
     212                }
     213
    200214                // Alter the query based on whether we want to show activity item
    201215                // comments in the stream like normal comments or threaded below
    … …  
    229243
    230244                        $pag_sql    = $wpdb->prepare( "LIMIT %d, %d", absint( ( $page - 1 ) * $per_page ), $per_page );
    231                         $activities = $wpdb->get_results( apply_filters( 'bp_activity_get_user_join_filter', "{$select_sql} {$from_sql} {$where_sql} ORDER BY a.date_recorded {$sort} {$pag_sql}", $select_sql, $from_sql, $where_sql, $sort, $pag_sql ) );
     245                        $activities = $wpdb->get_results( apply_filters( 'bp_activity_get_user_join_filter', "{$select_sql} {$from_sql} {$join_sql} {$where_sql} ORDER BY a.date_recorded {$sort} {$pag_sql}", $select_sql, $from_sql, $where_sql, $sort, $pag_sql ) );
    232246                } else {
    233                         $activities = $wpdb->get_results( apply_filters( 'bp_activity_get_user_join_filter', "{$select_sql} {$from_sql} {$where_sql} ORDER BY a.date_recorded {$sort}", $select_sql, $from_sql, $where_sql, $sort ) );
    234                 }
    235 
    236                 $total_activities_sql = apply_filters( 'bp_activity_total_activities_sql', "SELECT count(a.id) FROM {$bp->activity->table_name} a {$index_hint_sql} {$where_sql} ORDER BY a.date_recorded {$sort}", $where_sql, $sort );
     247                        $activities = $wpdb->get_results( apply_filters( 'bp_activity_get_user_join_filter', "{$select_sql} {$from_sql} {$join_sql} {$where_sql} ORDER BY a.date_recorded {$sort}", $select_sql, $from_sql, $where_sql, $sort ) );
     248                }
     249
     250                $total_activities_sql = apply_filters( 'bp_activity_total_activities_sql', "SELECT count(a.id) FROM {$bp->activity->table_name} a {$index_hint_sql} {$join_sql} {$where_sql} ORDER BY a.date_recorded {$sort}", $where_sql, $sort );
    237251
    238252                $total_activities = $wpdb->get_var( $total_activities_sql );
    … …  
    283297
    284298                return array( 'activities' => $activities, 'total' => (int) $total_activities );
     299        }
     300
     301        /**
     302         * Get the SQL for the 'meta_query' param in BP_Activity_Activity::get()
     303         *
     304         * We use WP_Meta_Query to do the heavy lifting of parsing the
     305         * meta_query array and creating the necessary SQL clauses. However,
     306         * since BP_Activity_Activity::get() builds its SQL differently than
     307         * WP_Query, we have to alter the return value (stripping the leading
     308         * AND keyword from the 'where' clause).
     309         *
     310         * @since 1.8
     311         *
     312         * @param array $meta_query An array of meta_query filters. See the
     313         *   documentation for WP_Meta_Query for details.
     314         * @return array $sql_array 'join' and 'where' clauses
     315         */
     316        public static function get_meta_query_sql( $meta_query = array() ) {
     317                global $wpdb;
     318
     319                $sql_array = array(
     320                        'join'  => '',
     321                        'where' => '',
     322                );
     323
     324                if ( ! empty( $meta_query ) ) {
     325                        $activity_meta_query = new WP_Meta_Query( $meta_query );
     326
     327                        // WP_Meta_Query expects the table name at
     328                        // $wpdb->activitymeta
     329                        $wpdb->activitymeta = buddypress()->activity->table_name_meta;
     330
     331                        $meta_sql = $activity_meta_query->get_sql( 'activity', 'a', 'id' );
     332
     333                        // Strip the leading AND - BP handles it in get()
     334                        $sql_array['where'] = preg_replace( '/^\sAND/', '', $meta_sql['where'] );
     335                        $sql_array['join']  = $meta_sql['join'];
     336                }
     337
     338                return $sql_array;
    285339        }
    286340
  • trunk/bp-activity/bp-activity-functions.php

    r6925 r6948  
    882882
    883883                'search_terms'     => false,        // Pass search terms as a string
     884                'meta_query'       => false,        // Filter by activity meta. See WP_Meta_Query for format
    884885                'show_hidden'      => false,        // Show activity items that are hidden site-wide?
    885886                'exclude'          => false,        // Comma-separated list of activity IDs to exclude
    … …  
    903904
    904905        // Attempt to return a cached copy of the first page of sitewide activity.
    905         if ( 1 == (int) $page && empty( $max ) && empty( $search_terms ) && empty( $filter ) && empty( $exclude ) && empty( $in ) && 'DESC' == $sort && empty( $exclude ) && 'ham_only' == $spam ) {
     906        if ( 1 == (int) $page && empty( $max ) && empty( $search_terms ) && empty( $meta_query ) && empty( $filter ) && empty( $exclude ) && empty( $in ) && 'DESC' == $sort && empty( $exclude ) && 'ham_only' == $spam ) {
    906907                if ( !$activity = wp_cache_get( 'bp_activity_sitewide_front', 'bp' ) ) {
    907908                        $args = array(
    … …  
    911912                                'sort'             => $sort,
    912913                                'search_terms'     => $search_terms,
     914                                'meta_query'       => $meta_query,
    913915                                'filter'           => $filter,
    914916                                'display_comments' => $display_comments,
    … …  
    927929                        'sort'             => $sort,
    928930                        'search_terms'     => $search_terms,
     931                        'meta_query'       => $meta_query,
    929932                        'filter'           => $filter,
    930933                        'display_comments' => $display_comments,
  • trunk/bp-activity/bp-activity-template.php

    r6926 r6948  
    151151                        'filter'           => false,
    152152                        'search_terms'     => false,
     153                        'meta_query'       => false,
    153154                        'display_comments' => 'threaded',
    154155                        'show_hidden'      => false,
    … …  
    173174                // Fetch all activity items
    174175                else
    175                         $this->activities = bp_activity_get( array( 'display_comments' => $display_comments, 'max' => $max, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'sort' => $sort, 'search_terms' => $search_terms, 'filter' => $filter, 'show_hidden' => $show_hidden, 'exclude' => $exclude, 'in' => $in, 'spam' => $spam ) );
     176                        $this->activities = bp_activity_get( array( 'display_comments' => $display_comments, 'max' => $max, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'sort' => $sort, 'search_terms' => $search_terms, 'meta_query' => $meta_query, 'filter' => $filter, 'show_hidden' => $show_hidden, 'exclude' => $exclude, 'in' => $in, 'spam' => $spam ) );
    176177
    177178                if ( !$max || $max >= (int) $this->activities['total'] )
    … …  
    362363                'secondary_id'     => false,        // secondary object ID to filter on e.g. a post_id
    363364
     365                'meta_query'       => false,        // filter on activity meta. See WP_Meta_Query for format
     366
    364367                // Searching
    365368                'search_terms'     => false         // specify terms to search on
    … …  
    455458                'filter'           => $filter,
    456459                'search_terms'     => $search_terms,
     460                'meta_query'       => $meta_query,
    457461                'display_comments' => $display_comments,
    458462                'show_hidden'      => $show_hidden,
  • trunk/tests/testcases/activity/class.BP_Activity_Activity.php

    r6907 r6948  
    7373                $this->assertEquals( $activity['activities'][0]->hide_sitewide, 1 );
    7474        }
     75
     76        public function test_get_meta_query() {
     77                $a1 = $this->factory->activity->create();
     78                $a2 = $this->factory->activity->create();
     79                bp_activity_update_meta( $a1->id, 'foo', 'bar' );
     80
     81                $activity = BP_Activity_Activity::get( array(
     82                        'meta_query' => array(
     83                                array(
     84                                        'key' => 'foo',
     85                                        'value' => 'bar',
     86                                ),
     87                        ),
     88                ) );
     89                $ids = wp_list_pluck( $activity['activities'], 'id' );
     90                $this->assertEquals( $ids, array( $a1->id ) );
     91        }
    7592}
  • trunk/tests/testcases/activity/template.php

    r6926 r6948  
    111111                $activities_template = null;
    112112        }
     113
     114        /**
     115         * Integration test for 'meta_query' param
     116         */
     117        function test_bp_has_activities_with_meta_query() {
     118                $a1 = $this->factory->activity->create();
     119                $a2 = $this->factory->activity->create();
     120                bp_activity_update_meta( $a1->id, 'foo', 'bar' );
     121
     122                global $activities_template;
     123                bp_has_activities( array(
     124                        'meta_query' => array(
     125                                array(
     126                                        'key' => 'foo',
     127                                        'value' => 'bar',
     128                                ),
     129                        ),
     130                ) );
     131
     132                $ids = wp_list_pluck( $activities_template->activities, 'id' );
     133                $this->assertEquals( $ids, array( $a1->id ) );
     134        }
    113135}
Note: See TracChangeset for help on using the changeset viewer.