wpdb->esc_like($filters['search']).'%';return [' WHERE display_name LIKE %s OR email LIKE %s OR phone LIKE %s',[$like,$like,$like]]; } public function search(string $query): array { $wpdb = $this->wpdb; $like='%'.$wpdb->esc_like($query).'%';$prefix=$wpdb->esc_like($query).'%'; $rows=$wpdb->get_results($wpdb->prepare('SELECT id,display_name,phone,email,last_used_at FROM %i WHERE is_active=1 AND (display_name LIKE %s OR email LIKE %s OR phone LIKE %s) ORDER BY CASE WHEN display_name LIKE %s THEN 0 ELSE 1 END,last_used_at DESC,usage_count DESC,id ASC LIMIT 20',$this->table,$like,$like,$like,$prefix),ARRAY_A);$this->checkRead();return array_map([$this,'serialize'],$rows); } public function lock(int $id): ?array { $wpdb = $this->wpdb; $row=$wpdb->get_row($wpdb->prepare('SELECT * FROM %i WHERE id=%d FOR UPDATE',$this->table,$id),ARRAY_A);$this->checkRead();return $row?$this->serialize($row):null; } public function used(int $id): void { $wpdb = $this->wpdb; $time=current_time('mysql',true); if(false===$wpdb->query($wpdb->prepare('UPDATE %i SET usage_count=usage_count+1,last_used_at=%s,updated_at=%s WHERE id=%d',$this->table,$time,$time,$id)))throw new CatalogException('abece_booking_database_error',__('The external contact could not be updated.','abece-booking'),500); } protected function serialize(array $row): array {$row=parent::serialize($row);if(isset($row['usage_count']))$row['usage_count']=(int)$row['usage_count'];return $row;} }