PluginBench
Skill
Fail
Audit score 45

wordpress-content

jezweb/claude-skills

Create and manage WordPress posts, pages, media, categories, tags, and menus via WP-CLI or REST API.

What is wordpress-content?

Automate WordPress content operations including publishing blog posts, updating pages, uploading media, managing taxonomies, and organizing navigation menus. Use this skill whenever you need to create, edit, or bulk-manage content on a WordPress site.

  • Create and publish blog posts, pages, and scheduled content with custom metadata
  • Upload and manage media files with featured image assignment and thumbnail regeneration
  • Create and organize categories, tags, and custom taxonomies
  • Build and update navigation menus with pages, custom links, and category archives
  • Perform bulk content operations and search-replace across the site
  • Access content via WP-CLI (SSH) or WordPress REST API with Application Password authentication

How to install wordpress-content

npx skills add https://github.com/jezweb/claude-skills --skill wordpress-content
Prerequisites
  • Working WP-CLI SSH connection or WordPress REST API credentials (use wordpress-setup skill first)
  • Site configuration from wordpress.config.json or wp-cli.yml
Claude Code
Cursor
Windsurf
Cline

How to use wordpress-content

  1. 1.Determine your operation type (single post, bulk, media, taxonomy, or menu management)
  2. 2.Choose WP-CLI for SSH access or REST API if SSH is unavailable
  3. 3.Create content using the appropriate command (wp post create, wp media import, wp term create, etc.)
  4. 4.For complex HTML content, write to a temporary file and pass the file path to WP-CLI
  5. 5.Verify the operation by retrieving the post details and confirming the live URL
  6. 6.Provide the admin edit URL and live post URL to the user

Use cases

Good for
  • Publishing a new blog post with categories, tags, and featured image in one operation
  • Uploading product photos and setting them as featured images on product pages
  • Creating a hierarchical category structure for a news site
  • Bulk updating post status from draft to published across multiple posts
  • Scheduling content to publish at a specific date and time
Who it's for
  • WordPress site administrators and content managers
  • Developers automating content workflows
  • Marketing teams managing multi-post campaigns
  • Content migration specialists

wordpress-content FAQ

Should I use WP-CLI or REST API?

Use WP-CLI if you have SSH access — it's faster and more powerful. Use REST API only when SSH is unavailable; it requires an Application Password generated in WordPress settings.

How do I upload media from a URL vs. a local file?

For URLs, use `wp media import "https://..."` directly. For local files on a remote server, first SCP the file to the server, then import from the server path.

Can I schedule posts to publish in the future?

Yes, use `--post_status=future` with `--post_date="YYYY-MM-DD HH:MM:SS"` to schedule posts. WordPress will automatically publish them at the specified time.

How do I set a featured image on a post?

Import the media file to get its attachment ID, then use `wp post meta update {post_id} _thumbnail_id {attachment_id}` to assign it as the featured image.

What's the safest way to do search-replace across the site?

Always run with `--dry-run` first to preview changes, then execute with `--precise` flag. Optionally limit to specific tables or columns to reduce risk.

Full instructions (SKILL.md)

Source of truth, from jezweb/claude-skills.


name: wordpress-content description: "Create and manage WordPress posts, pages, media, categories, tags, and menus via WP-CLI or the REST API. Use whenever the user wants to publish a blog post on WordPress, update a page, upload media, manage categories or tags, update navigation menus, schedule posts, or do bulk content operations on a WordPress site." compatibility: claude-code-only

WordPress Content

Create, update, and manage WordPress content — posts, pages, media, categories, tags, and menus. Produces live content on the site via WP-CLI or the REST API.

Prerequisites

  • Working WP-CLI SSH connection or REST API credentials (use wordpress-setup skill)
  • Site config from wordpress.config.json or wp-cli.yml

Workflow

Step 1: Determine the Operation

TaskBest Method
Create/edit single post or pageWP-CLI wp post create/update
Bulk create postsWP-CLI loop or REST API batch
Upload images/mediaWP-CLI wp media import
Manage categories/tagsWP-CLI wp term
Update navigation menusWP-CLI wp menu
Scheduled postsWP-CLI with --post_date
Complex HTML contentWrite to temp file, pass to WP-CLI
No SSH access availableREST API with Application Password

Step 2: Create Content

Blog Posts

# Simple post
wp @site post create \
  --post_type=post \
  --post_title="My New Blog Post" \
  --post_content="<p>Post content here.</p>" \
  --post_status=draft \
  --post_category=3,5

# Post from HTML file (better for long content)
wp @site post create ./post-content.html \
  --post_type=post \
  --post_title="My New Blog Post" \
  --post_status=draft \
  --post_excerpt="A brief summary of the post." \
  --post_category=3,5 \
  --tags_input="tag1,tag2"

Post statuses: draft, publish, pending, future (use with --post_date)

Pages

wp @site post create \
  --post_type=page \
  --post_title="About Us" \
  --post_content="<h2>Our Story</h2><p>Content here...</p>" \
  --post_status=publish \
  --post_parent=0 \
  --menu_order=10

Scheduled Posts

wp @site post create \
  --post_type=post \
  --post_title="Scheduled Post" \
  --post_content="<p>This goes live tomorrow.</p>" \
  --post_status=future \
  --post_date="2026-02-23 09:00:00"

Step 3: Upload Media

# Upload from URL
wp @site media import "https://example.com/image.jpg" \
  --title="Product Photo" \
  --alt="Product front view" \
  --caption="Our latest product"

# Upload from local file (requires SCP first for remote sites)
scp ./image.jpg user@host:/tmp/image.jpg
wp @site media import /tmp/image.jpg --title="Local Upload"

# Import and set as featured image in one step
wp @site media import "https://example.com/hero.jpg" \
  --title="Hero" --featured_image --post_id={id}

# List media
wp @site post list --post_type=attachment --fields=ID,post_title,guid

# Regenerate thumbnails
wp @site media regenerate --yes

Set featured image on a post:

# Get the attachment ID from the import output, then:
wp @site post meta update {post_id} _thumbnail_id {attachment_id}

Step 4: Manage Taxonomy

Categories

# List categories
wp @site term list category --fields=term_id,name,slug,count

# Create category
wp @site term create category "News" --slug=news --description="Company news and updates"

# Create child category
wp @site term create category "Product News" --slug=product-news --parent=5

# Update category
wp @site term update category {term_id} --name="Updated Name"

# Assign category to post
wp @site post term add {post_id} category news

Tags

# List tags
wp @site term list post_tag --fields=term_id,name,slug,count

# Create tag
wp @site term create post_tag "new-tag"

# Add tags during post creation
wp @site post create --post_title="..." --tags_input="seo,marketing,tips"

# Add tags to existing post
wp @site post term add {post_id} post_tag seo marketing tips

Step 5: Manage Menus

# List menus
wp @site menu list --fields=term_id,name,slug,count

# List items in a menu
wp @site menu item list main-menu --fields=db_id,type,title,link,position

# Add page to menu
wp @site menu item add-post main-menu {page_id} --title="About Us"

# Add custom link
wp @site menu item add-custom main-menu "Contact" "https://example.com/contact/"

# Add category archive to menu
wp @site menu item add-term main-menu category {term_id}

# Reorder (set position)
wp @site menu item update {item_id} --position=3

# Delete menu item
wp @site menu item delete {item_id}

Step 6: Update Existing Content

# Update post title and content
wp @site post update {post_id} \
  --post_title="Updated Title" \
  --post_content="<p>New content.</p>"

# Update from file
wp @site post update {post_id} ./updated-content.html

# Search posts
wp @site post list --s="search term" --fields=ID,post_title

# Bulk update status
wp @site post list --post_type=post --post_status=draft --field=ID | \
  xargs -I {} wp @site post update {} --post_status=publish

# Delete (trash)
wp @site post delete {post_id}

# Delete permanently
wp @site post delete {post_id} --force

Step 7: Post Meta and Custom Fields

# Get all meta for a post
wp @site post meta list {post_id} --fields=meta_key,meta_value

# Get specific meta
wp @site post meta get {post_id} meta_key

# Set meta
wp @site post meta update {post_id} meta_key "meta_value"

# Add meta (allows duplicates)
wp @site post meta add {post_id} meta_key "meta_value"

# Delete meta
wp @site post meta delete {post_id} meta_key

ACF stores fields with both the field value and a reference key (_field_name -> field_abc123).

Step 8: Search and Replace

# Dry run first — always
wp @site search-replace "old text" "new text" --dry-run

# Execute
wp @site search-replace "old text" "new text" --precise

# Limit to specific table
wp @site search-replace "old" "new" wp_posts --precise

# Limit to specific column
wp @site search-replace "old" "new" wp_posts post_content --precise

Step 9: Export and Import

# Export all content
wp @site export --dir=/tmp/

# Export specific post type
wp @site export --post_type=post --dir=/tmp/

# Import
wp @site import /path/to/file.xml --authors=mapping.csv

Step 10: Verify

# Check the post
wp @site post get {post_id} --fields=ID,post_title,post_status,guid

# Get the live URL
wp @site post get {post_id} --field=guid

# List recent posts
wp @site post list --post_type=post --posts_per_page=5 --fields=ID,post_title,post_status,post_date

Provide the admin URL and live URL:

  • Admin: https://example.com/wp-admin/post.php?post={id}&action=edit
  • Live: https://example.com/{slug}/

REST API Reference

When WP-CLI is not available, use the WordPress REST API with Application Password auth.

Authentication

# Base64 encode credentials
AUTH=$(echo -n "username:xxxx xxxx xxxx xxxx xxxx xxxx" | base64)

# Use in requests
curl -s https://example.com/wp-json/wp/v2/posts \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json"

Endpoints

ResourceEndpoint
Posts/wp-json/wp/v2/posts
Pages/wp-json/wp/v2/pages
Media/wp-json/wp/v2/media
Categories/wp-json/wp/v2/categories
Tags/wp-json/wp/v2/tags

All support GET (list/single), POST (create), PUT (update), DELETE.

Create Post via REST

curl -s https://example.com/wp-json/wp/v2/posts \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "My New Post",
    "content": "<p>Post content here.</p>",
    "status": "draft",
    "categories": [3, 5],
    "tags": [10, 12],
    "excerpt": "Brief summary",
    "featured_media": 456
  }' | jq '{id, link, status}'

Create Page via REST

curl -s https://example.com/wp-json/wp/v2/pages \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "About Us",
    "content": "<h2>Our Story</h2><p>Content...</p>",
    "status": "publish",
    "parent": 0
  }'

Upload Media via REST

curl -s https://example.com/wp-json/wp/v2/media \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Disposition: attachment; filename=photo.jpg" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg | jq '{id, source_url}'

Create Category via REST

curl -s https://example.com/wp-json/wp/v2/categories \
  -H "Authorization: Basic $AUTH" \
  -H "Content-Type: application/json" \
  -d '{"name": "News", "slug": "news", "description": "Company updates"}'

Query Parameters

ParameterPurposeExample
per_pageResults per page (max 100)?per_page=50
pagePagination?page=2
searchSearch term?search=keyword
statusFilter by status?status=draft
categoriesFilter by category ID?categories=3
orderbySort field?orderby=date
orderSort direction?order=desc
_fieldsLimit response fields?_fields=id,title,link

Menus: Navigation menus have limited REST API support. The /wp-json/wp/v2/navigation endpoint exists for block-based navigation in FSE themes. For classic menus, use WP-CLI.


Critical Patterns

HTML Content in WP-CLI

For anything beyond a sentence, write HTML to a temp file and pass it:

cat > /tmp/post-content.html << 'EOF'
<h2>Section Heading</h2>
<p>Paragraph content with <strong>bold</strong> and <a href="/link">links</a>.</p>
<ul>
  <li>List item one</li>
  <li>List item two</li>
</ul>
EOF

wp @site post create /tmp/post-content.html --post_title="My Post" --post_status=draft

Shell quoting in --post_content is fragile for complex HTML.

Bulk Operations

For creating many posts, use a loop with verification:

while IFS=, read -r title slug content_file category; do
  wp @site post create "$content_file" \
    --post_type=post \
    --post_title="$title" \
    --post_name="$slug" \
    --post_category="$category" \
    --post_status=draft
  sleep 0.5
done < posts.csv

Always create as draft first, review, then bulk-publish.