@extends('layouts/layoutMaster') @section('title', $pageTitle) @section('vendor-style') @endsection @section('page-style') @endsection @section('vendor-script') @endsection @section('page-script') @include('content.admin.partials.seo-ai-script') @endsection @section('content') @php $post->loadMissing(['cities:id,name', 'zones:id,name,blog_city_id', 'eventTypes:id,name']); $embedPreviewSeed = $embedPreviewSeed ?? ['posts' => [], 'listings' => []]; $blogMediaUploadUrl = \Illuminate\Support\Facades\Route::has('admin.blog-posts.media.store') ? route('admin.blog-posts.media.store') : ''; $blogPostPreviewUrl = \Illuminate\Support\Facades\Route::has('admin.blog-embeds.post-preview') ? route('admin.blog-embeds.post-preview') : ''; $blogPostSearchUrl = \Illuminate\Support\Facades\Route::has('admin.blog-embeds.posts.search') ? route('admin.blog-embeds.posts.search') : ''; $blogListingSearchUrl = \Illuminate\Support\Facades\Route::has('admin.blog-embeds.listings.search') ? route('admin.blog-embeds.listings.search') : ''; $selectedEventTypeIds = collect(old('event_type_ids', $post->eventTypes->pluck('id')->all())) ->map(fn ($id) => (int) $id) ->filter(fn (int $id) => $id > 0) ->values(); $selectedCityIds = collect(old('city_ids', $post->cities->pluck('id')->all())) ->map(fn ($id) => (int) $id) ->filter(fn (int $id) => $id > 0) ->values(); $selectedZoneIds = collect(old('zone_ids', $post->zones->pluck('id')->all())) ->map(fn ($id) => (int) $id) ->filter(fn (int $id) => $id > 0) ->values(); $cityMap = $cities->keyBy('id'); $canonicalRuleContext = [ 'slug' => old('slug', $post->slug), ]; $canonicalRuleSelectors = [ 'slug' => '#slug', 'canonical_override' => '#canonical_override', ]; $jsonldRuleContext = [ 'slug' => old('slug', $post->slug), 'published_at' => optional($post->published_at)->toIso8601String(), 'updated_at' => optional($post->updated_at)->toIso8601String(), 'image' => $post->featured_image ? asset('storage/'.$post->featured_image) : null, ]; $jsonldRuleSelectors = [ 'title' => '#title', 'description' => '#meta_description', 'excerpt' => '#excerpt', 'slug' => '#slug', 'city_name' => '#city_ids', 'zone_name' => '#zone_ids', 'primary_event_type' => '#event_type_ids', 'headings' => '#content', ]; @endphp
{{ $pageTitle }}
@csrf @if($formMethod !== 'POST') @method($formMethod) @endif
@error('title')
{{ $message }}
@enderror
Se completa automaticamente desde el titulo, pero puedes editarlo. @error('slug')
{{ $message }}
@enderror
@error('status')
{{ $message }}
@enderror
Este post aparecerá en el blog general y también en las páginas relacionadas que selecciones por ciudad, evento o zona. Si una landing no tiene suficientes posts, el sistema completará con posts globales recientes para que la sección no quede vacía.

Úsalo para aparecer también en landings editoriales por tipo de evento.

0 seleccionados
Disponibles Busca y agrega
Seleccionados Se guardan todos
@error('event_type_ids')
{{ $message }}
@enderror @error('event_type_ids.*')
{{ $message }}
@enderror

Asocia varias ciudades para reutilizar el mismo post en más de un contexto local.

0 seleccionadas
Disponibles Marketplace real
Seleccionadas Sin límite obligatorio
@error('city_ids')
{{ $message }}
@enderror @error('city_ids.*')
{{ $message }}
@enderror

Solo puedes elegir zonas de las ciudades ya seleccionadas para mantener consistencia.

0 seleccionadas
Disponibles Filtradas por ciudad
Seleccionadas Vinculadas a ciudad
@error('zone_ids')
{{ $message }}
@enderror @error('zone_ids.*')
{{ $message }}
@enderror
@error('excerpt')
{{ $message }}
@enderror
SEO
@error('meta_title')
{{ $message }}
@enderror
@error('robots')
{{ $message }}
@enderror
@include('content.admin.partials.seo-ai-toolbar', [ 'type' => 'post', 'titleTarget' => '#meta_title', 'descriptionTarget' => '#meta_description', 'keywordsTarget' => '#keywords_target', 'keywordsInputId' => 'seo-ai-post-keywords', 'keywordsPlaceholder' => 'mariachis en bogota, serenatas, bodas, eventos corporativos', 'help' => 'La IA toma el título, extracto, ciudades, zonas, eventos y contenido actual del post.', 'context' => [ 'post_id' => $post->id, 'page_title' => $pageTitle, ], 'selectors' => [ 'title' => '#title', 'slug' => '#slug', 'excerpt' => '#excerpt', 'content' => '#content', 'headings' => '#content', 'status' => '#status', 'meta_title' => '#meta_title', 'meta_description' => '#meta_description', 'primary_event_type' => '#event_type_ids', 'city_name' => '#city_ids', 'zone_name' => '#zone_ids', ], ])
@error('meta_description')
{{ $message }}
@enderror
Uso interno para orientar la IA y el enfoque editorial. No se publica como meta keywords. @error('keywords_target')
{{ $message }}
@enderror
Solo úsalo si la misma página existe con varias URLs. La sugerencia usa la URL pública limpia del post, sin querystring.
@error('canonical_override')
{{ $message }}
@enderror
La ajustamos automaticamente al formato recomendado para compartir el post. @error('og_image')
{{ $message }}
@enderror @if($post->og_image)
Imagen OG actual
@endif
Usa plantilla `Article` para el post. El textarea sigue funcionando como override avanzado. Se completa con el título del post, extracto y contexto local disponible.
@error('jsonld')
{{ $message }}
@enderror
La recortamos y optimizamos automaticamente al formato visual del blog. @error('featured_image')
{{ $message }}
@enderror @if($post->featured_image)
Imagen actual
@endif
{!! old('content', $post->content) !!}
Media inline Pega una URL interna del blog para convertirla en tarjeta, inserta artículos o anuncios desde los botones visibles y sube imágenes optimizadas.
Las imágenes inline se convierten a JPG optimizado. Pegar una URL interna de `/blog/...` crea una tarjeta segura y también puedes insertar artículos o anuncios publicados desde modales dedicados. @error('content')
{{ $message }}
@enderror
Cancelar
@endsection