From superpowers-sage
Classifies content as CPT, ACF fields, Blade/Livewire components, or Options Pages for Sage/Bedrock projects. Helps decide static vs dynamic content architecture before building.
How this skill is triggered — by the user, by Claude, or both
Slash command
/superpowers-sage:modelingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Classify content within blocks and components to determine the right data modeling approach: static ACF fields, dynamic CPTs, Options Pages, or relationship fields.
Classify content within blocks and components to determine the right data modeling approach: static ACF fields, dynamic CPTs, Options Pages, or relationship fields.
/building when content classification is needed| Classification | When to Use | Implementation |
|---|---|---|
| Static | Fixed text that rarely changes, part of page identity | ACF field in block fields() |
| Dynamic Collection | Growing list of items (portfolio, team, testimonials) | CPT via Poet + taxonomy |
| Dynamic Global | Shared across pages (site info, social links, CTA) | ACF Options Page |
| Dynamic Relation | References other content (featured posts, related projects) | ACF Relationship field |
| Fixed Repeater | 3-5 items, rarely change, no detail pages | ACF Repeater field in block |
For each piece of content in a block, ask:
Does this content appear in more than one place?
Will the client add/remove items over time?
Does the list have categories or filters?
Is it a fixed set of 3-6 items that rarely changes?
Does this content have its own detail page?
Should this content be searchable or filterable on the frontend?
For each analyzed component, output:
### Content Model: {Component Name}
| Content Element | Classification | Implementation |
|---|---|---|
| {element} | {static/dynamic-collection/etc.} | {ACF field type / CPT name} |
**Poet Config** (if CPTs needed):
```php
// config/poet.php
'post' => [
'project' => [
'route' => 'projects',
'supports' => ['title', 'editor', 'thumbnail'],
],
],
'taxonomy' => [
'project_type' => [
'links' => ['project'],
'meta_box' => 'radio',
],
],
ACF Fields (key fields):
$this->addText('headline', ['label' => 'Headline']);
$this->addRepeater('items', ['label' => 'Items'])
->addText('title')
->addTextarea('description')
->endRepeater();
Query Example (if dynamic):
$projects = get_posts([
'post_type' => 'project',
'posts_per_page' => 6,
'orderby' => 'menu_order',
'order' => 'ASC',
]);
## Key Principles
- **Ask the checklist** — don't guess, systematically evaluate each content element
- **Default to static** — only use CPTs when the checklist clearly indicates dynamic content
- **YAGNI** — a repeater is simpler than a CPT; use the simpler option when both work
- **Poet for CPTs** — never `register_post_type()` directly
- **Future-proof wisely** — if content will "probably" grow, use a CPT; if "maybe someday", use a repeater
## Query First — MCP Integration
Before proposing CPTs or ACF field groups, query what already exists:
execute-ability posts/list-types execute-ability acf/field-groups
See [`sageing/references/mcp-query-patterns.md`](../sageing/references/mcp-query-patterns.md).
npx claudepluginhub hekivo/superpowers-sageDesigns and creates WordPress custom post types with taxonomies, ACF field groups, and builder-aware templates. Useful for content architectures like portfolios, case studies, or events.
Designs content type hierarchies, reusable parts, and field compositions for headless CMS using Type > Part > Field pattern. Covers composition vs inheritance and multi-channel reusability.
Guides content architecture in Craft CMS 5: sections, entry types, fields, Matrix, relations, project config, and multi-site propagation. Use when planning content structure or configuring the CP.