Frontend Query Service
FrontendQueryService
Class: App\Services\FrontendQueryService
Centralized service for all frontend content queries. Used by base Livewire page components and available for direct use in themes and modules.
Access
In base Livewire components:
$this->query()->findHomepage();
Directly:
$service = app(FrontendQueryService::class);
Methods
Page/Post Lookup
findHomepage(): ?Post
Finds the homepage by settings.homepage_id, falling back to a page with slug home.
findBlogPage(): ?Post
Finds the blog listing page by settings.blog_page_id, falling back to slug blog.
findPublishedPostBySlug(string $slug): ?Post
Finds a published post/page by slug. Throws ModelNotFoundException if not found.
findPublishedPageBySlug(string $slug): ?Post
Finds a published page (post_type=page) by slug. Throws ModelNotFoundException if not found.
Related Content
relatedPosts(Post $post, int $limit = 3): Collection
Returns posts in the same category as the given post, excluding the post itself.
Fires FrontendFilterHook::RELATED_POSTS filter.
adjacentPosts(Post $post): array
Returns ['previous' => ?Post, 'next' => ?Post] based on created_at ordering.
Taxonomy
findTermBySlug(string $slug, string $taxonomy): ?Term
Finds a term by slug and taxonomy type. Throws ModelNotFoundException if not found.
postsForTerm(Term $term): Builder
Returns a query builder for published posts belonging to a term.
Fires FrontendFilterHook::TAXONOMY_QUERY filter.
Query Builders
publishedPostsQuery(): Builder
Returns base query for published posts (status=published, post_type=post).
Fires FrontendFilterHook::POSTS_QUERY filter.
searchPosts(string $query): Builder
Returns a query builder filtering posts by title/content LIKE match.
Fires FrontendFilterHook::SEARCH_QUERY filter.
Filters & Sorting
applySearchFilter(Builder $query, string $search): Builder
Applies title/content LIKE filter. No-op if search is empty.
applyCategoryFilter(Builder $query, string $categorySlug): Builder
Filters by category term slug. No-op if slug is empty.
applySort(Builder $query, string $sort): Builder
Sorts by: latest (default), oldest, or title.
Utilities
getCategories(): array
Returns ['slug' => 'name'] array of all categories, ordered by name.
paginatePosts(Builder $query, ?int $perPage = null): LengthAwarePaginator
Paginates the query. Defaults to settings.posts_per_page or 12.
Hook Points
| Hook | Type | Passed Value | Extra Args |
|---|---|---|---|
HOMEPAGE_QUERY |
Filter | ?Post |
— |
POSTS_QUERY |
Filter | Builder |
— |
SINGLE_POST_QUERY |
Filter | Builder |
$slug |
SEARCH_QUERY |
Filter | Builder |
$searchQuery |
TAXONOMY_QUERY |
Filter | Builder |
$term |
RELATED_POSTS |
Filter | Collection |
$post |