Skip to:
Content

BuddyPress.org

Ticket #6418: member_type__not_in_2.diff

File member_type__not_in_2.diff, 9.9 KB (added by lakrisgubben, 9 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__in     Array or comma-separated list of member types to limit results to.
     42 *     @type array|string      $member_type__not_in     Array or comma-separated list of member types that will be
     43 *                             excluded from results.
    4144 *     @type string|bool       $meta_key        Limit results to users that have usermeta associated with this meta_key.
    4245 *                                              Usually used with $meta_value. Default: false.
    4346 *     @type string|bool       $meta_value      When used with $meta_key, limits results to users whose usermeta value
     
    166169                                'exclude'         => false,
    167170                                'user_ids'        => false,
    168171                                'member_type'     => '',
     172                                'member_type__in' => '',
     173                                'member_type__not_in' => '',
    169174                                'meta_key'        => false,
    170175                                'meta_value'      => false,
    171176                                'xprofile_query'  => false,
     
    418423                        );
    419424                }
    420425
    421                 // Member type.
    422                 if ( ! empty( $member_type ) ) {
     426                // If member_type is empty and member_type__in has a value asign
     427                // member_type__in to member_type
     428                if ( empty( $member_type ) && ! empty( $member_type__in ) ) {
     429                        $member_type = $member_type__in;
     430                }
     431
     432                // Member types.
     433                if ( ! empty( $member_type ) || ! empty( $member_type__not_in ) ) {
    423434                        $member_types = array();
     435                        $member_types__not_in = array();
    424436
    425437                        if ( ! is_array( $member_type ) ) {
    426438                                $member_type = preg_split( '/[,\s+]/', $member_type );
    427439                        }
     440                        if ( ! is_array( $member_type__not_in ) ) {
     441                                $member_type__not_in = preg_split( '/[,\s+]/', $member_type__not_in );
     442                        }
    428443
    429444                        foreach ( $member_type as $mt ) {
    430445                                if ( ! bp_get_member_type_object( $mt ) ) {
     
    433448
    434449                                $member_types[] = $mt;
    435450                        }
     451                        foreach ( $member_type__not_in as $mtni ) {
     452                                if ( ! bp_get_member_type_object( $mtni ) ) {
     453                                        continue;
     454                                }
    436455
     456                                $member_types__not_in[] = $mtni;
     457                        }
     458
    437459                        if ( ! empty( $member_types ) ) {
    438                                 $member_type_tq = new WP_Tax_Query( array(
    439                                         array(
    440                                                 'taxonomy' => 'bp_member_type',
    441                                                 'field'    => 'name',
    442                                                 'operator' => 'IN',
    443                                                 'terms'    => $member_types,
    444                                         ),
     460                                $member_type_tq = array(
     461                                        'taxonomy' => 'bp_member_type',
     462                                        'field'    => 'name',
     463                                        'operator' => 'IN',
     464                                        'terms'    => $member_types,
     465                                );
     466                        }
     467                        if ( ! empty( $member_types__not_in ) ) {
     468                                $member_type__not_in_tq =       array(
     469                                        'taxonomy' => 'bp_member_type',
     470                                        'field'    => 'name',
     471                                        'operator' => 'NOT IN',
     472                                        'terms'    => $member_types__not_in,
     473                                );
     474                        }
     475
     476                        if ( isset( $member_type_tq ) || isset( $member_type__not_in_tq ) ) {
     477                                $member_type_query = new WP_Tax_Query( array(
     478                                        isset( $member_type_tq ) ? $member_type_tq : '',
     479                                        isset( $member_type__not_in_tq ) ? $member_type__not_in_tq : '',
    445480                                ) );
    446481
    447482                                // Switch to the root blog, where member type taxonomies live.
     
    451486                                        $switched = true;
    452487                                }
    453488
    454                                 $member_type_sql_clauses = $member_type_tq->get_sql( 'u', $this->uid_name );
     489                                $member_type_sql_clauses = $member_type_query->get_sql( 'u', $this->uid_name );
    455490
    456491                                if ( $switched ) {
    457492                                        restore_current_blog();
     
    460495                                // Grab the first term_relationships clause and convert to a subquery.
    461496                                if ( preg_match( '/' . $wpdb->term_relationships . '\.term_taxonomy_id IN \([0-9, ]+\)/', $member_type_sql_clauses['where'], $matches ) ) {
    462497                                        $sql['where']['member_type'] = "u.{$this->uid_name} IN ( SELECT object_id FROM $wpdb->term_relationships WHERE {$matches[0]} )";
     498
    463499                                } elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) {
    464500                                        $sql['where']['member_type'] = $this->no_results['where'];
    465501                                }
     502                                if ( preg_match( '/WHERE term_taxonomy_id IN \([0-9, ]+\)/', $member_type_sql_clauses['where'], $matches ) ) {
     503                                        $sql['where']['member_type__not_in'] = "u.{$this->uid_name} NOT IN ( SELECT object_id FROM $wpdb->term_relationships {$matches[0]} )";
     504                                } elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) {
     505                                        $sql['where']['member_type__not_in'] = $this->no_results['where'];
     506                                }
    466507                        }
    467508                }
    468509
  • 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__in     Array or comma-separated string of member types.
     89 *     @type array|string $member_type__not_in     Array or comma-separated string of member types to be excluded
    8890 *     @type mixed $include Limit results by user IDs. Default: false.
    8991 *     @type int          $per_page        Results per page. Default: 20.
    9092 *     @type int          $page            Page of results. Default: 1.
     
    104106                'meta_key'        => false,        // Limit to users who have this piece of usermeta
    105107                'meta_value'      => false,        // With meta_key, limit to users where usermeta matches this value
    106108                'member_type'     => '',
     109                'member_type__in'     => '',
     110                'member_type__not_in' => '',
    107111                'include'         => false,        // Pass comma separated list of user_ids to limit to only these users
    108112                'per_page'        => 20,           // The number of results to return per page
    109113                '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__in     Array or comma-separated string of member types to limit results to.
     293         * @param array|string $member_type__not_in     Array or comma-separated string of member types to exclude from results.
    292294         */
    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 = '' ) {
     295        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__in = '', $member_type__not_in = '' ) {
    294296
    295297                $this->pag_arg  = sanitize_key( $page_arg );
    296298                $this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number );
     
    300302                if ( !empty( $_REQUEST['letter'] ) )
    301303                        $this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude );
    302304                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 ) );
     305                        $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__in' => $member_type__in, 'member_type__not_in' => $member_type__not_in ) );
    304306
    305307                if ( !$max || $max >= (int) $this->members['total'] )
    306308                        $this->total_member_count = (int) $this->members['total'];
     
    494496 *                                                  user. When on a user's Friends page, defaults to the ID of the
    495497 *                                                  displayed user. Otherwise defaults to 0.
    496498 *     @type string|array          $member_type     Array or comma-separated list of member types to limit results to.
     499 *     @type string|array          $member_type__in     Array or comma-separated list of member types to limit results to.
     500 *     @type string|array          $member_type__not_in     Array or comma-separated list of member types to exclude from results.
    497501 *     @type string                $search_terms    Limit results by a search term. Default: null.
    498502 *     @type string                $meta_key        Limit results by the presence of a usermeta key.
    499503 *           Default: false.
     
    539543
    540544                'user_id'         => $user_id, // Pass a user_id to only show friends of this user
    541545                'member_type'     => $member_type,
     546                'member_type__in'     => '',
     547                'member_type__not_in'     => '',
    542548                'search_terms'    => null,     // Pass search_terms to filter users by their profile data
    543549
    544550                'meta_key'        => false,        // Only return users with this usermeta
     
    575581                $r['meta_key'],
    576582                $r['meta_value'],
    577583                $r['page_arg'],
    578                 $r['member_type']
     584                $r['member_type'],
     585                $r['member_type__in'],
     586                $r['member_type__not_in']
    579587        );
    580588
    581589        /**