Skip to:
Content

BuddyPress.org

Ticket #6418: member_type__not_in.diff

File member_type__not_in.diff, 7.8 KB (added by lakrisgubben, 10 years ago)
  • src/bp-core/classes/class-bp-user-query.php

     
    3838 *                                              override all others; BP User objects will be constructed using these
    3939 *                                              IDs only. Default: false.
    4040 *     @type array|string      $member_type     Array or comma-separated list of member types to limit results to.
     41 *     @type array|string      $member_type__not_in     Array or comma-separated list of member types that will be
     42 *                             excluded from results.
    4143 *     @type string|bool       $meta_key        Limit results to users that have usermeta associated with this meta_key.
    4244 *                                              Usually used with $meta_value. Default: false.
    4345 *     @type string|bool       $meta_value      When used with $meta_key, limits results to users whose usermeta value
     
    166168                                'exclude'         => false,
    167169                                'user_ids'        => false,
    168170                                'member_type'     => '',
     171                                'member_type__not_in' => '',
    169172                                'meta_key'        => false,
    170173                                'meta_value'      => false,
    171174                                'xprofile_query'  => false,
     
    466469                        }
    467470                }
    468471
     472                // Member type NOT IN.
     473                if ( ! empty( $member_type__not_in ) ) {
     474                        $member_types__not_in = array();
     475
     476                        if ( ! is_array( $member_type__not_in ) ) {
     477                                $member_type__not_in = preg_split( '/[,\s+]/', $member_type__not_in );
     478                        }
     479
     480                        foreach ( $member_type__not_in as $mtni ) {
     481                                if ( ! bp_get_member_type_object( $mtni ) ) {
     482                                        continue;
     483                                }
     484
     485                                $member_types__not_in[] = $mtni;
     486                        }
     487                        if ( ! empty( $member_types__not_in ) ) {
     488                                $member_type__not_in_tq = new WP_Tax_Query( array(
     489                                        array(
     490                                                'taxonomy' => 'bp_member_type',
     491                                                'field'    => 'name',
     492                                                'operator' => 'NOT IN',
     493                                                'terms'    => $member_types__not_in,
     494                                        ),
     495                                ) );
     496
     497                                // Switch to the root blog, where member type taxonomies live.
     498                                $switched = false;
     499                                if ( ! bp_is_root_blog() ) {
     500                                        switch_to_blog( bp_get_root_blog_id() );
     501                                        $switched = true;
     502                                }
     503
     504                                $member_type__not_in_sql_clauses = $member_type__not_in_tq->get_sql( 'u', $this->uid_name );
     505
     506                                if ( $switched ) {
     507                                        restore_current_blog();
     508                                }
     509
     510                                // Grab the first term_relationships clause and convert to a subquery.
     511                                if ( preg_match( '/term_taxonomy_id IN \([0-9, ]+\)/', $member_type__not_in_sql_clauses['where'], $matches ) ) {
     512                                        $sql['where']['member_type__not_in'] = "u.{$this->uid_name} NOT IN ( SELECT object_id FROM $wpdb->term_relationships WHERE {$matches[0]} )";
     513                                } elseif ( false !== strpos( $member_type__not_in_sql_clauses['where'], '0 = 1' ) ) {
     514                                        $sql['where']['member_type__not_in'] = $this->no_results['where'];
     515                                }
     516                        }
     517                }
     518
    469519                // 'meta_key', 'meta_value' allow usermeta search
    470520                // To avoid global joins, do a separate query
    471521                if ( false !== $meta_key ) {
  • src/bp-members/bp-members-functions.php

     
    8585 *     @type string       $meta_key        Limit to users with a meta_key. Default: false.
    8686 *     @type string       $meta_value      Limit to users with a meta_value (with meta_key). Default: false.
    8787 *     @type array|string $member_type     Array or comma-separated string of member types.
     88 *     @type array|string $member_type__not_in     Array or comma-separated string of member types to be excluded
    8889 *     @type mixed $include Limit results by user IDs. Default: false.
    8990 *     @type int          $per_page        Results per page. Default: 20.
    9091 *     @type int          $page            Page of results. Default: 1.
     
    104105                'meta_key'        => false,        // Limit to users who have this piece of usermeta
    105106                'meta_value'      => false,        // With meta_key, limit to users where usermeta matches this value
    106107                'member_type'     => '',
     108                'member_type__not_in' => '',
    107109                'include'         => false,        // Pass comma separated list of user_ids to limit to only these users
    108110                'per_page'        => 20,           // The number of results to return per page
    109111                'page'            => 1,            // The page to return if limiting per page
  • src/bp-members/bp-members-template.php

     
    289289         * @param array        $page_arg        Optional. The string used as a query parameter in pagination links.
    290290         *                                      Default: 'upage'.
    291291         * @param array|string $member_type     Array or comma-separated string of member types to limit results to.
     292         * @param array|string $member_type__not_in     Array or comma-separated string of member types to exclude from results.
    292293         */
    293         function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '' ) {
     294        function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '', $member_type__not_in = '' ) {
    294295
    295296                $this->pag_arg  = sanitize_key( $page_arg );
    296297                $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number );
     
    300301                if ( !empty( $_REQUEST['letter'] ) )
    301302                        $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude );
    302303                else
    303                         $this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type ) );
     304                        $this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type, 'member_type__not_in' => $member_type__not_in ) );
    304305
    305306                if ( !$max || $max >= (int) $this->members['total'] )
    306307                        $this->total_member_count = (int) $this->members['total'];
     
    494495 *                                                  user. When on a user's Friends page, defaults to the ID of the
    495496 *                                                  displayed user. Otherwise defaults to 0.
    496497 *     @type string|array          $member_type     Array or comma-separated list of member types to limit results to.
     498 *     @type string|array          $member_type__not_in     Array or comma-separated list of member types to exclude from results.
    497499 *     @type string                $search_terms    Limit results by a search term. Default: null.
    498500 *     @type string                $meta_key        Limit results by the presence of a usermeta key.
    499501 *           Default: false.
     
    539541
    540542                'user_id'         => $user_id, // Pass a user_id to only show friends of this user
    541543                'member_type'     => $member_type,
     544                'member_type__not_in'     => '',
    542545                'search_terms'    => null,     // Pass search_terms to filter users by their profile data
    543546
    544547                'meta_key'        => false,        // Only return users with this usermeta
     
    575578                $r['meta_key'],
    576579                $r['meta_value'],
    577580                $r['page_arg'],
    578                 $r['member_type']
     581                $r['member_type'],
     582                $r['member_type__not_in']
    579583        );
    580584
    581585        /**