Content Model
Complete reference for every custom post type, meta field, and WordPress option exposed to the Next.js frontend.
Custom post types
All public CPTs appear under the Headless Core admin menu and are exposed via WPGraphQL.
Posts (WordPress core)
| Field | GraphQL | Notes |
|---|---|---|
| title, content, excerpt | Post |
Standard blog content |
| slug | slug |
URL: /blog/{slug} |
| categories | categories.nodes |
Used for blog filters |
| featuredImage | featuredImage.node.sourceUrl |
Cover image |
| author | author.node |
Name + avatar |
Pages (WordPress core)
| Field | GraphQL | Notes |
|---|---|---|
| title, content | Page |
Rendered via [...slug] catch-all |
| uri | nodeByUri |
Any path, e.g. /about |
service — Corporate Services
| Admin label | Corporate Services |
| GraphQL single | service |
| GraphQL plural | services |
| Used by | Corporate, Business, Landing |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
headlesscore_icon |
iconName |
String | Code, Sparkles, TrendingUp, Layout |
portfolio_item — Case Studies
| Admin label | Corporate Case Studies |
| GraphQL single | portfolioItem |
| GraphQL plural | portfolioItems |
| Used by | Corporate |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
headlesscore_category |
itemCategory |
String | Financial Technology |
Supports featured image for case study thumbnails.
project — Portfolio Projects
| Admin label | Portfolio Projects |
| GraphQL single | project |
| GraphQL plural | projects |
| Used by | Portfolio |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
headlesscore_category |
projectCategory |
String | Web Application |
headlesscore_tags |
projectTags |
String | Next.js, GraphQL, Tailwind (comma-separated) |
headlesscore_github_url |
githubUrl |
String | https://github.com/... |
headlesscore_live_url |
liveUrl |
String | https://demo.example.com |
testimonial — Business Testimonials
| Admin label | Business Testimonials |
| GraphQL single | testimonial |
| GraphQL plural | testimonials |
| Used by | Business |
| Field | Usage |
|---|---|
| Title | Customer name |
| Content | Quote text |
headlesscore_author_role → authorRole |
Job title |
headlesscore_author_company → authorCompany |
Company name |
headlesscore_rating → rating |
1–5 stars |
headless_product — Shop Products
| Admin label | Shop Products |
| GraphQL single | headlessProduct |
| GraphQL plural | headlessProducts |
| Used by | Shop |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
headlesscore_product_price |
productPrice |
String | 99.00 |
headlesscore_product_sale_price |
productSalePrice |
String | 79.00 |
headlesscore_product_sku |
productSku |
String | HC-PRO |
headlesscore_product_category |
productCategory |
String | Software |
headlesscore_product_in_stock |
productInStock |
String | 1 or 0 |
WooCommerce: If WPGraphQL for WooCommerce is installed,
getShopProducts()in Next.js can also query native WooCommerceproducts. The shop page triesheadlessProductsfirst, then falls back to WooCommerce, then mock data.
team_member — Team Members
| GraphQL single | teamMember |
| GraphQL plural | teamMembers |
| Used by | Corporate |
lms_course — LMS Online Courses
| Admin label | Courses (LMS) |
| GraphQL single | course |
| GraphQL plural | courses |
| Taxonomy | course_category -> courseCategories |
| Used by | LMS, Education, Full-Site Suite |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
instructor_name |
instructorName |
String | Alex Rivera |
course_duration |
courseDuration |
String | 14 Hours |
total_lessons |
totalLessons |
Int | 28 |
kb_article — Knowledge Base & Wiki Articles
| Admin label | Knowledge Base |
| GraphQL single | kbArticle |
| GraphQL plural | kbArticles |
| Taxonomy | kb_category -> kbCategories |
| Used by | Help Center, Docs, Wiki |
| GraphQL Mutation | Description |
|---|---|
voteKbArticle(input: {articleId: ID!, isHelpful: Boolean!}) |
Increments helpfulVotes or unhelpfulVotes and returns updated vote counts. |
⚡ 63 Gutenberg Pro Blocks Suite
| Block Slug | Category | Key Purpose |
|---|---|---|
headlesscore/youtube-embedder |
Embed | Responsive YouTube/Vimeo embedder with privacy mode & custom poster |
headlesscore/roi-calculator |
Interactive | Dynamic pricing slider & savings estimation |
headlesscore/ai-writer |
AI | One-click AI text rephrasing & summarizer |
headlesscore/lottie-player |
Media | Lottie vector animation player |
headlesscore/code-highlighter |
Formatting | Code syntax highlighter with copy button |
headlesscore/image-compare |
Media | Before/After image comparison slider |
headlesscore/audio-player |
Media | Audio & podcast player with waveform |
headlesscore/image-hotspots |
Media | Interactive pulsating image hotspot pins |
headlesscore/news-ticker |
Magazine | Live breaking news ticker marquee |
headlesscore/course-curriculum |
LMS | Course modules & lessons accordion |
headlesscore/instructor-card |
LMS | Course instructor profile card |
headlesscore/kb-search |
Wiki | Live auto-suggest KB search bar |
headlesscore/kb-callout |
Wiki | Documentation note, warning, & tip box |
headlesscore/kb-feedback |
Wiki | Interactive article helpfulness voting widget |
headlesscore/kb-toc |
Wiki | Auto-generated directory tree table of contents |
headlesscore/cta-banner |
Pro | Hero Call to Action banner |
headlesscore/pricing-table |
Pro | Multi-plan pricing grid |
headlesscore/faq-accordion |
Pro | Expandable FAQ accordion |
headlesscore/testimonial-slider |
Pro | Customer testimonial carousel |
headlesscore/team-grid |
Pro | Team member avatar grid |
headlesscore/stats-counter |
Pro | Animated statistics counter |
headlesscore/logo-cloud |
Pro | Partner logo showcase |
headlesscore/tabs |
Pro | Tabbed content container |
headlesscore/countdown-timer |
Pro | Real-time event countdown timer |
| ... + 39 additional blocks | Pro | Full-site interactive component suite (total 63 blocks) |
| Field | Usage |
|---|---|
| Title | Person name |
| Content | Bio text |
| Featured image | Avatar photo |
headlesscore_member_role → memberRole |
Job title |
faq — Frequently Asked Questions
| GraphQL single | faq |
| GraphQL plural | faqs |
| Used by | Corporate, Landing |
| Field | Usage |
|---|---|
| Title | Question |
| Content | Answer |
pricing_plan — Pricing Plans
| GraphQL single | pricingPlan |
| GraphQL plural | pricingPlans |
| Used by | Corporate, Landing |
| Meta key | GraphQL field | Type | Example |
|---|---|---|---|
headlesscore_plan_price |
planPrice |
String | 99 |
headlesscore_plan_period |
planPeriod |
String | month, year, forever |
headlesscore_plan_features |
planFeatures |
String | One feature per line |
headlesscore_plan_highlighted |
planHighlighted |
String | 1 = highlighted card |
headlesscore_plan_cta_label |
planCtaLabel |
String | Get Started |
headlesscore_plan_cta_url |
planCtaUrl |
String | #contact |
contact_log — Contact Submissions (admin only)
Not exposed via GraphQL. Created by the submitContactForm mutation. Private post type visible only in wp-admin.
Theme settings (GraphQL: themeSettings)
All options are managed in Headless Core → Settings and exposed as a single themeSettings query.
General
| WP option | GraphQL field | Description |
|---|---|---|
headlesscore_enable_headless |
enableHeadlessMode |
Redirect WP frontend to Next.js |
headlesscore_nextjs_url |
headlessRedirectUrl |
Next.js base URL |
headlesscore_logo_url |
logoUrl |
Header logo image URL |
headlesscore_copyright_text |
copyrightText |
Footer copyright |
headlesscore_home_layout |
homeLayout |
Site mode (see Site Modes) |
headlesscore_primary_color |
primaryColor |
CSS --primary |
headlesscore_accent_color |
accentColor |
CSS --accent |
Social links
| WP option | GraphQL field |
|---|---|
headlesscore_facebook_url |
socialLinks.facebook |
headlesscore_twitter_url |
socialLinks.twitter |
headlesscore_instagram_url |
socialLinks.instagram |
headlesscore_linkedin_url |
socialLinks.linkedin |
headlesscore_github_url |
socialLinks.github |
SEO & analytics
| WP option | GraphQL field |
|---|---|
headlesscore_seo_description |
seoDescription |
headlesscore_default_share_image |
defaultShareImage |
headlesscore_google_analytics_id |
googleAnalyticsId |
Appearance
| WP option | GraphQL field | Values |
|---|---|---|
headlesscore_header_style |
headerStyle |
glass, dark, light |
headlesscore_footer_style |
footerStyle |
glass, dark, light |
headlesscore_maintenance_mode |
maintenanceMode |
0 / 1 |
headlesscore_default_theme_mode |
defaultThemeMode |
dark, light, system |
headlesscore_logo_text_size |
logoTextSize |
Tailwind class |
headlesscore_logo_text_weight |
logoTextWeight |
Tailwind class |
Site profile (themeSettings.siteProfile)
| WP option | GraphQL field |
|---|---|
headlesscore_site_tagline |
tagline |
headlesscore_hero_title |
heroTitle |
headlesscore_hero_highlight |
heroHighlight |
headlesscore_hero_subtitle |
heroSubtitle |
headlesscore_hero_cta_label |
heroCtaLabel |
headlesscore_hero_cta_url |
heroCtaUrl |
headlesscore_contact_email |
contactEmail |
headlesscore_contact_phone |
contactPhone |
headlesscore_portfolio_bio |
portfolioBio |
headlesscore_portfolio_avatar |
portfolioAvatar |
Portfolio JSON fields
| WP option | GraphQL field | Format |
|---|---|---|
headlesscore_portfolio_skills |
portfolioSkills |
[{"category":"Frontend","items":["React","Next.js"]}] |
headlesscore_portfolio_timeline |
portfolioTimeline |
[{"year":"2024","role":"Engineer","company":"Agency","description":"..."}] |
Navigation
themeSettings.navigationMenu resolves the WordPress menu assigned to Primary Navigation location:
[
{ "label": "Blog", "url": "/blog", "path": "/blog" }
]
Licensing
| WP option | GraphQL field |
|---|---|
headlesscore_license_key |
license.valid, license.tier, etc. |
See Licensing.
Pro Gutenberg blocks
Twenty-two license-gated blocks live under the HeadlessCore block category in the Gutenberg editor. Insertion requires a valid pro license; rendering does not — content built with these blocks keeps displaying even if the license later lapses.
Server-side rendering happens in inc/pro-blocks.php (render_callback); the editor UI is in assets/blocks/pro-blocks.js. On the Next.js side, BlockRenderer passes the pre-styled HTML through unchanged.
| Block name | Block ID | Attributes (JSON) |
|---|---|---|
| CTA Banner | headlesscore/cta-banner |
heading, text, buttonLabel, buttonUrl |
| Pricing Table | headlesscore/pricing-table |
plansJson — [{title, price, period, features[], highlighted, ctaLabel, ctaUrl}] |
| FAQ Accordion | headlesscore/faq-accordion |
itemsJson — [{question, answer}] |
| Testimonial Slider | headlesscore/testimonial-slider |
testimonialsJson — [{quote, author, role, company, avatarUrl}] |
| Team Grid | headlesscore/team-grid |
membersJson — [{name, role, photoUrl, bio}] |
| Stats Counter | headlesscore/stats-counter |
statsJson — [{value, label}] |
| Logo Cloud | headlesscore/logo-cloud |
logosJson — [{imageUrl, name, url}] |
| Tabs | headlesscore/tabs |
tabsJson — [{label, content}] |
| Countdown Timer | headlesscore/countdown-timer |
targetDate, heading |
| Newsletter Signup | headlesscore/newsletter-signup |
heading, placeholder, buttonLabel |
| Contact Form | headlesscore/contact-form |
heading, submitLabel |
| Image Gallery | headlesscore/image-gallery |
imagesJson — [{url, alt}] |
| Video Embed | headlesscore/video-embed |
videoUrl, posterUrl, caption |
| Comparison Table | headlesscore/comparison-table |
comparisonJson — {columns, rows: [{feature, values}]} |
| Team Slider | headlesscore/team-slider |
membersJson — [{name, role, photoUrl, bio}] |
| Photo Album | headlesscore/photo-album |
albumTitle, imagesJson — [{url, caption}] |
| Feature Grid | headlesscore/feature-grid |
featuresJson — [{icon, title, description}] |
| Hero Banner | headlesscore/hero-banner |
heading, subheading, ctaLabel, ctaUrl, imageUrl |
| Steps | headlesscore/steps |
heading, stepsJson — [{title, description}] |
| Callout | headlesscore/callout |
variant (info/success/warning/error), title, message |
| Icon List | headlesscore/icon-list |
itemsJson — ["item", ...] |
| Magazine Category Grid | headlesscore/magazine-category-grid |
heading, source (auto/manual), maxCategories, postsPerCategory, layout (magazine/grid), showExcerpt, categoriesJson — [{slug, name, postCount}] |
Use these on any WordPress page rendered via [...slug] / wp_page mode. See Licensing for activation.
Revalidation path mapping
When content is saved, WordPress sends a revalidation webhook with this path:
| Post type | Path revalidated |
|---|---|
post |
/blog/{slug} |
page |
/{slug} |
service, portfolio_item |
/corporate |
project |
/portfolio |
testimonial |
/business |
headless_product |
/shop |
team_member, faq, pricing_plan |
/corporate |
| Theme settings | / (full layout) |