wp-plugin-development
Use when developing WordPress plugins: architecture and hooks, activation/deactivation/uninstall, admin UI and Settings API, data storage, cron/tasks, security (nonces/capabilities/sanitization/escaping), and release packaging.
By wordpress · 6,226 installs
npx skills add wordpress/agent-skills --skill wp-plugin-development
Source repository · Upstream listing
WP Plugin Development
When to use
Use this skill for plugin work such as:
creating or refactoring plugin structure (bootstrap, includes, namespaces/classes)
adding hooks/actions/filters
activation/deactivation/uninstall behavior and migrations
adding settings pages / options / admin UI (Settings API)
security fixes (nonces, capabilities, sanitization/escaping, SQL safety)
packaging a release (build artifacts, readme, assets)
Inputs required
Repo root + target plugin(s) (path to plugin main file if known).
Where this plugin runs: single site vs multisite; WP.com conventions if applicable.
Target WordPress + PHP versions (affects available APIs and placeholder support in $wpdb prepare() ).
Procedure
0) Triage and locate plugin entrypoints
1. Run triage:
node skills/wp project triage/scripts/detect wp project.mjs
2. Detect plugin headers (deterministic scan):
node skills/wp plugin development/scripts/detect plugins.mjs
If this is a full site repo, pick the specific plugin under wp content/plugins/ or mu plugins/ before changing code.
1) Follow a predictable architecture
Guidelines:
Keep a single bootstrap (main plugin file with header).
Avoid heavy side effects at file load time; load on hooks.
Prefer a dedicated loader/class to register hooks.
Keep admin only code behind is admin() (or admin hooks) to reduce frontend overhead.
See:
references/structure.md
2) Hooks and lifecycle (activation/deactivation/uninstall)
Activation hooks are fragile; follow guardrails:
register activation/deactivation hooks at top level, not inside other hooks
flush rewrite rules only when needed and only after registering CPTs/rules
uninstall should be explicit and safe ( uninstall.php or register uninstall hook )
See:
references/lifecycle.md
3) Settings and admin UI (Settings API)
Prefer Settings API for options:
register setting() , add settings section() , add settings field()
sanitize via sanitize callback
See:
references/settings api.md
4) Security baseline (always)
Before shipping:
Validate/sanitize input early; escape output late.
Use nonces to prevent CSRF and capability checks for authorization.
Avoid directly trusting $ POST / $ GET ; use wp unslash() and specific keys.
Use $wpdb prepare() for SQL; avoid building SQL with string concatenation.
See:
references/security.md
5) Data storage, cron, migrations (if needed)
Prefer options for small config; custom tables only if necessary.
For cron tasks, ensure idempotency and provide manual run paths (WP CLI or admin).
For schema changes, write upgrade routines and store schema version.
See:
references/data and cron.md
Verification
Plugin activates with no fatals/notices.
Settings save and read correctly (capability + nonce enforced).
Uninstall removes intended data (and nothing else).
Run repo lint/tests (PHPUnit/PHPCS if present) and any JS build steps if the plugin ships assets.
Failure modes / debugging
Activation hook not firing:
hook registered incorrectly (not in main file scope), wrong main file path, or plugin is network activated
Settings not saving:
settings not registered, wrong option group, missing capability, nonce failure
Security regressions:
nonce present but missing capability checks; or sanitized input not escaped on output
See:
references/debugging.md
Escalation
For canonical detail, consult the Plugin Handbook and security guidelines before inventing patterns.