CommunityCoding & Developmentgithub.com

umairmsm/wp-build

Stage 3 of a wp-site-kit WordPress build - local DDEV site, the core must-use plugin (modules), the presentation-only child theme with skins, the content model (custom post types, meta, WP_Query, render functions), and the enquiry pipeline that saves leads before forwarding. Use when building or changing features, templates, content types, forms or plugin modules on a wp-site-kit site.

What is wp-build?

wp-build is a Claude Code agent skill that stage 3 of a wp-site-kit WordPress build - local DDEV site, the core must-use plugin (modules), the presentation-only child theme with skins, the content model (custom post types, meta, WP_Query, render functions), and the enquiry pipeline that saves leads before forwarding. Use when building or changing features, templates, content types, forms or plugin modules on a wp-site-kit site.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/umairmsm/wp-site-kit/tree/HEAD/skills/wp-build

Installed? Explore more Coding & Development skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Stage 3: Build

Goal: the site runs locally. Real items render through core functions. Enquiries save, then forward, then purge. The structure tests are green.

Read first: the project's AGENTS.md, then references/architecture.md.

Steps

  1. Local site. Follow the project's README.md, section "First run". Then check: ddev wp eval 'echo wp_get_environment_type();' must print local. If it doesn't, see references/local-env.md. Until it prints local, the site thinks it is production: it can be indexed and can email real customers.
  2. Rename the example content type. Do this before content exists. <prefix>_offer becomes the business's word (tour, service, course): the post type, the rewrite slug and the labels in modules/content.php, plus the function names (_get_offers, _render_offer_card), the parts/offer-card.php file and the tests. Post type names have a 20-character limit.
  3. Model the content. Find every field the brief needs. Register each as post meta with a sanitize callback and an auth callback. Prices are numbers in meta. 0 means "on request", never "free". If editors need richer field screens, add ACF (free) on top, but read values only through core functions.
  4. Data files → generator (when the owner supplies many items):
    • keep one Markdown or JSON file per item in docs/data/<type>/;
    • write an idempotent WP-CLI script that creates or updates posts from those files;
    • give it a --dry-run;
    • run it with ddev wp eval-file - < scripts/<name>.php. The files are the reviewable truth; the DB is the copy.
  5. Templates call one core function per section.
    • Layout lives in the theme: templates, parts/, skin overrides.
    • Data, queries, prices, policy sentences and forms come from the core.
    • Guard each call with function_exists(), so a template never fatals if the plugin is missing.
  6. Enquiries. Keep the pipeline in modules/enquiry.php (references/forms-and-leads.md).
    • Add fields in three places together: the form, the handler and the details box.
    • Set the inbox and the sender in wp-config.php constants, never in code.
  7. Policy text (terms, deposits, cancellation): put it in the core as one function (for example <prefix>_policy( 'cancellation' )). Templates print that function, and a test fails if a template hard-codes a policy sentence.
  8. New module? Add one file in modules/, one require_once line in the bootstrap, and update tests/structure/core.spec.ts in the same commit.
  9. Check and commit.
    • Run npm run test:structure and npm run lint:php (0 errors).
    • Ask the wp-rules-reviewer agent to review the diff.
    • Commit (Conventional Commits).

Gate (tick in SITE_STATUS.md)

  • wp_get_environment_type() = local
  • Core plugin and child theme active; skin loads
  • Real items render through core functions; no hard-coded cards, prices or slugs
  • Enquiry: saved → emailed → retry → purge; tested end to end in Mailpit
  • Structure tests green; PHPCS 0 errors

Never

  • Business logic, WP_Query, prices, pll_* calls or policy text in the theme.
  • Raw $_POST or $_GET without wp_unslash + a sanitize function; output without esc_*.
  • Third-party API keys or endpoints in HTML or JS. Forward from the server.
  • Toggling plugin modules with raw wp option update. Use the plugin's own UI or CLI, then re-check every page it affects.
  • Unprefixed functions, options, hooks, meta keys or nonces.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

umairmsm/wp-content

Stage 4 of a wp-site-kit WordPress build - real copy and photos. Content truth (facts only from the owner), AI drafts and owner approval, claims audits, banned words and fake proof, legal pages, the photo pipeline (dedupe, real-only, EXIF strip, WebP sizes, alt text, AI image register), and recorded content changes. Use for "write the copy", "add photos", "the owner sent new photos", "check for duplicates", "update prices or text on the live site", "legal pages".

umairmsm/wp-design

Stage 2 of a wp-site-kit WordPress build - design direction, a static HTML/CSS prototype with design tokens, owner sign-off with screenshots, self-hosted fonts, and porting the approved look into a swappable WordPress skin. Use for "design the site", "new look", "redesign", "change colours or fonts", "make a new skin", "port the prototype to WordPress".

umairmsm/wp-kickoff

Stage 1 of a wp-site-kit WordPress build. Use when starting a new WordPress website or taking over or rebuilding an existing one - discovery brief, stack decision, creating the project with bin/wp-site-new, locked decisions, private repo and credentials inventory. Triggers - "new WordPress site", "start a client website", "rebuild this site", "take over this WordPress site".

umairmsm/wp-operate

Stage 8 of a wp-site-kit WordPress build and everything after launch - backups with an off-machine copy, restore drills, the disaster-recovery runbook, credentials inventory, update policy, alerts, and working from more than one machine (bridge file, workstation doctor, encrypted state bundle, rescuing unpushed work). Use for "backup", "restore", "move to a new machine/server", "update plugins", "what if the server dies", "work from the cloud box", "set up a second machine".

umairmsm/wp-seo

Stage 5 of a wp-site-kit WordPress build - titles and descriptions, canonical URLs, one schema owner and JSON-LD, sitemaps, robots.txt and llms.txt, AI crawler access, redirects (301 vs 302), legacy URL maps, Search Console, and adding languages one pilot at a time with Polylang (hreflang, .po/.mo strings, native review). Use for "SEO", "schema", "redirect", "old URLs", "translate the site", "add French/Spanish", "hreflang", "canonical".

umairmsm/wp-ship

Stage 7 of a wp-site-kit WordPress build - staging behind Cloudflare Access, server hardening, safe deploys from a commit (scripts/deploy-safe.sh), database content changes, the launch audit, DNS cutover without breaking a running business, and the first week after launch. Use for "deploy", "set up staging", "go live", "launch", "cutover", "move DNS", "harden the server".

umairmsm/wp-site

Start here for any WordPress website built with wp-site-kit, from an empty folder to a live site. Use when someone says "build a WordPress site", "new website for a client", "where are we on the site", "what is next before launch", or asks to continue a site project. Finds the current stage from SITE_STATUS.md, applies the hard rules, and hands over to the right stage skill.

Related Skills