Skip to:
Content

BuddyPress.org

Ticket #6060: 6060.4.patch

File 6060.4.patch, 12.4 KB (added by dcavins, 4 years ago)

Add a "No Member Type" option to dropdown to remove types.

  • src/bp-core/bp-core-taxonomy.php

    diff --git src/bp-core/bp-core-taxonomy.php src/bp-core/bp-core-taxonomy.php
    index 673259d..8f93e44 100644
    defined( 'ABSPATH' ) || exit; 
    2121 */
    2222function bp_register_default_taxonomies() {
    2323        // Member Type.
    24         register_taxonomy( 'bp_member_type', 'user', array(
     24        register_taxonomy( bp_get_member_type_tax_name(), 'user', array(
    2525                'public' => false,
    2626        ) );
    2727
  • src/bp-core/classes/class-bp-user-query.php

    diff --git src/bp-core/classes/class-bp-user-query.php src/bp-core/classes/class-bp-user-query.php
    index 95aab0c..6e99b76 100644
    class BP_User_Query { 
    780780
    781781                $tax_query = new WP_Tax_Query( array(
    782782                        array(
    783                                 'taxonomy' => 'bp_member_type',
     783                                'taxonomy' => bp_get_member_type_tax_name(),
    784784                                'field'    => 'name',
    785785                                'operator' => $operator,
    786786                                'terms'    => $types,
    class BP_User_Query { 
    788788                ) );
    789789
    790790                // Switch to the root blog, where member type taxonomies live.
    791                 $site_id  = bp_get_taxonomy_term_site_id( 'bp_member_type' );
     791                $site_id  = bp_get_taxonomy_term_site_id( bp_get_member_type_tax_name() );
    792792                $switched = false;
    793793                if ( $site_id !== get_current_blog_id() ) {
    794794                        switch_to_blog( $site_id );
  • src/bp-members/bp-members-cache.php

    diff --git src/bp-members/bp-members-cache.php src/bp-members/bp-members-cache.php
    index 49b4b50..4dea407 100644
    defined( 'ABSPATH' ) || exit; 
    2020function bp_members_prefetch_member_type( BP_User_Query $bp_user_query ) {
    2121        $uncached_member_ids = bp_get_non_cached_ids( $bp_user_query->user_ids, 'bp_member_member_type' );
    2222
    23         $member_types = bp_get_object_terms( $uncached_member_ids, 'bp_member_type', array(
     23        $member_types = bp_get_object_terms( $uncached_member_ids, bp_get_member_type_tax_name(), array(
    2424                'fields' => 'all_with_object_id',
    2525        ) );
    2626
  • src/bp-members/bp-members-functions.php

    diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
    index 8ee5a6d..28ea7bf 100644
    function bp_get_displayed_user() { 
    25062506/** Member Types *************************************************************/
    25072507
    25082508/**
     2509 * Output the slug of the member type taxonomy.
     2510 *
     2511 * @since 2.7.0
     2512 */
     2513function bp_member_type_tax_name() {
     2514        echo bp_get_member_type_tax_name();
     2515}
     2516
     2517        /**
     2518         * Return the slug of the member type taxonomy.
     2519         *
     2520         * @since 2.7.0
     2521         *
     2522         * @return string The unique member taxonomy slug.
     2523         */
     2524        function bp_get_member_type_tax_name() {
     2525                /**
     2526                 * Filters the slug of the member type taxonomy.
     2527                 *
     2528                 * @since 2.7.0
     2529                 *
     2530                 * @param string $value Member type taxonomy slug.
     2531                 */
     2532                return apply_filters( 'bp_get_member_type_tax_name', 'bp_member_type' );
     2533        }
     2534
     2535/**
    25092536 * Register a member type.
    25102537 *
    25112538 * @since 2.2.0
    function bp_set_member_type( $user_id, $member_type, $append = false ) { 
    26762703                return false;
    26772704        }
    26782705
    2679         $retval = bp_set_object_terms( $user_id, $member_type, 'bp_member_type', $append );
     2706        $retval = bp_set_object_terms( $user_id, $member_type, bp_get_member_type_tax_name(), $append );
    26802707
    26812708        // Bust the cache if the type has been updated.
    26822709        if ( ! is_wp_error( $retval ) ) {
    function bp_remove_member_type( $user_id, $member_type ) { 
    27122739                return false;
    27132740        }
    27142741
    2715         $deleted = bp_remove_object_terms( $user_id, $member_type, 'bp_member_type' );
     2742        $deleted = bp_remove_object_terms( $user_id, $member_type, bp_get_member_type_tax_name() );
    27162743
    27172744        // Bust the cache if the type has been removed.
    27182745        if ( ! is_wp_error( $deleted ) ) {
    function bp_get_member_type( $user_id, $single = true ) { 
    27472774        $types = wp_cache_get( $user_id, 'bp_member_member_type' );
    27482775
    27492776        if ( false === $types ) {
    2750                 $types = bp_get_object_terms( $user_id, 'bp_member_type' );
     2777                $types = bp_get_object_terms( $user_id, bp_get_member_type_tax_name() );
    27512778
    27522779                if ( ! is_wp_error( $types ) ) {
    27532780                        $types = wp_list_pluck( $types, 'name' );
  • src/bp-members/classes/class-bp-members-admin.php

    diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php
    index 1493087..9feb3cb 100644
    class BP_Members_Admin { 
    215215                                add_filter( 'set-screen-option',    array( $this, 'signup_screen_options' ), 10, 3 );
    216216                        }
    217217                }
     218
     219                /** Users List - Members Types ***************************************
     220                 */
     221
     222                if ( is_admin() && ! empty( bp_get_member_types() ) ) {
     223
     224                        // Add "Change type" select WP admin users list table and process bulk members type changes.
     225                        add_action( 'restrict_manage_users', array( $this, 'users_table_output_type_change_select' ) );
     226                        add_action( 'load-users.php',        array( $this, 'users_table_process_bulk_type_change'  ) );
     227
     228                        // Add the member type column to the WP admin users list table.
     229                        add_filter( 'manage_users_columns',       array( $this, 'users_table_add_type_column'    )        );
     230                        add_filter( 'manage_users_custom_column', array( $this, 'users_table_populate_type_cell' ), 10, 3 );
     231
     232                        // Filter WP admin users list table to include users of the specified type.
     233                        add_filter( 'pre_get_users', array( $this, 'users_table_filter_by_type' ) );
     234                }
    218235        }
    219236
    220237        /**
    class BP_Members_Admin { 
    19051922         * @since 2.0.0
    19061923         *
    19071924         * @param string $action Delete, activate, or resend activation link.
     1925         *
    19081926         * @return string
    19091927         */
    19101928        public function signups_admin_manage( $action = '' ) {
    class BP_Members_Admin { 
    20322050
    20332051                <?php
    20342052        }
     2053
     2054        /** Users List Management ****************************************************/
     2055
     2056        /**
     2057         * Display a dropdown to bulk change the member type of selected user(s).
     2058         *
     2059         * @since 2.7.0
     2060         *
     2061         * @param string $which Where this dropdown is displayed - top or bottom.
     2062         */
     2063        public function users_table_output_type_change_select( $which ) {
     2064                $id_name = 'bottom' === $which ? 'bp_change_type2' : 'bp_change_type';
     2065
     2066                // Bail if current user cannot promote users.
     2067                if ( ! current_user_can( 'promote_users' ) ) {
     2068                        return;
     2069                }
     2070
     2071                $types = bp_get_member_types( array(), 'objects' ); ?>
     2072
     2073                <label class="screen-reader-text" for="<?php echo $id_name; ?>"><?php _e( 'Change member type to&hellip;', 'buddypress' ) ?></label>
     2074                <select name="<?php echo $id_name; ?>" id="<?php echo $id_name; ?>" style="display:inline-block;float:none;">
     2075                        <option value=""><?php _e( 'Change member type to&hellip;', 'buddypress' ) ?></option>
     2076
     2077                        <?php foreach( $types as $type ) : ?>
     2078
     2079                                <option value="<?php echo esc_attr( $type->name ); ?>"><?php echo $type->labels['name']; ?></option>
     2080
     2081                        <?php endforeach; ?>
     2082
     2083                        <option value="remove_member_type"><?php _e( 'No Member Type', 'buddypress' ) ?></option>
     2084
     2085                </select>
     2086                <?php
     2087                wp_nonce_field( 'bp-bulk-users-change-type-' . bp_loggedin_user_id(), 'bp-bulk-users-change-type-nonce' );
     2088                submit_button( __( 'Change', 'buddypress' ), 'button', 'bp_change_member_type', false );
     2089        }
     2090
     2091        /**
     2092         * Process bulk member type change submission from the WP admin users list table.
     2093         *
     2094         * @since 2.7.0
     2095         */
     2096        public function users_table_process_bulk_type_change() {
     2097                $this->users_type_change_notice();
     2098
     2099                // Bail if no users specified.
     2100                if ( empty( $_REQUEST['users'] ) ) {
     2101                        return;
     2102                }
     2103
     2104                // Bail if this isn't a BuddyPress action.
     2105                if ( ( empty( $_REQUEST['bp_change_type'] ) && empty( $_REQUEST['bp_change_type2'] ) )
     2106                        || empty( $_REQUEST['bp_change_member_type'] )
     2107                ) {
     2108                        return;
     2109                }
     2110
     2111                // Bail if nonce check fails.
     2112                check_admin_referer( 'bp-bulk-users-change-type-' . bp_loggedin_user_id(), 'bp-bulk-users-change-type-nonce' );
     2113
     2114                // Bail if current user cannot promote users.
     2115                if ( ! current_user_can( 'promote_users' ) ) {
     2116                        return;
     2117                }
     2118
     2119                // Bail if the new type is empty.
     2120                $new_type = '';
     2121                if ( ! empty( $_REQUEST['bp_change_type2'] ) ) {
     2122                        $new_type = sanitize_text_field( $_REQUEST['bp_change_type2'] );
     2123                } elseif ( ! empty( $_REQUEST['bp_change_type'] ) ) {
     2124                        $new_type = sanitize_text_field( $_REQUEST['bp_change_type'] );
     2125                }
     2126
     2127                // Check that the selected type actually exists.
     2128                if ( 'remove_member_type' != $new_type && is_null( bp_get_member_type_object( $new_type ) ) ) {
     2129                        return;
     2130                }
     2131
     2132                // Run through user ids.
     2133                $error = false;
     2134                foreach ( (array) $_REQUEST['users'] as $user_id ) {
     2135                        $user_id = (int) $user_id;
     2136
     2137                        // Get the old member type to check against.
     2138                        $member_type = bp_get_member_type( $user_id );
     2139
     2140                        if ( 'remove_member_type' == $new_type ) {
     2141                                // Remove the current member type, if there's one to remove.
     2142                                if ( $member_type ) {
     2143                                        $removed = bp_remove_member_type( $user_id, $member_type );
     2144                                        if ( false == $removed || is_wp_error( $removed ) ) {
     2145                                                $error = true;
     2146                                        }
     2147                                }
     2148                        } else {
     2149                                // Set the new member type.
     2150                                if ( $new_type !== $member_type ) {
     2151                                        $set = bp_set_member_type( $user_id, $new_type );
     2152                                        if ( false == $set || is_wp_error( $set ) ) {
     2153                                                $error = true;
     2154                                        }
     2155                                }
     2156                        }
     2157                }
     2158
     2159                // If there were any errors, show the error message.
     2160                if ( $error ) {
     2161                        $redirect = add_query_arg( array( 'updated' => 'member-type-change-error' ), wp_get_referer() );
     2162                } else {
     2163                        $redirect = add_query_arg( array( 'updated' => 'member-type-change-success' ), wp_get_referer() );
     2164                }
     2165
     2166                wp_redirect( $redirect );
     2167                exit();
     2168        }
     2169
     2170        /**
     2171         * Display an admin notice upon member type bulk update.
     2172         *
     2173         * @since 2.7.0
     2174         */
     2175        public function users_type_change_notice() {
     2176                $updated = isset( $_REQUEST['updated'] ) ? $_REQUEST['updated'] : false;
     2177
     2178                // Display feedback.
     2179                if ( ! empty( $updated ) && in_array( $updated, array( 'member-type-change-error', 'member-type-change-success' ) ) ) {
     2180
     2181                        if ( 'member-type-change-error' === $updated ) {
     2182                                $notice = __( 'There was an error while changing member type. Please try again.', 'buddypress' );
     2183                        } else {
     2184                                $notice = __( 'Member type was successfully changed.', 'buddypress' );
     2185                        }
     2186
     2187                        bp_core_add_admin_notice( $notice );
     2188                }
     2189        }
     2190
     2191        /**
     2192         * Add member type column to the WordPress admin users list table.
     2193         *
     2194         * @since 2.7.0
     2195         *
     2196         * @param array $columns Users table columns.
     2197         *
     2198         * @return array $columns
     2199         */
     2200        public function users_table_add_type_column( $columns = array() ) {
     2201                $columns[ bp_get_member_type_tax_name() ] = _x( 'Member Type', 'Label for the WP users table member type column' , 'buddypress' );
     2202
     2203                return $columns;
     2204        }
     2205
     2206        /**
     2207         * Return member's type for display in the WP admin users list table.
     2208         *
     2209         * @since 2.7.0
     2210         *
     2211         * @param string $retval
     2212         * @param string $column_name
     2213         * @param int $user_id
     2214         *
     2215         * @return string Member type as a link to filter all users.
     2216         */
     2217        public function users_table_populate_type_cell( $retval = '', $column_name = '', $user_id = 0 ) {
     2218                // Only looking for member type column
     2219                if ( bp_get_member_type_tax_name() !== $column_name ) {
     2220                        return $retval;
     2221                }
     2222
     2223                // Get the member type.
     2224                $type = bp_get_member_type( $user_id );
     2225
     2226                // Translate user role for display.
     2227                if ( $type_obj = bp_get_member_type_object( $type ) ) {
     2228
     2229                        $url = add_query_arg( array( 'bp-member-type' => urlencode( $type ) ) );
     2230                        // @TODO: Will `translate_user_role()` do anything here? Or can we assume that the singular name is translated?
     2231                        $retval = '<a href="' . esc_url( $url ) . '">' . translate_user_role( $type_obj->labels['singular_name'] ) . '</a>';
     2232                }
     2233
     2234                return $retval;
     2235        }
     2236
     2237        /**
     2238         * Filter WP Admin users list table to include users of the specified type.
     2239         *
     2240         * @param WP_Query $query
     2241         *
     2242         * @since 2.7.0
     2243         */
     2244        public function users_table_filter_by_type( $query ) {
     2245                global $pagenow;
     2246
     2247                if ( is_admin() && 'users.php' === $pagenow && ! empty( $_REQUEST['bp-member-type'] ) ) {
     2248                        $type_slug = sanitize_text_field( $_REQUEST['bp-member-type'] );
     2249
     2250                        // Check that the type is registered.
     2251                        if ( is_null( bp_get_member_type_object( $type_slug ) ) ) {
     2252                                return;
     2253                        }
     2254
     2255                        // @TODO: Would it be better to use BP_User_Query with the member_type param here?
     2256                        // Get the list of users that are assigned to this member type.
     2257                        $type = get_term_by( 'slug', $type_slug, bp_get_member_type_tax_name() );
     2258
     2259                        if ( ! $type->term_id ) {
     2260                                return;
     2261                        }
     2262
     2263                        $user_ids = get_objects_in_term( $type->term_id, bp_get_member_type_tax_name() );
     2264
     2265                        if ( $user_ids && ! is_wp_error( $user_ids ) ) {
     2266                                $query->set( 'include', (array) $user_ids );
     2267                        }
     2268                }
     2269        }
    20352270}
    20362271endif; // End class_exists check.