在Wordpress中使用PHP筛选特定角色用户的实现方法
实现WordPress仅展示指定角色用户列表的修改方案
修改逻辑
WordPress 中用户角色存储在用户对象的roles属性中,我们只需要在组装返回数据前增加角色判断,过滤掉非目标角色的用户即可,该方案对PHP新手友好,修改量小不易出错。
你只需要在原有代码的foreach循环中,拿到$wp_user对象后增加一段角色校验逻辑即可,完整修改后的代码如下:
public function get_recipients_list() { global $wpdb; // 从POST请求拉取用户列表 try { $this->_is_user_logged_in(); } catch ( Exception $error ) { wp_send_json_error( $error->getMessage() ); } // @TODO: nonce校验 // 搜索用户至少需要输入一个字符 $search_query = "SELECT a.ID, a.user_nicename, a.display_name, b.meta_value as block_list FROM {$wpdb->users} a LEFT join {$wpdb->usermeta} b ON a.ID = b.user_id AND b.meta_key = '_ml_user_block_list'"; if ( ! empty( $_POST['term'] ) ) { $search_term = $wpdb->esc_like( wp_kses_data( $_POST['term'] ) ) . '%'; $search_query .= $wpdb->prepare( " WHERE ( a.user_login LIKE %s OR a.user_nicename LIKE %s OR a.display_name LIKE %s )", $search_term, $search_term, $search_term ); } elseif ( ! empty( $_POST['user_id'] ) ) { $search_query .= $wpdb->prepare( ' WHERE a.ID = %d ', absint( $_POST['user_id'] ) ); } $offset = 0; if ( isset( $_POST['offset'] ) && intval( $_POST['offset'] ) ) { $offset = absint( $_POST['offset'] ); } $search_query .= " LIMIT $offset, $this->recipient_search_limit"; $users = $wpdb->get_results( $search_query ); if ( ! $users ) { wp_send_json_success([]); } $return_list = []; // 定义允许展示的角色列表,可自行修改调整 $allowed_roles = ['agents', 'customers']; foreach ( $users as $user ) { $user_block_list = maybe_unserialize( $user->block_list ); // 被拉黑用户或用户本人不加入返回列表 if ( $user->ID == $this->sender->ID || $user_block_list && in_array( $this->sender->ID, (array) $user_block_list ) ) { continue; } $wp_user = get_user_by('ID', $user->ID ); // 新增角色过滤逻辑,不在允许列表的用户直接跳过 if( empty( array_intersect( $wp_user->roles, $allowed_roles ) ) ) { continue; } $return_list[ $user->ID ] = [ 'id' => $user->ID, 'login' => $wp_user->user_login, 'name' => wp_specialchars_decode( $user->display_name ? $user->display_name : $user->user_nicename ), 'avatar' => get_avatar( $user->ID ) ?: '', 'uri' => esc_url( ( new User( $user->ID ) )->get_link() ), 'blocked'=> false, 'seckey' => wp_create_nonce("block-user-{$user->ID}") ]; } wp_send_json_success( $return_list ); }
补充说明
- 常规用户量级的站点使用上述方案性能完全够用,无需额外调整SQL逻辑
- 如果后续需要新增或删减可展示的角色,直接修改
$allowed_roles数组内的角色slug即可
内容的提问来源于stack exchange,提问作者msk285
相关产品推荐
相关产品推荐

