wp-content
Skill1 starsChanged 6 months agoMITView on GitHub
Create, read, update, search posts/pages/users/options/taxonomies via the core WP REST API on a connected target. Phase = Build.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- morrealev/wordpress-managertheir own version, first seen Mar 1, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- morrealev/wordpress-manager★ 8same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository14 other files it gives its agents.
- wp-changesSkill
- wp-connectSkill
- wp-diagnoseSkill
- wp-edit-designSkill
- wp-edit-pluginSkill
- wp-edit-themeSkill
- wp-execute-phpSkill
- wp-fullSkill
- wp-health-checkSkill
- wp-introspectSkill
- wp-migrateSkill
- wp-pair-setupSkill
- wp-recoverySkill
- wp-scaffoldSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 2 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 16
NEVER post status=publish on a brand-new draft without explicit user confirmation — drafts are reversible, publishes are user-visible.
- Very specific: line 17
NEVER call rolepod_wp_db_query with anything other than SELECT — write/update/delete via REST or wp-cli.
- Very specific: line 18
ALWAYS read the existing post (post_get or post_list) before post_update if you do not know the current content — the REST endpoint …
- Very specific: line 19
NEVER delete a user without reassign_to — every post the user authored is destroyed with the account otherwise.
- Very specific: line 96
When content is a Gutenberg-block page, use the comment-syntax block markup:
- Very specific: line 112
Default to status=draft on create.
- Distinctive: line 147
No durable artifact — content lives in WordPress.
- Distinctive: line 151
Read when constructing Gutenberg block markup or chaining multiple REST calls:
- Very specific: line 171
After publish → wp-health-check to verify the page is reachable.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
WP Content
Core-REST CRUD skill. Owns the most common WordPress operations: write a page, list posts, update an option, register a user, query the DB read-only. Anything builder-specific (Elementor JSON, Divi shortcodes) belongs to wp-edit-design; anything plugin-specific (Yoast meta, Woo products) belongs to wp-edit-plugin.
Iron Rule
<EXTREMELY-IMPORTANT>
1. NEVER post `status=publish` on a brand-new draft without explicit user confirmation — drafts are reversible, publishes are user-visible.
2. NEVER call `rolepod_wp_db_query` with anything other than SELECT — write/update/delete via REST or wp-cli; the db_query path is read-only by design and the guard fires hard.
3. ALWAYS read the existing post (`post_get` or `post_list`) before `post_update` if you do not know the current content — the REST endpoint replaces fields, and overwriting an unknown post loses the live content irrecoverably.
4. NEVER delete a user without `reassign_to` — every post the user authored is destroyed with the account otherwise. `rolepod_wp_user_write(action: delete)` refuses (USER_DELETE_NEEDS_REASSIGN) until you name the inheriting user id.
</EXTREMELY-IMPORTANT>When to use
- "Create a landing page with these sections..."
- "List the last 10 posts" / "show all pages" / "find posts containing X"
- "Update the site title to ..." / "change blogname"
- "Add a tag / category"
- "Show me all admins"
- "Query wp_options to see ..."
- Anything
/wp/v2/*REST surface.
Skip when:
- The content is a builder layout (Elementor / Divi / Oxygen / Bricks) →
wp-edit-design. - The content is a plugin config (Yoast SEO meta, WooCommerce product) →
wp-edit-plugin. - The content is a custom block / plugin / theme bootstrap →
wp-scaffold.
Boundary
Owns:
rolepod_wp_post_{get,list,create,update}for posts/pages/CPTs.rolepod_wp_user_list(read) +rolepod_wp_user_write(create/update/delete).rolepod_wp_termfor taxonomy terms (category / tag / custom),rolepod_wp_commentfor comment moderation,rolepod_wp_cpt_scaffoldto register a custom post type.rolepod_wp_option_{get,set}for the WP-allowed settings surface (siteurl, blogname, etc.).rolepod_wp_db_query(SELECT only). Output is capped atmax_bytes(default 64 KB, stdout and stderr each) and the result saystotal_bytes/returned_bytes/truncated.truncated: truemeans addLIMITor select fewer columns — not run it again unchanged.rolepod_wp_rest_requestfor arbitrary/wp/v2/*calls.rolepod_wp_rest_dumpto discover routes — per-namespace counts by default (~1 KB); passfilter_namespacefor one namespace's path/methods table, orfull: truefor all of them (300+ routes, ~50 KB on a plugin-heavy site).
Does not own:
- Builder content (
_elementor_data, Divi shortcodes, Oxygen JSON, Bricks JSON) →wp-edit-design. - Plugin-specific writes (Yoast post meta, ACF fields, Woo products) →
wp-edit-plugin. - File writes outside the REST surface →
wp-scaffoldorwp-edit-design.
Return / hand off:
- User wants a layout in Elementor →
wp-edit-design. - User wants ACF custom fields on the new post →
wp-edit-plugin. - DB SELECT shows a problem worth diagnosing →
wp-diagnose.
Inputs to gather
- target_id (always).
- For create:
type(defaultposts),title,content,status(defaultdraft). - For update:
id+ the fields to change (read the post first if content is unknown). - For list:
type, optionalsearch,status,per_page,page,orderby. - For options:
name; for set,value+confirm: trueif on production. - For rest_request:
path,method, optionalbody/query.
Workflow
1. Pick the operation
| User intent | Tool |
| create a page/post/cpt | rolepod_wp_post_create |
| update an existing one | rolepod_wp_post_get first (if unknown), then rolepod_wp_post_update |
| list / search / filter | rolepod_wp_post_list |
| upload an image / set a featured image | rolepod_wp_media_upload |
| list users | rolepod_wp_user_list |
| create/update/delete a user | rolepod_wp_user_write (delete needs reassign_to) |
| add/find a category, tag, or custom term | rolepod_wp_term (action=ensure is idempotent) |
| approve / spam / trash / delete a comment | rolepod_wp_comment |
| register a custom post type | rolepod_wp_cpt_scaffold |
| change a post's slug (URL) | rolepod_wp_post_update with slug — heed slug_changed_warning |
| add a 301 redirect (Rank Math backend) | rolepod_wp_redirect_set |
| read site setting | rolepod_wp_option_get |
| write site setting | rolepod_wp_option_set (production guard fires if siteurl-matched) |
| arbitrary REST call | rolepod_wp_rest_request |
| discover what routes exist | rolepod_wp_rest_dump |
| read-only DB | rolepod_wp_db_query |
2. Gutenberg block markup for content fields
When content is a Gutenberg-block page, use the comment-syntax block markup:
<!-- wp:paragraph -->
<p>Hello world.</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":2} -->
<h2>Section title</h2>
<!-- /wp:heading -->See examples/content-examples.md for non-trivial cases (group blocks, columns, cover, image with attributes).
3. Status flow
Default to status=draft on create. Promote to publish only with explicit user OK. Never set publish for the first commit of a major page (allows revision review).
4. Media + featured images
Upload with rolepod_wp_media_upload(source: base64, data, filename, alt) — or source: url for a remote image, or source: local_path for a file already on the server. Always pass alt (accessibility + SEO). To set a post's featured image in one step, add rolepod_wp_media_upload(source: url, url, alt, set_featured: true, attach_to_post).
With the rolepod-wp companion (v2.23+) the upload is bounded server-side and recorded as a reversible ledger row (disable it to delete the attachment). Without the companion it falls back to a bare REST upload that is not ledgered — remove such an upload manually via rolepod_wp_rest_request DELETE on /wp/v2/media/<id>?force=true.
5. Terms, users, comments, CPTs (dual-path)
These four tools branch on target kind — wp-cli for shell targets (local/ssh/docker), WP REST for a RestTarget — so they work on every connection. The ledger records only on rest targets. Production writes need confirm: true.
- Terms:
rolepod_wp_term(action: ensure, taxonomy: category, name, slug)is idempotent — it returns the existing term (existed: true) or creates it.action: list/action: createare also available. For a custom taxonomy whose REST base differs from its key, passrest_base. - Users:
rolepod_wp_user_write(action: create, username, email, role)/action: update/action: delete. A delete ALWAYS needsreassign_to— the user id that inherits the deleted account's posts (Iron Rule #4). - Comments:
rolepod_wp_comment(action: moderate, id, status)where status is approve / hold / spam / trash;action: delete(addforce: trueto purge permanently instead of trashing);action: list. - Custom post types:
rolepod_wp_cpt_scaffold(slug, singular, plural)writes a small regular plugin thatregister_post_types the CPT + flushes rewrite rules on activation, then activates it. Re-running for the same slug returnsCPT_ALREADY_EXISTS. Multisite is unsupported.
6. Confirm + surface
State the operation, the id (post / user / option / attachment), and any warnings. If the response includes _links, just show the canonical link.
If a matching Rolepod agent is available
rolepod:rolepod-builderwithdomain: writing(audience: user) for copy quality.rolepod:rolepod-builderfor non-trivial REST orchestration.
If no matching agent is available
- Pick the tool from the table.
- For updates: read first, then update.
- Default
status=draft. - Surface the result.
Output
No durable artifact — content lives in WordPress. The MCP returns IDs + canonical links.
Examples
Read when constructing Gutenberg block markup or chaining multiple REST calls:
examples/content-examples.md— good vs bad block markup; full landing-page composition example.
References
Inline only. REST surface is documented at https://developer.wordpress.org/rest-api/reference/. Use rolepod_wp_rest_dump to discover the current site's actual routes.
Hard stops
db_querywith non-SELECT → tool returnsDB_WRITE_BLOCKED. STOP; re-route via REST or wp-cli (companion/wp-cliendpoint viawp-execute-php's sibling pattern — but cleaner: use the right REST endpoint).option_seton production-matched siteurl withoutconfirm: true→ STOP. Ask user for explicit confirmation, then retry withconfirm: true.post_updatewithoutid→ STOP, ask the user which post.
Full Rolepod enhancement
Full Rolepod adds bulk batching (run 20 post_create in one composite call with optimistic concurrency); standalone, batch by orchestrating individual calls.
Next phase
- After publish →
wp-health-checkto verify the page is reachable. - For a builder layout pass →
wp-edit-design. - For plugin-specific writes (Yoast meta, ACF fields) →
wp-edit-plugin.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

