This WordPress project exists as part of a larger headless, multi-service case study demonstrating how WordPress can act as an editorial CMS inside a modern architecture.
It is not a traditional theme-driven WordPress site.
Instead, WordPress here is used for:
- Content modeling (CPTs, taxonomies, meta)
- Editorial workflows
- GraphQL APIs
- Webhooks into external systems
- Acting as one node in a distributed system
The frontend is intentionally disabled.
This WordPress instance demonstrates:
- Headless content modeling using CPTs + meta
- WPGraphQL customization
- Custom GraphQL mutations
- Controlled editorial overrides
- Webhook-based communication with external services
- Separation of content, data, and orchestration concerns
It is designed to work alongside:
- A Node.js API gateway
- A Laravel admin/data service
- A future frontend application (Next.js)
Most of the meaningful logic lives in two custom plugins:
wp-content/plugins/
├── cs-headless-content/
├── cs-headless-graphql/
Each plugin serves a distinct purpose.
Path
wp-content/plugins/cs-headless-content
Purpose
This plugin defines the content model for the headless system.
It registers:
- Custom Post Types (CPTs)
- Taxonomies
- Post meta fields
- Editorial UI elements
- Headless-only behavior (no frontend rendering)
resource– articles, links, tutorialscollection– curated groupingsperson– authors/speakers/contributorsgroup– logical groupings of peoplenps_alert– National Park Service alerts
- Shared taxonomies for filtering
- Meta fields exposed to REST and GraphQL
- Editor-controlled overrides
- Frontend requests intentionally return 404
This plugin answers the question:
“What content exists, and how is it structured?”
Path
wp-content/plugins/cs-headless-graphql
Purpose
This plugin extends WPGraphQL with custom queries, mutations, and webhooks.
It handles:
- Programmatic data ingestion
- Controlled upserts
- Editorial locks
- System-to-system communication
upsertNpsAlert- Creates or updates
nps_alertposts - Uses external IDs (
nps_id) for idempotency - Respects editor locks
- Separates machine-managed fields from editorial content
- Creates or updates
- Listens for WordPress editorial transitions
- Sends publish/update events to the Node.js API gateway
- Enables downstream systems (Laravel) to track public visibility
This plugin answers the question:
“How does data move in and out of WordPress safely?”
This WordPress instance does not serve a frontend.
- Theme output is disabled
- Non-API routes return 404
- REST and GraphQL are the primary interfaces
WordPress is treated as a content service, not a website.
High-level flow:
NPS API
↓
Node.js Gateway
↓
WordPress (editorial control)
↓
Node.js Webhook
↓
Laravel (admin + data dashboard)
Each system has a clearly defined responsibility.
If you are reviewing this project:
-
Start with cs-headless-content
- CPT registration
- Meta configuration
- Headless setup
-
Then review cs-headless-graphql
- Custom GraphQL mutations
- Auth checks
- Upsert logic
- Webhook dispatching
-
Note how WordPress:
- Does not own orchestration
- Does not own dashboards
- Does not own frontend rendering
This is intentional.
This WordPress project demonstrates how WordPress can be:
- A powerful editorial CMS
- A GraphQL data provider
- A participant in a distributed system
- Safely decoupled from frontend concerns
It is one piece of a broader headless architecture case study.