PRC ElasticPress
Canonical ElasticPress / VIP Search integration for PRC Platform: search hardening, faceted filtering, blocks, and server redirects.
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/pewresearch/prc-elasticpress/archive/refs/heads/trunk.zipPRC ElasticPress (@prc/elasticpress)
Canonical ElasticPress / VIP Search integration for PRC Platform: search hardening, faceted filtering, blocks, and server redirects.
What it does
- Forces ElasticPress (
ep_integrate) on search paths that would otherwise fall through to expensive MySQLLIKEscans, including admin DataViews list search - Indexes unpublished statuses
draft,pending,private, andfuturefor editorial search (trashstays on MySQL) - Sanitizes and truncates search terms early (100-character cap) on frontend search, REST search, DataViews list search, and search feeds
- Caps search RSS feed
posts_per_pageat 20 (crawler hardening) - Owns faceted listing/search middleware (
ElasticPress_Middleware+ElasticPress_Facets_API) - Registers facet UI blocks under the
prc-ep/*namespace - Owns pre-WordPress redirects:
?s=→/search/{term}and legacy FacetWP underscore params →ep_filter_*
Architecture
PHP (server): Search hardening hooks live in includes/class-plugin.php. Facets middleware owns ep_integrate for pub-listing queries, taxonomy OR/AND filter rewriting, and custom years / time_since aggregations. ElasticPress_Facets_API normalizes aggregations into the Interactivity contract. Context_Provider always uses the EP API with urlKey ep_filter_.
JS (client): Blocks under src/ drive selection, URL construction (ep_filter_*), and result refresh via the Interactivity API.
Legacy URLs: plugins/prc-elasticpress/vip-config/server-redirects.php (loaded from root vip-config before WP boots).
Blocks
| Block | Name |
|---|---|
| Facets Context Provider | prc-ep/facets-context-provider |
| Facet Template | prc-ep/facet-template |
| Facets Results Info | prc-ep/facets-results-info |
| Facet Search Relevancy | prc-ep/facet-search-relevancy |
Temporary aliases keep old prc-platform/facet* names rendering until DB-stored templates are re-saved.
Registered facets
| slug | Type | Notes |
|---|---|---|
category |
checkbox | Topics; OR within taxonomy |
formats |
checkbox | OR within taxonomy |
regions-countries |
radio | |
bylines |
dropdown | Authors |
research-teams |
dropdown | |
years |
dropdown | date_terms.year aggregation |
time_since |
radio | past-month, past-6-months, past-12-months, past-2-years |
Search routing
Frontend HTML /search* integrates via facets middleware. Additional hooks cover REST/feed gaps:
| Hook | Scope | Behavior |
|---|---|---|
pre_get_posts → integrate_search_queries |
REST search + search feeds | Sets ep_integrate=true when REST_REQUEST or is_feed() |
rest_post_query → integrate_rest_post_search |
/wp/v2/posts?search=… |
Sanitizes term + sets ep_integrate=true |
prc_wp_admin_dataview query flag |
Admin DataViews lists | Shell/Search_Query sets ep_integrate (not trash-only); Admin_Dataview_Search expands search fields |
ep_indexable_post_status |
Index | Adds draft, pending, private, future; never trash |
pre_get_posts → sanitize_search_term |
Frontend + REST + DataViews | Truncates s to 100 chars |
pre_get_posts → reject_nonsense_search_term |
Frontend main search | Flags spammy s (consecutive ++, noise-only); short-circuits + 404 |
ElasticPress_Middleware::MAX_NAVIGABLE_PAGE |
Facet aggregations | Skip facets past page 100 (pager still uses ES window) |
Debugging
Define PRC_ELASTICPRESS_DEBUG to log provider decisions under [PRC Facets - ElasticPress]. Client: window.prcFacetsDebug = true.
Build
npx turbo build --filter=@prc/elasticpress
Key files
| Path | Purpose |
|---|---|
includes/class-plugin.php |
Search integration, sanitization, robots, facet bootstrap |
includes/class-admin-dataview-search.php |
Admin DataViews search fields, unpublished statuses, chart design_slug |
includes/providers/ |
Middleware + Facets API |
vip-config/server-redirects.php |
Pre-WordPress search + legacy facet redirects |
src/ |
Facet blocks |
docs/plugins/prc-elasticpress/ |
Plugin docs (architecture, blocks, REST, troubleshooting) |
Related
- Requires
prc-scriptsandprc-publication-listing(isPubListingQueryhandshake) - Theme templates in
@prc/design-systemembedprc-ep/*facet blocks