rankbeam/laravel-seo-filament
A Laravel package that adds SEO management to Filament admin panels. Edit meta titles, descriptions, Open Graph tags, and canonical URLs for your Eloquent models, with search previews and flexible field configuration—keeping SEO tasks alongside your existing Filament resources.
This release is a bug-fix + hardening release for the Lara Zeus translatable integration in Filament, not a new API surface. Start here:
composer.json before upgrading so the translatable plugin and Filament don't drift apart.Where to look in the repo: the package config (locales list, field definitions), the Edit/Create page traits, and the changelog/docs section covering the adapter migration.
Trait-per-page, not per-model. The translatable behaviour lives on the Filament Edit and Create page classes. Apply it to every page that edits localized content — an un-instrumented custom page will silently bypass validation and transactional saving.
Adapter pattern for Edit/Create (optional but recommended here). The new adapters retain the parent record, SEO metadata, schema, and in-flight uploads as drafts across the language switcher. If you have custom Create pages that mutate $this->data in mount() or mutateFormDataBeforeCreate(), move that logic where it runs after the adapter has resolved the parent, otherwise you'll re-introduce the parent-loss bug the adapter was written to fix.
Validate on all visited locales. The release validates every language the editor has touched before saving, rather than only the currently active one. Design your form rules accordingly: a required rule on a translated field means "required in each visited locale," which will surprise editors who only filled in the default language. Prefer required on the default locale and nullable-with-fallback elsewhere, or accept that a save can now fail on a tab the editor isn't looking at — surface those errors clearly in the notification.
Transactional saves. Multi-locale writes now commit atomically. Keep them atomic: avoid dispatching jobs, sending mail, or calling external APIs from observers on the translated model, because those side effects will fire inside the transaction and cannot be rolled back. Move them to DB::afterCommit() or queued listeners.
Rapid Livewire 3 switching. The fix specifically preserves the newest title/description keystrokes during fast switches. Don't counteract it by adding your own aggressive wire:model.live.debounce on translated inputs or by resetting form state in updatedActiveLocale(). Test with throttled network in the browser — the failure mode is a race, so a fast local dev machine will not reproduce it.
Upload drafts. Per-locale uploads and metadata are retained as drafts until save. If you have a custom saveUploadedFiles() or a FileUpload with ->saveUploadedFileUsing() hitting S3, verify it behaves when the same file is staged, the locale is switched, and the form saved later — the draft retention assumes the temporary file survives the switch.
AI proposal/apply flow. Browser validation covers "offline AI proposal/apply," i.e. the flow works without paid calls. Treat AI-generated titles/descriptions as drafts requiring human acceptance; the transactional save and visited-locale validation apply to them too, so a proposed value in a locale the editor never opened will not sneak into the database.
Integration tip: if you have your own locale switcher UI (a custom header action rather than the package's), switch it to the package's locale-changing path. Hand-rolled $this->activeLocale = $locale assignments are exactly how the clobbering bug was reachable.
composer dump-autoload and php artisan filament:optimize-clear (or optimize:clear) so cached class maps pick up the new traits.locales array has no effect until php artisan config:clear. Adding a locale to config does not retroactively backfill existing records — expect nulls in the new locale and handle fallbacks in your accessors.updated hook in staging, reproduce with network throttling, and inspect the Livewire payload in the browser devtools. Symptoms of the old bug — a locale's fields reverting to another locale's values — should now be gone; if they reappear, check that every relevant page has the updated trait.How can I help you explore Laravel packages today?