From sundial-org-awesome-openclaw-skills-4
Automates WordPress management: posts, pages, WooCommerce products/orders/inventory, comments, SEO (Yoast/RankMath), media via REST API/WP-CLI. Bulk operations, multi-site, health checks, markdown to Gutenberg.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-2 --plugin sundial-org-awesome-openclaw-skills-4This skill uses the workspace's default tool permissions.
**Your WordPress site just got claws.**
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
v3.1.0Your WordPress site just got claws.
The only WordPress skill you'll ever need. 50+ features. Zero admin panels. Just tell me what you want.
Keywords: WordPress, WooCommerce, REST API, WP-CLI, blog automation, content management, ecommerce, posts, pages, media, comments, SEO, Yoast, RankMath, inventory, orders, coupons, bulk operations, multi-site, Gutenberg, publishing
You: "Create a post about sustainable coffee farming"
Bot: Done. Draft #1247 created. Want me to add a featured image?
You: "Publish all my drafts from this week"
Bot: Published 8 posts. Here are the links...
You: "Approve the good comments, spam the bots"
Bot: Approved 12, marked 47 as spam. Your comment section is clean.
No clicking. No admin panels. No friction.
| Task | Manual (WP Admin) | With Pinch to Post |
|---|---|---|
| Create 10 posts | 15-20 minutes | 30 seconds |
| Update inventory on 50 products | 45 minutes | 1 minute |
| Moderate 100 comments | 20 minutes | 10 seconds |
| Check content health on 5 posts | 30 minutes | 15 seconds |
| Export all posts to markdown | Hours | 5 seconds |
Time saved per week: 2-4 hours. Sanity saved: Immeasurable.
"I used to spend my Sunday mornings moderating comments. Now I just say 'clean up the comments' and go make pancakes."
"We manage 12 WordPress sites. This turned a full-time job into a 10-minute daily check-in."
"I didn't know I needed this until I had it. Now I can't go back."
Tested and optimized for:
Rate limiting built-in. Won't hammer your server.
WordPress Admin β Users β Profile β Application Passwords β Add New β Copy it
{
"skills": {
"entries": {
"pinch-to-post": {
"enabled": true,
"env": {
"WP_SITE_URL": "https://your-site.com",
"WP_USERNAME": "admin",
"WP_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx"
}
}
}
}
}
You're done. Go publish something.
{
"env": {
"WP_DEFAULT_SITE": "blog",
"WP_SITE_BLOG_URL": "https://blog.example.com",
"WP_SITE_BLOG_USER": "admin",
"WP_SITE_BLOG_PASS": "xxxx xxxx xxxx",
"WP_SITE_SHOP_URL": "https://shop.example.com",
"WP_SITE_SHOP_USER": "admin",
"WP_SITE_SHOP_PASS": "yyyy yyyy yyyy",
"WP_SITE_DOCS_URL": "https://docs.example.com",
"WP_SITE_DOCS_USER": "editor",
"WP_SITE_DOCS_PASS": "zzzz zzzz zzzz"
}
}
Now say "list posts on the shop site" and feel like a wizard.
{
"env": {
"WC_CONSUMER_KEY": "ck_xxxxxxxxxxxxxxxx",
"WC_CONSUMER_SECRET": "cs_xxxxxxxxxxxxxxxx"
}
}
Products, orders, inventory, coupons, sales reports. All yours.
{
"env": {
"TWITTER_API_KEY": "...",
"TWITTER_API_SECRET": "...",
"TWITTER_ACCESS_TOKEN": "...",
"TWITTER_ACCESS_SECRET": "...",
"LINKEDIN_ACCESS_TOKEN": "...",
"MASTODON_INSTANCE": "https://mastodon.social",
"MASTODON_ACCESS_TOKEN": "..."
}
}
One post. Three platforms. Zero extra work.
Everything below is what I can do. It's a lot. Grab a snack.
The bread and butter. The peanut butter and jelly. The... you get it.
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"title": "Post Title",
"content": "<!-- wp:paragraph --><p>Your brilliant words here</p><!-- /wp:paragraph -->",
"excerpt": "Brief summary for SEO nerds",
"status": "draft",
"categories": [1, 5],
"tags": [10, 15],
"featured_media": 123
}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"title": "Even Better Title", "status": "publish"}'
# Soft delete (trash)
curl -X DELETE "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
# Hard delete (gone forever)
curl -X DELETE "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}?force=true" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
# Recent stuff
curl -s "${WP_SITE_URL}/wp-json/wp/v2/posts?per_page=20&status=any" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
# Search (where did I put that post about llamas?)
curl -s "${WP_SITE_URL}/wp-json/wp/v2/posts?search=llamas" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
# By category
curl -s "${WP_SITE_URL}/wp-json/wp/v2/posts?categories=5" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
# By date (time travelers welcome)
curl -s "${WP_SITE_URL}/wp-json/wp/v2/posts?after=2026-01-01T00:00:00&before=2026-01-31T23:59:59" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"title": "This Post Is From The Future",
"content": "Scheduled content, so fancy",
"status": "future",
"date": "2026-02-15T10:00:00"
}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/pages" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"title": "About Us (We're Pretty Great)",
"content": "Page content here",
"status": "publish",
"template": "templates/full-width.php"
}'
Pictures! Videos! PDFs! All the things!
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/media" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Disposition: attachment; filename=masterpiece.jpg" \
-H "Content-Type: image/jpeg" \
--data-binary @/path/to/masterpiece.jpg
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/media/${MEDIA_ID}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"title": "Hero Image",
"alt_text": "A majestic llama wearing sunglasses",
"caption": "Living its best life"
}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts/{post_id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"featured_media": 456}'
Organize your chaos.
curl -s "${WP_SITE_URL}/wp-json/wp/v2/categories?per_page=100&hide_empty=false" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/categories" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"name": "Hot Takes", "slug": "hot-takes", "description": "Opinions nobody asked for"}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/tags" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"name": "must-read", "slug": "must-read"}'
The good, the bad, and the spammy.
curl -s "${WP_SITE_URL}/wp-json/wp/v2/comments?status=hold" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/comments/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"status": "approved"}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/comments/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"status": "spam"}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/comments" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"post": {post_id},
"parent": {comment_id},
"content": "Thanks for reading! You rock."
}'
for id in $(curl -s "${WP_SITE_URL}/wp-json/wp/v2/comments?status=hold&per_page=100" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" | jq -r '.[].id'); do
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/comments/${id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{"status": "approved"}'
done
Ka-ching! Let's make some money.
# List 'em
curl -s "${WP_SITE_URL}/wp-json/wc/v3/products?per_page=20" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}"
# Create one
curl -X POST "${WP_SITE_URL}/wp-json/wc/v3/products" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"name": "Fancy Widget",
"type": "simple",
"regular_price": "49.99",
"sale_price": "39.99",
"description": "It does widget things. Really well.",
"sku": "WIDGET-001",
"manage_stock": true,
"stock_quantity": 100
}'
# Update stock (sold a bunch!)
curl -X PUT "${WP_SITE_URL}/wp-json/wc/v3/products/{id}" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}" \
-H "Content-Type: application/json" \
-d '{"stock_quantity": 50}'
# Recent orders
curl -s "${WP_SITE_URL}/wp-json/wc/v3/orders?per_page=20" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}"
# Mark as shipped
curl -X PUT "${WP_SITE_URL}/wp-json/wc/v3/orders/{id}" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}" \
-H "Content-Type: application/json" \
-d '{"status": "completed"}'
# Add tracking note
curl -X POST "${WP_SITE_URL}/wp-json/wc/v3/orders/{id}/notes" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}" \
-H "Content-Type: application/json" \
-d '{"note": "Shipped via FedEx #123456", "customer_note": true}'
curl -X POST "${WP_SITE_URL}/wp-json/wc/v3/coupons" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"code": "SAVE20",
"discount_type": "percent",
"amount": "20",
"individual_use": true,
"usage_limit": 100,
"date_expires": "2026-12-31T23:59:59"
}'
# Monthly summary
curl -s "${WP_SITE_URL}/wp-json/wc/v3/reports/sales?period=month" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}"
# Top sellers
curl -s "${WP_SITE_URL}/wp-json/wc/v3/reports/top_sellers?period=month" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}"
curl -s "${WP_SITE_URL}/wp-json/wc/v3/products?stock_status=lowstock" \
-u "${WC_CONSUMER_KEY}:${WC_CONSUMER_SECRET}"
Because what good is content nobody can find?
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"meta": {
"_yoast_wpseo_title": "SEO Title | Your Site",
"_yoast_wpseo_metadesc": "A compelling description that makes people click (150-160 chars)",
"_yoast_wpseo_focuskw": "your main keyword"
}
}'
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"meta": {
"rank_math_title": "SEO Title",
"rank_math_description": "Meta description",
"rank_math_focus_keyword": "main keyword"
}
}'
Write like a developer. Publish like a designer.
Just write your content in markdown and I'll convert it to proper Gutenberg blocks:
| Markdown | Becomes |
|---|---|
# Heading | H1 block |
## Heading | H2 block |
Paragraph | Paragraph block |
- List item | List block |
> Quote | Quote block |
**bold** | Strong tag |
*italic* | Em tag |
--- | Separator block |
# Create post from markdown file
./wp-rest.sh create-post-markdown "My Amazing Post" content.md draft
Is your post actually good? Let's find out.
./wp-rest.sh health-check 123
What I Check:
Sample Output:
=== Content Health Score ===
Post: How to Train Your Dragon
β
Word count: 1,247
β
Title length: 24 chars
β οΈ Missing excerpt
β
Featured image: Set
β
Headings: 4 H2 tags
β οΈ No internal links
=== SCORE: 75/100 ===
π‘ Good, but could be improved.
One click. All platforms.
# Single post
post_to_twitter "Check out our latest blog post!" "https://your-site.com/post"
# Generate a thread from long content
create_twitter_thread 123
post_to_linkedin "New article: AI Trends for 2026" "https://your-site.com/ai-trends" "urn:li:person:YOUR_ID"
post_to_mastodon "Fresh content just dropped!" "https://your-site.com/post"
See your whole publishing schedule at a glance.
./wp-rest.sh calendar 2026-02
Output:
=== Content Calendar: 2026-02 ===
π Published:
2026-02-01 - Welcome to February
2026-02-05 - Product Launch Announcement
π
Scheduled:
2026-02-10 - Valentine's Day Guide
2026-02-20 - Industry Trends Report
π Drafts:
456 - Untitled masterpiece
789 - Ideas for later
For the power users with custom post types and complex data.
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts/{id}" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"acf": {
"event_date": "2026-03-15",
"event_location": "San Francisco",
"event_price": 99.99,
"speakers": [
{"name": "Jane Doe", "bio": "Expert in things"},
{"name": "John Smith", "bio": "Knows stuff"}
]
}
}'
Parlez-vous WordPress?
curl -X POST "${WP_SITE_URL}/wp-json/wp/v2/posts" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}" \
-H "Content-Type: application/json" \
-d '{
"title": "TΓtulo en EspaΓ±ol",
"content": "Contenido traducido",
"lang": "es",
"translation_of": 123
}'
curl -s "${WP_SITE_URL}/wp-json/pll/v1/languages" \
-u "${WP_USERNAME}:${WP_APP_PASSWORD}"
Keep your site running smooth.
./wp-rest.sh site-health
=== Site Health ===
REST API: β
OK
Auth: β
OK
Response: 0.342s
./wp-rest.sh stats
=== Content Statistics ===
Posts (publish): 142
Posts (draft): 23
Posts (pending): 5
Posts (future): 8
Pages: 15
Media: 892
Comments: 1,247
./wp-rest.sh backup ./my-backups
Creates timestamped JSON files for posts, pages, categories, and tags.
./wp-rest.sh export-markdown ./markdown-archive
Perfect for migrating or archiving your content.
When you need to do ALL THE THINGS.
./wp-rest.sh bulk-publish
./wp-rest.sh bulk-delete-old 2024-01-01
./wp-rest.sh bulk-approve-comments
Ask Clawdbot to help with these:
Pre-built structures for common content types.
{
"title": "{{title}}",
"content": "<!-- wp:paragraph -->\n<p>{{intro}}</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2>{{section_1}}</h2>\n<!-- /wp:heading -->\n\n...",
"status": "draft"
}
{
"title": "Introducing {{product}}",
"content": "Hero image, features list, pricing, CTA button..."
}
{
"title": "{{event_name}}",
"content": "Date, time, location, agenda, registration button..."
}
{
"title": "How to {{task}}",
"content": "Requirements, step-by-step instructions, tips..."
}
For local installs or SSH access.
# Posts
wp post create --post_title="Title" --post_status="draft"
wp post list --post_type=post --format=table
wp post delete {id} --force
# Media
wp media import /path/to/image.jpg --title="Title"
# Database
wp db export backup.sql
wp db optimize
wp search-replace 'old' 'new' --dry-run
# Cache
wp cache flush
wp transient delete --expired
# Users
wp user list
wp user create bob bob@email.com --role=editor
| Code | What It Means | What To Do |
|---|---|---|
| 401 | "Who are you?" | Check username/password |
| 403 | "Not allowed" | User needs more permissions |
| 404 | "Can't find it" | Check the URL or ID |
| 400 | "Bad request" | Check your JSON syntax |
| 500 | "Server broke" | Check server logs, pray |
curl ... | jq '.id'Does this work with WordPress.com?
Only Business/eCommerce plans (they have REST API access). Self-hosted WordPress works perfectly.
What about custom post types?
Yes! Any post type registered with the REST API works automatically.
Will this break my site?
No. Everything uses the official WordPress REST APIβthe same system the block editor uses.
Do I need to install a plugin?
Nope. WordPress has REST API built-in since version 4.7.
What permissions does my user need?
Administrator for full access, Editor for content, Author for their own posts.
Can I use this with WP Engine / Kinsta / Flywheel?
Yes. Works with any host that hasn't disabled the REST API (almost none do).
What about multisite (WordPress Network)?
Yes! Set up each subsite as a separate site in your config.
Not working?
β
βΌ
βββββββββββββββββββββββββββββββ
β Check Application Password β
β (regenerate if needed) β
ββββββββββββββββ¬βββββββββββββββ
β
βΌ
Still broken?
β
βΌ
βββββββββββββββββββββββββββββββ
β Check user role has β
β required capabilities β
ββββββββββββββββ¬βββββββββββββββ
β
βΌ
Still broken?
β
βΌ
βββββββββββββββββββββββββββββββ
β Check REST API is enabled β
β (visit /wp-json/ in browser)β
ββββββββββββββββ¬βββββββββββββββ
β
βΌ
Still broken?
β
βΌ
βββββββββββββββββββββββββββββββ
β Check server error logs β
βββββββββββββββββββββββββββββββ
Quick Fixes:
Built with π¦ and mass quantities of caffeine.
Made for people who'd rather talk to their sites than click through them.