In How to Scolta on Drupal, we covered what Scolta is, how its search pipeline works, and how to set it up on a 6,900 page encyclopedia. This post assumes that background and covers the WordPress path, which turns out to be the shortest one: Scolta AI Search is found in the WordPress.org plugin directory.


Yard sales are a weakness of mine, so when a box of old magazines looked interesting and cost next to nothing, it came home with me without much thought.* Under a stack of National Geographics I found a treasure in newspaper clippings, and a diary. Sixteen years of records, from 1957 to 1973, written by an unknown person watching the Space Race from his living room, starting out unable to tell a Redstone from a fence post and ending up arguing about lunar geology. As a rainy day project, I typed the whole thing into WordPress. It comprised 204 posts, from Mercury through Apollo 17, covering the whole arc. There's humor, tragedy, wonder, and technical detail. It includes the Apollo 1 fire, the Apollo 13 crisis, Pete Conrad's jokes, and Cernan's last words on the Moon.

And WordPress's default search can barely find any of it.

The WordPress Search Problem

WordPress's built-in search runs a SQL LIKE query against post titles and content. No relevance scoring, no stemming (so "launching" doesn't match "launched"), no synonyms, no understanding of what you mean. A massive percentage of the internet runs on WordPress, and this is the default search experience.

When your words happen to match the author's words, it works. Search the demo for "what went wrong" using the native search and the first hit is a post whose title literally begins "What Went Wrong," because the narrator happened to use that phrase after the Apollo 1 fire. Lucky. But it's word matching, not meaning matching, and one step away from the author's vocabulary it collapses entirely. Native search for "scary moment" returns: Nothing found. Of course it does. We'll compare this to Scolta later.

The problem is worse exactly where blogs are strongest: narrative content, where the queries people type are emotional, thematic, and vague. The words map to meaning, and native search has no concept of meaning.

In our Scolta on Drupal post, the corresponding demo moment was cross-domain discovery in an encyclopedia: a single query about survival in extreme conditions pulling up doomed Antarctic expeditions alongside extremophile bacteria. That was Scolta at scale. This post is about Scolta breathing new life into an old site.

Install: Twenty Minutes, Generous Estimate

Installing Scolta on WordPress doesn't require Composer, a build toolchain, or even a search server. Scolta AI Search installs the way you install any WordPress plugin: go to Plugins > Add New, search for "Scolta AI Search," install, and activate. Or, if you're a WP-CLI person:

wp plugin install scolta-ai-search --activate

Requirements are modest: WordPress 6.1+ and PHP 8.1+. There's no Elasticsearch, no Solr, no phoning home, because there's no search server anywhere in the architecture. Scolta builds a static Pagefind index at publish time and scores results in the visitor's browser via WebAssembly. The indexer is plain PHP (no exec(), no Node.js, and it works even with a conservative memory ceiling), so it runs fine on managed and shared hosting.

Pick Your Site Type

Go to Settings > Scolta. The first thing you see is a dropdown: "What kind of site is this?" For the Apollo blog, pick Blog & Editorial and Save.

My earlier Drupal post went deep on presets; the Blog & Editorial site type adjusts the presets differently than we did for the encyclopedia. Blog titles are evocative, not descriptive. "A Long Night in April" doesn't tell you the post is about the Apollo 13 crisis, so the preset lowers the title match boost (2.0 to 1.5) and raises the content boost (0.4 to 0.5): in a blog, the meaning often lives in the body text. Query expansion gets more aggressive (expand_primary_weight goes from 0.5 to 0.6), because the words readers type almost never match the words the author wrote. Excerpts get longer (300 to 350 characters), so the narrative voice survives into the result list and readers can tell whether a post is the one they want before clicking. And recency stays on but gentle: a mild boost with a one year half-life, so fresh posts surface a little easier without burying the archive. (For the Apollo blog, where the "newest" post is from 1973, we stretched that half-life to ten years, which flattens recency to almost nothing across an archive that old. If your archive is historical, do the same.)

You don't need to remember any of these numbers. Just set it up as a Blog and you're done. Every individual setting stays adjustable later in the Scoring section if you find you need it.

Build the Index and Add the Search Page

wp scolta build

For a couple hundred posts, this only takes a few seconds. (There's also a "Rebuild Now" button in the admin if the command line isn't your thing.) Then put the search UI on any page with a shortcode:

[scolta_search]

You can use this with the Classic Editor, the Block Editor, widget areas, or anywhere shortcodes work. At this point you already have relevance-ranked, stemmed, typo-tolerant search running entirely in the browser, with no API key or external service involved.

Search As You Type

And you get one more thing without asking for it: start typing in that box and a dropdown opens underneath, mixing your own recent searches with matching posts. It turns on the moment the shortcode does, reads the same index you just built, and runs entirely in the browser. Typing itself never kicks off a search. The query expansion, the AI Overview, and the follow-ups all wait for Enter or a click, so the suggestions stay fast and light while the real search stays the real search.

Its settings live in their own "Search as you type" section under Settings > Scolta, where you can set how many characters it waits for, how many suggestions to show, whether picking one jumps straight to the post or runs the full search for it, and whether to fold in recent searches at all. The dropdown is styled through CSS custom properties, and a theme can go further and render each suggestion row itself, so a thumbnail next to every result is a few lines of theme code rather than a fork of the plugin. If you'd rather not have it, a single toggle turns it off and the search box goes back to exactly what it was before.

Turn On the AI

Scolta's AI features (query expansion and result summaries) are opt-in, off by default: the plugin makes no remote requests of any kind until you say so. You have two paths. Click "Enable AI features" in Settings > Scolta, which provisions a free Amazee.ai trial (the settings page tells you exactly what gets sent before you confirm). Or bring your own key:

define('SCOLTA_API_KEY', 'sk-ant-...');

Anthropic, OpenAI, and any OpenAI-compatible endpoint (including self-hosted Ollama) are supported.

Write the Site Description

In the Scolta settings there's a plain text field for describing your site. For the Apollo blog, we used:

Personal diary of the Space Race from 1957 to 1973: 204 blog posts covering Mercury, Gemini, and Apollo missions as witnessed by a civilian.

That text is included with every AI call the plugin makes, query expansions and AI Overviews alike. Take the query "were we winning". Three words, no names and no dates, and it only means anything if you already know this blog is about the Space Race: you are asking who was ahead, the Americans or the Soviets. Native search has no way to know that. It matches on the words it can find and returns a single post, an entry about the Tet Offensive that mentions the fighting in Vietnam. Nothing to do with space at all.

Scolta reads it the way a reader of this site would, because the site description told it what the site is. The expansions come back with suggestions like "space race lead," "Soviet advantage," "American progress," and "Cold War competition," not one of which is in the query, all of which fall out of that one sentence of description. The AI Overview builds the whole arc from there: Sputnik and Laika putting the Soviets ahead in 1957, Kennedy choosing the Moon in 1962 because it was a race the country could still win, the Soviets flying Voskhod with three men and no spacesuits while America worked up through Mercury and Gemini, Apollo 11 settling it, and the Soviets answering two years later with the first space station. Fifty-eight results were found when I tested, and the ranked list runs the same way, from "We Choose to Go to the Moon" through "Khrushchev Falls" and "The Space Race and the Arms Race." Take the site description away and the query would become noise. Leave it in and Scolta answers the question you actually asked. The site description is very important to getting good results from Scolta.

The "Scary Moment" Test

This is the query that separates semantic search from keyword search, and it's a good first thing to type into the live demo. Native search returned nothing, remember. Scolta expands "scary moment" into the words a diarist might actually have used (my run suggested "frightening experience," "terrifying incident," "close call," "tense situation") and came back with 59 results. The posts at the top are the right kind of wrong-word match: Apollo 12 struck by lightning thirty-six seconds after launch, and Apollo 10's lunar module tumbling above the Moon, neither of them using the word you typed. The AI Overview above the list pulls the frightening moments together: the Apollo 12 lightning strike and the flight controller who called "SCE to auxiliary" from memory, Gemini 8 spinning fast enough to gray the crew out with Armstrong fighting to stop it, Apollo 10's lunar module tumbling after separation, and Apollo 13's oxygen tank exploding on the way to the Moon. Four close calls between 1966 and 1970, and not one of them is filed under "scary."

One caveat, and it applies to every AI search product: expansion results vary a little from run to run, because the AI generates the expansions live. The strong results are stable; the tail moves. Try the queries yourself. Every example in this post is a live link.

Keep the Index Fresh

You shouldn't have to remember to rebuild every time you touch a post. If Action Scheduler is installed, turn on auto rebuild in the Scolta settings. Saving or deleting a post then schedules a rebuild to run in the background, about five minutes later instead of right away. That small delay is deliberate. Edit ten posts in a row and you get a single rebuild at the end rather than ten of them stacking up. On a large site the rebuild runs in small pieces, so it finishes even when one long request would hit PHP's time limit.

Without Action Scheduler the plugin degrades gracefully. Everything works, you just rebuild manually or from system cron:

*/15 * * * * cd /var/www/html && wp scolta build

Two More Demos, Two More Presets

The site-type dropdown the Apollo blog answered with Blog & Editorial has other answers, and we built a WordPress demo around two more of them. Comparing the three is the quickest way to see what the presets actually encode: not magic, just different assumptions about how titles, descriptions, and time behave on different kinds of sites.

WooCommerce Store

Terra Collecta is a 1,000 product geology and mineral store running on WooCommerce, so Scolta is configured with the E-commerce & Product Store site type. That preset assumes shoppers search in their own words, not the merchant's. Nobody types a product name like "Pallasite Meteorite, Olivine in Metal" into a store's search box; they type "a rock from space", and Scolta hands back a full page of meteorites, Martian and lunar rock, Gibeon iron, a chondrite, not one of them carrying the word "space" in its title. So the title boost drops to 1.5, the content boost rises to 0.6 (the highest of any preset; in a store the meaning lives in the product descriptions), and expanded terms score at 0.8 so the expansion can do the finding. Recency is off entirely, because a meteorite does not go stale.

WooCommerce support goes beyond sharing a job queue: product metadata (including price, SKU, stock status, and categories) is extracted and indexed automatically, and price is emitted as a sortable field. Search "most expensive stone" and Scolta's AI layer detects the sort intent, reorders by price, and shows a dismissible sort badge (my run also inferred a Gemstones category filter, badge and all). This is the same automatic sort detection the Drupal post covered, driven here by WooCommerce data nobody had to configure. On a plain blog, add date under Sortable Fields in the Scolta settings and "newest posts about the Moon landing" sorts itself.

Recipe Catalog

Our third WordPress demo is Fork & Find, a recipe catalog: 3,700 recipes from the Wikibooks Cookbook, imported into a custom recipe post type. Scolta is configured with the Recipe & Content Catalog site type. The reasoning is the mirror image of the blog. Blog titles are evocative, so the blog preset lowered the title boost; catalog titles are descriptive ("Chocolate Brownies" is about chocolate brownies), so this preset leans on them instead: a title containing every query term is multiplied by 2.5, an exact title match by 5. Recency is off (recipes do not expire), results per page rises to 12 because catalog visitors browse, and expanded terms score at 0.9, nearly the weight of the words you typed.

That 0.9 is the number to watch, because recipe searches are mostly descriptions rather than dish names. The visitor types what they want the food to be and lets the expansion supply the vocabulary a cookbook would use. Search "a vegetarian dinner", a query with no cuisine and no recipe in it, and the expansion reaches for "meatless main course," "plant-based entree," and "meat-free dinner," and the AI Overview answers with a spread from around the world: a spinach and ricotta lasagna, vegetarian soft tacos, grilled portobello mushrooms, and a pineapple teriyaki tofu. The metadata makes the sidebar just as literate. Recipe fields (cuisine, course, diet, and difficulty) are built into the index through the same extension point the WooCommerce integration uses, so the facet sidebar reads the query too. Every Diet value comes back with a live count, and Vegetarian dwarfs the rest at ninety-nine recipes, several times the count of any other diet. The visitor still does the clicking; Scolta just shows, in the counts, which filters are worth it.

"Easy Italian dessert" makes the point sharper still. Across all three facets the query's own values sit at the top of the counts, Italian leading Cuisine, Dessert leading Course, Easy leading Difficulty, even though the expansion pulls in enough other recipes to populate the rest of each list. The expansion offers "quick tiramisu" and "panna cotta," and the top three results come back with three variations of panna cotta.

That's the Whole Setup

Install from the plugin directory, pick a preset, build the index, drop in a shortcode, opt into the AI, and write a good site description. You can be up and running in twenty minutes, with most of it waiting on the index build if your site is bigger than ours.

All three WordPress demos are open source, installing Scolta through the same channel you would: Counting Down Apollo, Terra Collecta, and Fork & Find are freely available on GitHub. For the architecture behind the four-stage search pipeline, see The Practical Path to AI Search; for presets, metadata-aware summaries, and sort detection in depth, review Scolta on Drupal post. Looking forward, the next blog in this series will explore using Scolta without PHP.


* There was no yard sale, no box, no diarist. The diary is fiction: we created the 204 posts based on real history with the help of AI. We needed a demo corpus that was big, coherent, and ours to publish, and the least interesting version of this story is the true one. The good news is the search doesn't care who wrote the words. It will do exactly the same thing for the site you really did write, one post at a time, over all those years.