epare = $users; $where[] = "( {$wpdb->users}.ID {$operator} (" . implode( ',', array_fill( 0, count( $users ), '%d' ) ) . '))'; foreach ( $roles as $role ) { $where[] = "( {$join_table}.meta_key = %s AND {$join_table}.meta_value {$like} %s)"; $prepare[] = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; $prepare[] = '%"' . $role . '"%'; } $where = implode( $in ? ' OR ' : ' AND ', $where ); $query->query_from .= " INNER JOIN {$wpdb->usermeta} as {$join_table} ON ({$wpdb->users}.ID = {$join_table}.user_id)"; $query->query_where .= $wpdb->prepare( " AND ({$where})", $prepare ); if ( 0 !== strpos( $query->query_fields, 'DISTINCT ' ) ) { $query->query_fields = 'DISTINCT ' . $query->query_fields; } } private function create_password_strength( $value ): array { return [ 'key' => \ITSEC_Strong_Passwords::STRENGTH_KEY, 'value' => $value, 'compare' => 'IN', ]; } private function create_2fa( $value ): ?array { if ( $value === 'enabled' ) { return [ 'relation' => 'AND', [ 'key' => '_two_factor_enabled_providers', 'compare' => '!=', 'value' => serialize( [] ), ], [ 'key' => '_two_factor_enabled_providers', 'compare' => 'EXISTS', ] ]; } elseif ( $value === 'not-enabled' ) { return [ 'relation' => 'OR', [ 'key' => '_two_factor_enabled_providers', 'value' => serialize( [] ), ], [ 'key' => '_two_factor_enabled_providers', 'compare' => 'NOT EXISTS', ], ]; } return null; } private function create_date_range_meta_query( string $meta_key, $value ): array { [ $after, $before ] = $this->parse_date_range( $value ); $meta = [ 'key' => $meta_key, 'type' => 'NUMERIC' ]; if ( $after && $before ) { $meta['compare'] = 'BETWEEN'; $meta['value'] = [ $after, $before ]; } elseif ( $after ) { $meta['compare'] = '>='; $meta['value'] = $after; } elseif ( $before ) { $meta['compare'] = '<='; $meta['value'] = $before; } else { $meta['compare'] = 'EXISTS'; } return $meta; } private function parse_date_range( $value ): array { $after = $before = null; if ( isset( $value['after'] ) ) { $after = is_int( $value['after'] ) ? $value['after'] : strtotime( $value['after'] ); } if ( isset( $value['before'] ) ) { $before = is_int( $value['before'] ) ? $value['before'] : strtotime( $value['before'] ); } return [ $after, $before ]; } private function parse_user_groups( $value ): array { $users = []; $roles = []; foreach ( $value as $uuid ) { try { $user_group = $this->user_groups->get( $uuid ); } catch ( User_Group_Not_Found $e ) { continue; } $users[] = wp_list_pluck( $user_group->get_users(), 'ID' ); $roles[] = $user_group->get_computed_role_list(); } return [ 'users' => array_merge( [], ...$users ), 'roles' => array_merge( [], ...$roles ), ]; } }