## Portfolio Search

Product: Monogram - Personal Portfolio WordPress Theme
URL: https://hub.jkdevstudio.com/docs/monogram/integrations/portfolio-search
Updated: 2026-09-06

The Portfolio Search page gives visitors a dedicated, full-page search experience for browsing your portfolio. Unlike the navigation autocomplete (which searches all content types as you type), Portfolio Search displays results in a visual grid with sidebar filters - purpose-built for exploring projects.

<figure class="doc-figure" data-width="50%" data-align="left"><img src="https://hub.jkdevstudio.com/storage/docs/2026/04/867e326e-46e4-45bb-b2b4-c5c2d8b7d616.webp" alt="" class="doc-image rounded-xl max-w-full"></figure>

## How It Works

Portfolio Search uses **Algolia InstantSearch** to deliver near-instant results as visitors type. The page features:

- **Search box** - free-text search with real-time results (no page reload)
- **Filter sidebar** - narrow results by Category, Industry, or Client
- **Visual grid** - portfolio cards with thumbnail, title, category, client, and date
- **Pagination** - browse through large portfolios (9 items per page on desktop, 6 on mobile)
- **Stats bar** - shows "Showing X - Y of Z projects"

All filtering and searching happens client-side through Algolia CDN - results typically appear in under 50ms.

## Setting Up the Portfolio Search Page

### Step 1: Configure Algolia

Make sure you've completed the Algolia setup described in the parent article:

1. WP Search with Algolia plugin is installed and active
2. Application ID and Search-Only API Key are configured in **Settings &gt; Algolia Search**
3. API keys are also added in **Appearance &gt; Customize &gt; API Keys**

### Step 2: Index Your Portfolio

1. Go to **Settings &gt; Algolia Search** in your WordPress dashboard
2. Make sure the **Portfolio** post type is enabled for indexing
3. Click **Re-index** to sync your portfolio items with Algolia

The theme automatically enriches each portfolio item with:

<table style="min-width:75px;"><colgroup><col style="min-width:25px;"><col style="min-width:25px;"><col style="min-width:25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Data</p></th><th colspan="1" rowspan="1"><p>Source</p></th><th colspan="1" rowspan="1"><p>Used For</p></th></tr><tr><td colspan="1" rowspan="1"><p>Title</p></td><td colspan="1" rowspan="1"><p>Post title</p></td><td colspan="1" rowspan="1"><p>Search matching, card display</p></td></tr><tr><td colspan="1" rowspan="1"><p>Categories</p></td><td colspan="1" rowspan="1"><p><code>portfolio_category</code> taxonomy</p></td><td colspan="1" rowspan="1"><p>Filter sidebar</p></td></tr><tr><td colspan="1" rowspan="1"><p>Industries</p></td><td colspan="1" rowspan="1"><p><code>portfolio_industry</code> taxonomy</p></td><td colspan="1" rowspan="1"><p>Filter sidebar</p></td></tr><tr><td colspan="1" rowspan="1"><p>Client name</p></td><td colspan="1" rowspan="1"><p><code>project_client</code> custom field</p></td><td colspan="1" rowspan="1"><p>Filter sidebar, card display</p></td></tr><tr><td colspan="1" rowspan="1"><p>Client avatar</p></td><td colspan="1" rowspan="1"><p><code>project_client</code> + avatar image</p></td><td colspan="1" rowspan="1"><p>Client filter icons</p></td></tr><tr><td colspan="1" rowspan="1"><p>Date</p></td><td colspan="1" rowspan="1"><p>Post date</p></td><td colspan="1" rowspan="1"><p>Card display (YYYY.MM.DD format)</p></td></tr><tr><td colspan="1" rowspan="1"><p>Thumbnail</p></td><td colspan="1" rowspan="1"><p>Featured image (medium + large)</p></td><td colspan="1" rowspan="1"><p>Card image</p></td></tr><tr><td colspan="1" rowspan="1"><p>Permalink</p></td><td colspan="1" rowspan="1"><p>Post URL</p></td><td colspan="1" rowspan="1"><p>Card link</p></td></tr></tbody></table>

### Step 3: Create the Page

1. Go to **Pages &gt; Add New**
2. Give the page a title (e.g., "Search Portfolio" or "Explore Work")
3. In the **Page Attributes** panel (right sidebar), set **Template** to **Algolia Grid**
4. Publish the page

That it - the page will automatically display the full search interface.

<div data-callout="tip">

You can add this page to your navigation menu so visitors can easily find it. It works great as a "Search" or "Explore" link in the main menu.

</div>

## The Search Interface

### Desktop Layout

On desktop, the page displays a **sidebar + grid** layout:

- **Left sidebar** (260px) - contains the search box and all filter blocks
- **Main area** - 3-column grid of portfolio cards with pagination below

### Mobile Layout

On mobile devices, the layout adapts:

- The sidebar becomes a **slide-out panel** triggered by a filter button
- The grid switches to a **single column**
- Items per page reduce from 9 to 6
- The sidebar automatically closes after applying a filter

### Filter Sidebar

The sidebar shows three filter groups:

1. **Category** - checkboxes for each `portfolio_category` term, with item counts
2. **Industry** - checkboxes for each `portfolio_industry` term, with item counts
3. **Client** - checkboxes with client avatars and names

Filters that have no available options are automatically hidden. Multiple filters can be combined - for example, filter by "Web Design" industry AND "E-commerce" category.

<div data-callout="info">

The Client filter shows avatar images next to each client name. These avatars come from the **Client Avatar** field on your portfolio items. Only clients with an avatar set will show the image.

</div>

### Portfolio Cards

Each result card displays:

- **Thumbnail** - featured image with 1:1 aspect ratio and hover zoom effect
- **Title** - project name (links to single project page)
- **Category** - primary taxonomy term
- **Client** - client name with avatar (if available)
- **Date** - formatted as YYYY.MM.DD

### No Results State

When a search or filter combination returns no matches, the page displays a friendly message:

> **No results found.** Try adjusting your search or filters.

## Animations

The page uses **GSAP** entrance animations on first load:

- Filter blocks fade in with a stagger effect (desktop only)
- Portfolio cards animate in with a staggered opacity + vertical slide
- Stats and pagination fade in after the cards

All animations play once on initial load and do not repeat when filtering or paginating.

## Customization

### Translatable Strings

All text in the search interface is translatable through standard WordPress i18n. The following strings can be translated:

<table style="min-width:75px;"><colgroup><col style="min-width:25px;"><col style="min-width:25px;"><col style="min-width:25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>String</p></th><th colspan="1" rowspan="1"><p>Default</p></th><th colspan="1" rowspan="1"><p>Where it appears</p></th></tr><tr><td colspan="1" rowspan="1"><p>Search placeholder</p></td><td colspan="1" rowspan="1"><p>"Search"</p></td><td colspan="1" rowspan="1"><p>Search input</p></td></tr><tr><td colspan="1" rowspan="1"><p>Results label</p></td><td colspan="1" rowspan="1"><p>"results"</p></td><td colspan="1" rowspan="1"><p>Stats bar</p></td></tr><tr><td colspan="1" rowspan="1"><p>No results title</p></td><td colspan="1" rowspan="1"><p>"No results found."</p></td><td colspan="1" rowspan="1"><p>Empty state</p></td></tr><tr><td colspan="1" rowspan="1"><p>No results text</p></td><td colspan="1" rowspan="1"><p>"Try adjusting your search or filters."</p></td><td colspan="1" rowspan="1"><p>Empty state</p></td></tr><tr><td colspan="1" rowspan="1"><p>Filter: Category</p></td><td colspan="1" rowspan="1"><p>"Category"</p></td><td colspan="1" rowspan="1"><p>Sidebar heading</p></td></tr><tr><td colspan="1" rowspan="1"><p>Filter: Industry</p></td><td colspan="1" rowspan="1"><p>"Industry"</p></td><td colspan="1" rowspan="1"><p>Sidebar heading</p></td></tr><tr><td colspan="1" rowspan="1"><p>Filter: Client</p></td><td colspan="1" rowspan="1"><p>"Client"</p></td><td colspan="1" rowspan="1"><p>Sidebar heading</p></td></tr><tr><td colspan="1" rowspan="1"><p>Showing</p></td><td colspan="1" rowspan="1"><p>"Showing"</p></td><td colspan="1" rowspan="1"><p>Stats bar</p></td></tr><tr><td colspan="1" rowspan="1"><p>Of</p></td><td colspan="1" rowspan="1"><p>"of"</p></td><td colspan="1" rowspan="1"><p>Stats bar</p></td></tr><tr><td colspan="1" rowspan="1"><p>Projects</p></td><td colspan="1" rowspan="1"><p>"projects"</p></td><td colspan="1" rowspan="1"><p>Stats bar</p></td></tr></tbody></table>

### Index Name

By default, the search uses the `wp_posts_portfolio` index. If your Algolia index has a different name, the theme will automatically detect it from the WP Search with Algolia plugin configuration.

### Performance Notes

- The theme adds a **DNS prefetch** for Algolia servers to reduce initial connection time
- Client avatar data is **cached for 12 hours** to minimize database queries
- Only medium and large image sizes are indexed to keep the Algolia index lean

<div data-callout="tip">

After adding, editing, or deleting portfolio items, re-index your content in **Settings &gt; Algolia Search** to keep search results up to date.

</div>

## Differences from Autocomplete

<table style="min-width:75px;"><colgroup><col style="min-width:25px;"><col style="min-width:25px;"><col style="min-width:25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Feature</p></th><th colspan="1" rowspan="1"><p>Autocomplete</p></th><th colspan="1" rowspan="1"><p>Portfolio Search</p></th></tr><tr><td colspan="1" rowspan="1"><p>Location</p></td><td colspan="1" rowspan="1"><p>Navigation search drawer</p></td><td colspan="1" rowspan="1"><p>Dedicated page</p></td></tr><tr><td colspan="1" rowspan="1"><p>Content types</p></td><td colspan="1" rowspan="1"><p>All (posts, pages, portfolio)</p></td><td colspan="1" rowspan="1"><p>Portfolio only</p></td></tr><tr><td colspan="1" rowspan="1"><p>Display</p></td><td colspan="1" rowspan="1"><p>Dropdown list</p></td><td colspan="1" rowspan="1"><p>Visual card grid</p></td></tr><tr><td colspan="1" rowspan="1"><p>Filters</p></td><td colspan="1" rowspan="1"><p>None</p></td><td colspan="1" rowspan="1"><p>Category, Industry, Client</p></td></tr><tr><td colspan="1" rowspan="1"><p>Pagination</p></td><td colspan="1" rowspan="1"><p>No</p></td><td colspan="1" rowspan="1"><p>Yes</p></td></tr><tr><td colspan="1" rowspan="1"><p>Best for</p></td><td colspan="1" rowspan="1"><p>Quick lookups</p></td><td colspan="1" rowspan="1"><p>Browsing &amp; exploring</p></td></tr></tbody></table>