Skip to content

v2.1.0 — listing SEO, schema completion, search, pagination

Choose a tag to compare

@ManukMinasyan ManukMinasyan released this 13 May 21:27
· 22 commits to 2.x since this release
1a4a277

First feature release on the new namespace. Two real bug fixes and seven new features, no breaking changes.

Fixed

  • Sitemap was silently skipping tag URLs. BlogSitemapGenerator documented /blog/tag/{slug} as a first-class route but only iterated categories + posts. Now iterates tags too, gated by Route::has('blog.tag') + config('ink.features.tags').
  • Paginated listing pages were canonicalizing to page 1. Every /blog?page=2, /blog/category/X?page=2, and /blog/tag/X?page=2 was telling Google "this is a duplicate of page 1." Now each page carries its own canonical and a — Page N title suffix.
  • Schema wasn't rendering on post pages in public-routes mode. The shipped show and preview routes didn't call seo()->for(\$post) — BlogPosting + BreadcrumbList only worked for consumers who overrode the controller.

Added

Schema

  • FAQPage JSON-LD auto-detected from ## FAQ H2 + ### Question? / answer paragraphs. Default on; disable via config('ink.schema.faq_auto', false).
  • HowTo JSON-LD auto-detected from ## Steps H2 + ### Step Name / paragraphs. Opt-in via config('ink.schema.howto_auto', true).
  • Blog + CollectionPage JSON-LD on /blog, /blog/category/{slug}, /blog/tag/{slug}.
  • Relaticle\Ink\Support\SchemaExtractor — pure helper for FAQ + HowTo HTML parsing.

Listings

  • Relaticle\Ink\Support\BlogListingSeo — forIndex/forCategory/forTag factories for headless consumers. Used internally by the shipped controllers.
  • Numbered, aria-labeled paginator at ink::pagination.blog. Replaces Laravel's default tailwind paginator on the shipped listing pages. Publish via --tag=ink-views to customize.
  • wire:navigate on <x-ink::post-card> for SPA-feel navigation in Livewire 4 hosts.

Search

  • Post::search(\$term) scope — portable LIKE search across title/excerpt/content. Empty terms are no-ops. LIKE wildcards in the term are escaped.
  • Override via config callback. Set config('ink.search.callback') to a function (Builder \$query, string \$term): void to use Postgres FTS, MySQL FULLTEXT, Scout, Meilisearch, etc.
  • ?q= honored on the shipped /blog route with noindex,follow on result URLs (search queries should not be indexed as separate pages).
  • <livewire:blog::search /> — drop-in Livewire component with URL-synced query, 400ms debounce, and empty state. Theme-agnostic.

Docs

Three new pages: search.md, schema.md, listing-seo.md. Configuration + blade-components pages updated for the new config keys and components.

Upgrade

```bash
composer require relaticle/ink:^2.1
```

No breaking changes vs v2.0.0. Consumers on the previous manukminasyan/filament-blog v1.x should follow the v2.0.0 release notes first.

Test coverage

23 → 58 tests (+35, +152%). 118 assertions. All passing.