@extends('front.layouts.marketplace') @section('title', $seoTitle . ' | Mariachis.co') @section('meta_description', $seoDescription) @section('body_page', 'city') @section('body_class', 'font-sans text-slate-900 antialiased city-viator') @push('head') @php $itemListElements = []; $pageOffset = ($profiles->currentPage() - 1) * $profiles->perPage(); foreach ($profiles->getCollection() as $ilIdx => $ilItem) { $ilName = $ilItem->business_name ?: $ilItem->user?->display_name; $ilUrl = route('mariachi.public.show', ['slug' => $ilItem->slug]); $ilPhoto = $ilItem->photos->firstWhere('is_featured', true) ?? $ilItem->photos->first(); $ilImg = $ilPhoto?->urlForVariant('medium'); $ilCount = (int) ($ilItem->reviews_count ?? 0); $ilRating = $ilCount > 0 ? round((float) ($ilItem->avg_rating ?? 0), 1) : null; $ilEntry = [ '@type' => 'ListItem', 'position' => $pageOffset + $ilIdx + 1, 'item' => array_filter([ '@type' => 'MusicGroup', '@id' => $ilUrl, 'name' => $ilName, 'url' => $ilUrl, 'genre' => 'Mariachi', 'address' => ['@type' => 'PostalAddress', 'addressLocality' => $ilItem->publicCityLabel(), 'addressCountry' => 'CO'], 'description' => $ilItem->short_description ?: null, 'image' => $ilImg ?: null, 'priceRange' => $ilItem->base_price ? 'Desde $'.number_format((float) $ilItem->base_price, 0, ',', '.') : null, 'aggregateRating' => $ilRating ? [ '@type' => 'AggregateRating', 'ratingValue' => (string) $ilRating, 'reviewCount' => $ilCount, 'bestRating' => '5', 'worstRating' => '1', ] : null, ], fn ($v) => $v !== null), ]; $itemListElements[] = $ilEntry; } @endphp @if(count($itemListElements) > 0) @endif @endpush @push('head') @php $bcCountryLabel = $countryName ?: 'Colombia'; $bcCountrySlug = $countrySlug ?: \Illuminate\Support\Str::slug($bcCountryLabel); $bcItems = [ ['@type' => 'ListItem', 'position' => 1, 'name' => 'Inicio', 'item' => route('home')], ['@type' => 'ListItem', 'position' => 2, 'name' => 'Mariachis en '.$bcCountryLabel, 'item' => route('seo.landing.slug', ['slug' => $bcCountrySlug])], ]; $bcPos = 3; if ($cityName && $citySlug) { $bcItems[] = ['@type' => 'ListItem', 'position' => $bcPos++, 'name' => 'Mariachis en '.$cityName, 'item' => route('seo.landing.slug', ['slug' => $citySlug])]; } if ($zoneName) { $bcItems[] = ['@type' => 'ListItem', 'position' => $bcPos, 'name' => $zoneName]; } elseif ($eventType) { $bcItems[] = ['@type' => 'ListItem', 'position' => $bcPos, 'name' => $eventType->name]; } @endphp @if(!empty($faqItems)) @endif @php $clpAreaName = $zoneName ?: ($cityName ?: ($eventType?->name ?: $countryLabel)); @endphp @endpush @section('content') @push('styles') @endpush @php $isCountry = $mode === 'country'; $isZone = $mode === 'zone'; $isCity = in_array($mode, ['city', 'city_category', 'zone'], true); $countryLabel = $countryName ?: 'Colombia'; $countrySlugValue = $countrySlug ?: \Illuminate\Support\Str::slug($countryLabel); $countryLandingUrl = route('seo.landing.slug', ['slug' => $countrySlugValue]); $citySlugValue = $citySlug ?: ($cityName ? \Illuminate\Support\Str::slug($cityName) : null); $heroContextLabel = $isZone ? 'Zona local' : ($isCountry ? 'Pais' : ($isCity ? 'Ciudad' : 'Categoria')); $heroContextName = $isZone ? ($zoneName ? $zoneName.', '.$cityName : $cityName) : ($cityName ?: ($eventType?->name ?: $countryLabel)); $scopeLabel = $zoneName ?: ($cityName ?: ($eventType?->name ?: $countryLabel)); $currentPath = request()->url(); $resultsDisplay = $totalResults >= 600 ? '600+' : number_format($totalResults, 0, ',', '.'); $activeFilterCount = collect([ $selectedFilters['event'] ?? null, $selectedFilters['city'] ?? null, $selectedFilters['service'] ?? null, $selectedFilters['budget'] ?? null, ])->filter()->count(); $showCityFilter = ! $isCity && ! $isZone && $filterOptions['cities']->isNotEmpty(); @endphp @php $publicFallbackLogoImage = asset('marketplace/assets/logo-wordmark-390.webp'); @endphp
@php $heroMinPrice = $profiles->getCollection()->whereNotNull('base_price')->min('base_price'); @endphp
@if($eventType) {{ $eventType->name }} @endif @if($cityName) {{ $cityName }} @endif @if($contextResults > 0) {{ $contextResults }} {{ $contextResults === 1 ? 'grupo disponible' : 'grupos disponibles' }} @endif @if($lastUpdatedAt) Actualizado el {{ $lastUpdatedAt->translatedFormat('d \d\e F \d\e Y') }} @endif

{{ $h1 }}

@if(isset($catalogZone) && $catalogZone && filled($catalogZone->description))

{{ $catalogZone->description }}

@endif
@if($heroMinPrice) Desde ${{ number_format((float) $heroMinPrice, 0, ',', '.') }} @endif Contacto directo por WhatsApp Sin comisiones
@if($filterOptions['events']->isNotEmpty())
@foreach($filterOptions['events']->take(6) as $chip) {{ $chip['name'] }} @endforeach @if($activeFilterCount > 0) Limpiar filtros @endif
@endif
@if($showCityFilter)
@endif
Limpiar
@php $ctaUrl = route('publish-event.create', array_filter([ 'ciudad' => $citySlug, 'evento' => $eventType?->id, ])); @endphp
@forelse($profiles as $profile) @php $profileName = $profile->business_name ?: $profile->user?->display_name; $photo = $profile->photos->firstWhere('is_featured', true) ?? $profile->photos->first(); $photoUrl = $photo?->urlForVariant('thumb') ?: $publicFallbackLogoImage; $profileUrl = route('mariachi.public.show', ['slug' => $profile->slug]); $coverage = $profile->serviceAreas->pluck('city_name')->take(2)->join(' · '); $priceLabel = $profile->base_price ? 'Desde $'.number_format((float) $profile->base_price, 0, ',', '.') : 'Cotizacion directa'; $isVip = $profile->hasPremiumMarketplaceBadge(); $reviewsCount = (int) ($profile->reviews_count ?? 0); $avgRating = $reviewsCount > 0 ? round((float) ($profile->avg_rating ?? 0), 1) : null; $isRecent = $profile->updated_at && $profile->updated_at->diffInDays(now()) <= 90; $cardWaDigits = \App\Models\MariachiListing::normalizePhoneForUrl($profile->public_whatsapp); $cardWaText = 'Hola, vi tu anuncio en Mariachis.co' . ($eventType ? ' para ' . mb_strtolower($eventType->name) : '') . ' y quiero cotizar.'; $cardWaUrl = $cardWaDigits ? 'https://wa.me/' . $cardWaDigits . '?text=' . rawurlencode($cardWaText) : null; @endphp
{{ $profileName }} @if($isVip) {{ $profile->marketplaceBadgeLabel() }} @endif {{ $profile->publicCityLabel() }}
@if($isVip) Destacado @elseif($profile->profile_completion >= 75) Perfil completo @else Nuevo @endif @if($isRecent) @endif

{{ $profileName }}

@if($avgRating !== null)
{{ number_format($avgRating, 1, '.', '') }} ({{ $reviewsCount }} {{ $reviewsCount === 1 ? 'reseña' : 'reseñas' }})
@endif

{{ $profile->short_description ?: 'Mariachi disponible para serenatas, bodas y eventos privados.' }}

{{ $coverage ?: $profile->publicCityLabel('Cobertura nacional') }}

@forelse($profile->eventTypes->take(2) as $eventTypeItem) {{ $eventTypeItem->name }} @empty Eventos varios @endforelse

{{ $priceLabel }}

@if($cardWaUrl) @endif
@if($loop->index === 3 && $contextResults >= 4) @endif @empty
No encontramos anuncios en este momento para {{ $heroContextName ?: 'esta zona' }}.
@endforelse
@if($profiles->hasPages())
{{ $profiles->onEachSide(1)->links('vendor.pagination.marketplace') }}
@endif
@if($isCountry)

Exploracion nacional

Ciudades destacadas en {{ $countryLabel }}

@if($featuredCountryCities->isNotEmpty())
@foreach($featuredCountryCities as $city) Mariachis en {{ $city['name'] }} ({{ $city['count'] }}) @endforeach
@else
Aun no hay suficientes ciudades publicadas para destacar.
@endif

Cobertura por ciudad

Nuestras ciudades en {{ $countryLabel }}

@if($countryCitiesByLetter->isNotEmpty())
@foreach($countryCitiesByLetter as $letter => $cities) @endforeach
@else
No hay ciudades disponibles para construir el indice.
@endif
@elseif($nearbyZones->isNotEmpty() && $citySlugValue)

Exploracion local

Otras zonas cercanas

@if($citySlugValue) Ver toda {{ $cityName }} @endif
@foreach($nearbyZones as $zone) {{ $zone['name'] }} ({{ $zone['count'] }}) @endforeach
@endif {{-- $ctaUrl definido antes del grid de resultados --}} @if($eventType && $contextResults > 0)

{{ $contextResults }} mariachis disponibles en {{ $cityName }} para {{ mb_strtolower($eventType->name) }}

Publica tu evento y recibe contacto directo por WhatsApp.

@endif

¿Prefieres que ellos lleguen a ti?

Publica tu evento gratis

Describe lo que necesitas y los grupos disponibles en {{ $heroContextName ?: 'tu ciudad' }} te contactan directamente por WhatsApp. Sin intermediarios, sin comisión.

Confianza local

Opiniones en {{ $scopeLabel }}

Experiencias reales de clientes que contrataron mariachis para sus eventos.

@if($cityReviews->isNotEmpty())
@foreach($cityReviews as $review) @php $reviewerName = $review->clientUser?->display_name ?: 'Cliente'; $reviewerInitial = strtoupper(mb_substr($reviewerName, 0, 1)); $reviewMariachiName = $review->mariachiListing?->title ?: $review->mariachiProfile?->business_name ?: $review->mariachiProfile?->user?->display_name; $defaultReviewListing = $review->mariachiProfile?->resolveDefaultListing(); $reviewProfileUrl = $review->mariachiListing?->slug ? route('mariachi.public.show', ['slug' => $review->mariachiListing->slug]) : ($defaultReviewListing?->isApprovedForMarketplace() && $defaultReviewListing?->slug ? route('mariachi.public.show', ['slug' => $defaultReviewListing->slug]) : null); @endphp
{{-- Header: avatar + nombre + fecha + estrellas --}}

{{ $reviewerName }}

{{ $review->created_at->format('d M, Y') }}

@for($i = 1; $i <= 5; $i++) @endfor
{{-- Tags de verificación y evento --}} @if($review->verification_label || $review->event_type)
@if($review->verification_label) {{ $review->verification_label }} @endif @if($review->event_type) {{ $review->event_type }} @endif
@endif {{-- Título y cuerpo --}} @if($review->title)

{{ $review->title }}

@endif

{{ \Illuminate\Support\Str::limit($review->comment, 200) }}

{{-- Fotos --}} @if($review->photos->isNotEmpty())
@foreach($review->photos->take(3) as $photo) Foto de evento @endforeach
@endif {{-- Respuesta del mariachi --}} @if($review->mariachi_reply && $review->mariachi_reply_visible)

Respuesta del mariachi

{{ \Illuminate\Support\Str::limit($review->mariachi_reply, 140) }}

@endif {{-- Footer: nombre del mariachi + link --}}
@endforeach
@else

Aun no hay opiniones publicas aqui

Las resenas aparecen despues de ser verificadas. Contacta directamente a los grupos para consultar sus referencias.

@endif

Personalizacion

Vistos recientemente

Abrir historial
@if($recentViews->isNotEmpty()) @else

Aun no hay historial reciente en este navegador

Cuando visites otros anuncios activos, apareceran aqui automaticamente.

@endif

Ayuda rapida

Preguntas frecuentes

@foreach($faqItems as $index => $faq)
@endforeach

Más búsquedas

Busquedas populares de mariachis

@forelse($popularCities as $city) Mariachis en {{ $city['name'] }} @empty Sin datos suficientes todavia @endforelse

Contenido editorial

Artículos sobre mariachis en {{ $scopeLabel }}

Ver blog completo
@if($relatedBlogPosts->isNotEmpty())
@foreach($relatedBlogPosts as $post) @php $cityLabel = $post->primary_city_name ?: ($cityName ?: 'Colombia'); $zoneLabel = $post->primary_zone_name; $eventLabel = $post->eventTypes->pluck('name')->take(2)->join(' · ') ?: ($post->primary_event_type_name ?: 'Blog'); @endphp @endforeach
@else

Aun no hay articulos para este contexto

Cuando publiquemos contenidos locales como "Los mejores mariachis para bodas en {{ $scopeLabel }}", apareceran aqui.

@endif
{{-- ── Cotización múltiple: sticky bar ── --}} {{-- ── Cotización múltiple: modal ── --}} {{-- ── Modal "Publicar evento" ── --}} @push('styles') @endpush @endsection @push('scripts') {{-- ── Modal "Publicar evento" JS ── --}} @endpush