From 27f91c7feaf33088c8baba2de2304cb444f1bb11 Mon Sep 17 00:00:00 2001 From: m105 Date: Wed, 22 Jul 2026 22:18:49 +0300 Subject: [PATCH] Add platform filter to Discover, alongside keyword and TLD Filters sites by server/powered_by/generator (e.g. "Shopify", "WordPress", "nginx"), combinable with the existing keyword/TLD filters. Results table now also shows each site's detected platform. Verified: platform=Wix correctly isolates the one known Wix site, tld=es+platform=nginx narrows to the 12 real nginx-hosted .es sites, and the no-match case renders the empty state correctly. --- app/Livewire/Discover/Search.php | 21 +++++++++++++++++-- .../views/livewire/discover/search.blade.php | 14 ++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/app/Livewire/Discover/Search.php b/app/Livewire/Discover/Search.php index ee4637f..8ee0f6e 100644 --- a/app/Livewire/Discover/Search.php +++ b/app/Livewire/Discover/Search.php @@ -13,7 +13,8 @@ use Livewire\WithPagination; /** * The competitor-discovery search: "who sells honey with a .es domain?" — keyword * matches a site's pages via MySQL fulltext (natural language mode, so free-text input - * never trips a boolean-mode syntax error), TLD filters the site's domain suffix. + * never trips a boolean-mode syntax error), TLD filters the site's domain suffix, + * platform filters its detected server/powered-by/generator signature. */ #[Layout('components.layouts.app')] class Search extends Component @@ -26,6 +27,9 @@ class Search extends Component #[Url(as: 'tld', history: true)] public string $tld = ''; + #[Url(as: 'platform', history: true)] + public string $platform = ''; + public function updatingKeyword(): void { $this->resetPage(); @@ -36,11 +40,17 @@ class Search extends Component $this->resetPage(); } + public function updatingPlatform(): void + { + $this->resetPage(); + } + public function render(): View { $keyword = trim($this->keyword); $tld = strtolower(trim(ltrim($this->tld, '.'))); - $hasQuery = $keyword !== '' || $tld !== ''; + $platform = trim($this->platform); + $hasQuery = $keyword !== '' || $tld !== '' || $platform !== ''; // Without any filter this would just be the full site list — that's what the // Sites page is for. Discover only returns results once you've asked it something. @@ -56,6 +66,13 @@ class Search extends Component ) ) ->when($tld !== '', fn ($query) => $query->where('domain', 'like', '%.'.$tld)) + ->when($platform !== '', function ($query) use ($platform) { + $query->where(function ($query) use ($platform) { + $query->where('server', 'like', '%'.$platform.'%') + ->orWhere('powered_by', 'like', '%'.$platform.'%') + ->orWhere('generator', 'like', '%'.$platform.'%'); + }); + }) ->withCount(['pages as matching_pages_count' => function ($pageQuery) use ($keyword) { if ($keyword !== '') { $pageQuery->whereFullText(['title', 'description', 'keywords', 'content'], $keyword); diff --git a/resources/views/livewire/discover/search.blade.php b/resources/views/livewire/discover/search.blade.php index 187b178..ed9e1ac 100644 --- a/resources/views/livewire/discover/search.blade.php +++ b/resources/views/livewire/discover/search.blade.php @@ -1,7 +1,7 @@

Discover competitors

- Find sites by what they sell and where — e.g. keyword "honey", TLD "es". + Find sites by what they sell, where, and what they're built on — e.g. keyword "honey", TLD "es", platform "Shopify".

@@ -17,6 +17,12 @@ placeholder="TLD, e.g. es" class="w-full max-w-[10rem] rounded-md border border-neutral-300 px-3 py-2 text-sm focus:border-neutral-500 focus:outline-none dark:border-neutral-700 dark:bg-neutral-900" > +
@@ -25,6 +31,7 @@ Domain Title + Platform Matching pages @@ -37,15 +44,16 @@ {{ $site->title ?? '—' }} + {{ $site->generator ?? $site->powered_by ?? $site->server ?? '—' }} {{ $site->matching_pages_count }} @empty - + @if ($hasQuery) No matching sites. @else - Enter a keyword or TLD to search. + Enter a keyword, TLD, or platform to search. @endif