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
/