A client hands you a spreadsheet — a dealer list, a price sheet, a member roster — and asks for a searchable page on their WordPress site. The data already exists; it just needs a home. Most of the options for this are wrong for the job: a full custom-post-type import is overkill for a file that gets replaced monthly, and a page-builder table block usually falls over past a few hundred rows and has no real search. I built CSV to Search under CCMS because I kept hitting this exact request and didn't like any of the existing answers.

What it does

Upload a CSV, drop [csv_to_search] on a page, done. The first row is the column headers, and visitors get a search box that matches across every column at once — company name, city, phone number, part number, whatever the sheet has. No database import step, no mapping wizard.

Add a column named Type and the plugin turns it into filter tabs automatically — a dealer list becomes Retail / Wholesale tabs, a price sheet becomes Parts / Labor, without touching a template file.

Why it doesn't use a database table

The obvious way to build this is to import the CSV into a custom table on upload, index it, and query it. I didn't do that, on purpose. An import step is one more thing that can half-finish on a large file, and it means the site now owns a second copy of the client's data that can drift out of sync with the spreadsheet they keep editing.

Instead, the CSV is parsed only when a visitor performs a search, over AJAX. It costs nothing on page load, and re-uploading a fresh export is the only "sync" step there is — there's no import to re-run, no stale table to truncate.

The part most CSV-upload plugins get wrong

If a plugin lets you upload a CSV through wp-admin, ask where the file ends up. A lot of them shove it straight into the media library, which means it's sitting at a predictable, guessable /wp-content/uploads/ URL with your client's full contact list in it.

CSV to Search doesn't attach the file to the media library. It stores it in its own folder with a random 32-character name, and on Apache and IIS that folder is blocked from direct access with a .htaccess / web.config automatically. A visitor sees only the rows a search returns.

NGINX is the case that actually needs your attention: NGINX doesn't read .htaccess files at all, so that protection is silently absent on an NGINX host unless you add the block yourself. The plugin knows this and checks your own site for the gap — it drops a marker file in the folder and requests it from your own site's address. If the marker comes back downloadable, you get a warning with the exact rule to paste:


location ^~ /wp-content/uploads/cts-data/ { deny all; }

and a Check again button once it's applied. I'd rather the plugin tell you about a hole in your own server config than assume every host works like Apache.

Free limits that are actually usable

The free version isn't a crippled trial — it does everything above, in full, and never phones home to a license server. The limits are one CSV file, the first 250 rows searched, and up to 2 filter tabs. For a single-page directory that's usually plenty.

When a site outgrows that, CSV to Search Pro is a $24/year add-on: unlimited rows, up to 8 tabs, multiple CSV files on the same site (each gets its own source attribute, so [csv_to_search source="vendors"] and [csv_to_search source="parts"] can sit on different pages), CSV import from a URL on a schedule — handy when the source is a Google Sheet published to the web — and a results-export button for visitors.

Where to get it

It's free, GPL-licensed, and I've submitted it to the WordPress.org plugin directory. It's queued behind CCMS Store Customizer — WordPress.org reviews one new plugin per developer at a time — so until it clears review, grab it directly from the plugin page. The documentation covers the CSV format, the NGINX rule above, and the Pro upgrade path in more detail.

FAQs

Does it create any database tables?
No. The CSV file is read from disk and parsed on each search. Nothing is imported into custom tables.

Can I limit which rows show up without editing the CSV?
Yes, there's an optional category filter on the General tab, and the free plugin has fixed limits (250 rows, 2 tabs) that keep a free install predictable on shared hosting.

What happens to my data if I deactivate the plugin?
Deactivating does nothing to your files. Deleting the plugin through wp-admin removes them, including the private folder, so there's nothing left behind.

Get in touch if you need the NGINX rule adjusted for a non-standard uploads path.