wordpress-claude-stack — Cursor rule for WordPress development
This Cursor rule guides WordPress theme, plugin, and block work. It suits projects that use PHP alongside WooCommerce or ACF.
.cursor/rules/wordpress-claude-stack.mdcWhat wordpress-claude-stack does
The rule covers WordPress themes and plugins, Gutenberg, WooCommerce, ACF, and REST APIs. It tells the agent to use WordPress APIs, type PHP parameters and return values, and keep rendering separate from business logic in theme templates.
Its security guidance calls for nonce verification, capability checks, sanitized input, escaped output, and prepared SQL queries. Gutenberg instructions use block.json and @wordpress/scripts; WooCommerce order code should work with HPOS rather than access order postmeta directly. The rule targets **/*, while alwaysApply is set to false, so it is not configured to apply to every request automatically.
For Cursor, place the rule at .cursor/rules/wordpress-claude-stack.mdc. It guides the agent; it does not generate a complete theme or plugin on its own.
What it helps with
- build a theme template that keeps rendering separate from business logic
- create a plugin with activation hooks and a REST endpoint
- add a Gutenberg block with
block.jsonmetadata - check PHP database code for prepared queries and escaped output
- update WooCommerce order handling for HPOS compatibility
Example prompts for the agent
- Create a WordPress theme template for
single-product.phpand move reusable markup intoget_template_part(). - Add a plugin REST endpoint with
register_rest_route()and check user capabilities. - Review the database code: use
$wpdb->prepare()and remove anyquery_posts()calls.
How to install wordpress-claude-stack
Manually: put the files in place
.cursor/rules/wordpress-claude-stack.mdcFrontmatter: description, globs, alwaysApply
Manually: put the files in place
.claude/rules/wordpress-claude-stack.mdThe paths frontmatter field limits the files: move globs from the source into paths
AGENTS.md
Codex reads AGENTS.md: paste the rule text there
Manually: put the files in place
.github/instructions/wordpress-claude-stack.instructions.mdThe applyTo field sets which files it applies to: move globs from the source into applyTo
Manually: put the files in place
.devin/rules/wordpress-claude-stack.mdManually: put the files in place
.clinerules/wordpress-claude-stack.mdStep by step, with commands for each platform: Cursor rules: .mdc files, four modes and what replaced .cursorrules
Questions about wordpress-claude-stack
How do I install wordpress-claude-stack in Cursor?
Add the rule file at .cursor/rules/wordpress-claude-stack.mdc.
What does wordpress-claude-stack do?
It gives a coding agent guidance for WordPress themes, plugins, Gutenberg blocks, WooCommerce, and ACF. Its rules cover PHP typing, security checks, and database access.
How does the rule handle SQL queries?
It directs the agent to prepare database queries with $wpdb->prepare() and avoid query_posts().
Source text
wordpress-claude-stack.mdc · CC0-1.0
---
description: "Complete AI coding setup for WordPress — themes, plugins, Gutenberg, WooCommerce, ACF, REST API with .cursorrules + CLAUDE.md + Copilot instructions + 5 generation skills."
globs: **/*
alwaysApply: false
---
You are an expert WordPress developer with deep knowledge of PHP, Gutenberg, WooCommerce, ACF, and the WordPress ecosystem.
## Core Principles
- Follow WordPress Coding Standards (WPCS) strictly
- Always use `declare(strict_types=1)` in PHP files
- Escape ALL output, sanitize ALL input, prepare ALL queries
- Use WordPress APIs — never reinvent what WordPress provides
- Prefix everything with project namespace to avoid conflicts
## PHP Rules
- Type hints on all parameters and return types
- Use `WP_Query` or `get_posts()` — never `query_posts()`
- Use `$wpdb->prepare()` for ALL database queries
- Use `wp_verify_nonce()` on ALL form submissions
- Use `current_user_can()` for ALL permission checks
- Use `esc_html()`, `esc_attr()`, `esc_url()`, `wp_kses_post()` for output
- Use `sanitize_text_field()`, `absint()`, `wp_unslash()` for input
## Theme Development
- Use `add_theme_support()` for WordPress features
- Enqueue scripts/styles with `wp_enqueue_script()` / `wp_enqueue_style()`
- Use template hierarchy: `single-{post_type}.php`, `archive-{post_type}.php`
- Use `get_template_part()` for reusable components
- Keep logic in `functions.php` / `inc/`, templates should only render
## Plugin Development
- Main plugin class pattern with singleton or DI
- Activation/deactivation hooks with `register_activation_hook()`
- `uninstall.php` for cleanup on uninstall
- Use WordPress Settings API for admin pages
- Use `register_rest_route()` for REST endpoints
## Gutenberg Blocks
- Use `block.json` for metadata
- Use `@wordpress/scripts` for build tooling
- Use `useBlockProps()` and `InnerBlocks` in React/JSX
- Register with `register_block_type()` in PHP
- Dynamic blocks: use `render_callback` or `render.php`
## WooCommerce
- Override templates via `theme/woocommerce/` directory
- Use WooCommerce hooks, never modify core
- Use `wc_get_product()`, `WC()->cart`, `WC()->session`
- Use HPOS-compatible code (no direct postmeta for orders)
## Advanced Custom Fields
- Register field groups in PHP for version control
- Use `get_field()`, `the_field()`, `have_rows()`
- Use ACF blocks for Gutenberg integration
- Always provide fallback values
## Security
- Never trust user input
- Always escape, sanitize, prepare, verify nonces, check capabilities
- Never use `extract()`, `eval()`, or short PHP tags
## Database
- `get_option()` / `update_option()` for settings
- `get_post_meta()` / `update_post_meta()` for post data
- `get_transient()` / `set_transient()` for caching
- Custom tables only when WP data structures don't fit
- Always `$wpdb->prepare()` for custom queries
## Do NOT
- Modify WordPress core files
- Use `query_posts()`
- Echo unescaped data
- Write raw SQL without prepare
- Use `extract()` or `eval()`
- Hardcode URLs — use `home_url()`, `admin_url()`
- Skip nonce verification
- Put business logic in templates
- Use short PHP tags
© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules