$user->ID, 'login' => $user->user_login, 'display_name' => $user->display_name, 'email'=>$user->user_email ] : null; } public function search( string $search, int $page, int $per_page ): array { $wpdb = $this->wpdb; $like = '%' . $wpdb->esc_like( $search ) . '%'; $rows = $wpdb->get_results( $wpdb->prepare( 'SELECT ID, user_login, display_name, user_email FROM %i WHERE user_login LIKE %s OR display_name LIKE %s OR user_email LIKE %s ORDER BY user_login ASC, ID ASC LIMIT %d OFFSET %d', $wpdb->users, $like, $like, $like, $per_page, ( $page - 1 ) * $per_page ), ARRAY_A ); $this->checkRead(); $total = $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(*) FROM %i WHERE user_login LIKE %s OR display_name LIKE %s OR user_email LIKE %s', $wpdb->users, $like, $like, $like ) ); $this->checkRead(); return [ 'items' => array_map( static fn( array $row ): array => [ 'id' => (int) $row['ID'], 'login' => $row['user_login'], 'display_name' => $row['display_name'], 'email'=>$row['user_email'] ], $rows ), 'total' => (int) $total ]; } /** Contact fields are returned only to the booking-manager customer lookup. */ public function bookingSearch(string $query,int $page,int $per_page): array { $wpdb = $this->wpdb; $like='%'.$wpdb->esc_like($query).'%'; $where=$wpdb->prepare(' WHERE u.user_login LIKE %s OR u.display_name LIKE %s OR u.user_email LIKE %s OR EXISTS (SELECT 1 FROM %i m WHERE m.user_id=u.ID AND m.meta_key IN ("first_name","last_name") AND m.meta_value LIKE %s)',$like,$like,$like,$wpdb->usermeta,$like); $rows=$wpdb->get_results($wpdb->prepare('SELECT u.ID,u.display_name,u.user_email FROM %i u',$wpdb->users).$where.$wpdb->prepare(' ORDER BY u.display_name,u.ID LIMIT %d OFFSET %d',$per_page,($page-1)*$per_page),ARRAY_A);$this->checkRead(); $total=$wpdb->get_var($wpdb->prepare('SELECT COUNT(*) FROM %i u',$wpdb->users).$where);$this->checkRead(); return ['items'=>array_map(static function($row){$user=get_userdata($row['ID']);return ['id'=>(int)$row['ID'],'display_name'=>trim($user->first_name.' '.$user->last_name)?:$row['display_name'],'email'=>$row['user_email']];},$rows),'total'=>(int)$total]; } public function findMany(array $ids): array { $wpdb = $this->wpdb; if(!$ids)return []; $holders=implode(',',array_fill(0,count($ids),'%d'));$rows=$wpdb->get_results($wpdb->prepare('SELECT ID,user_login,display_name,user_email FROM %i WHERE ID IN ('.$holders.')',$wpdb->users,...$ids),ARRAY_A);$this->checkRead();$result=[];foreach($rows as $r)$result[(int)$r['ID']]=['id'=>(int)$r['ID'],'login'=>$r['user_login'],'display_name'=>$r['display_name'],'email'=>$r['user_email']];return $result; } private function checkRead(): void { if ( $this->wpdb->last_error ) { throw new CatalogException( 'abece_booking_database_error', __( 'The items could not be loaded. Please try again.', 'abece-booking' ), 500 ); } } }