WordPress REST API integration skill for OpenClaw. Manage posts, pages, media, WooCommerce products, Elementor content, SEO metadata, ACF, JetEngine fields, and multi-site workflows programmatically β with explicit safety boundaries for agentic use.
- β
Elementor Content β read and update Elementor page content via
_elementor_data. - β Media Upload β upload images/files to the WordPress media library.
- β WooCommerce Products β list, create, read, and update WooCommerce products.
- β Full CRUD β create, read, update, and delete posts/pages.
- β Gutenberg Support β native block format and content workflows.
- β Secure Auth β WordPress Application Passwords recommended.
- β Media Management β local media upload plus explicit opt-in remote HTTPS media.
- β Batch Operations β list, filter, dry-run, and bulk update content.
- β
Multi-Site Workflows β manage named sites and site groups with
wp.sh. - β Plugin Support β ACF, JetEngine, Rank Math, and Yoast SEO helpers.
- β Safety Gates β dry-run defaults, explicit live-write flags, protected local file reads, and private-network URL blocking.
- β CI Verified β tested on Python 3.11, 3.12, and 3.13.
The actual skill payload lives in:
wordpress-api-pro/
Repository-only files such as this README, changelog, license, CI, and package metadata intentionally stay outside the skill directory.
ClawHub package directory: wordpress-api-pro/.
Current version: 3.4.0
openclaw skills install wordpress-api-procp -R wordpress-api-pro ~/.openclaw/workspace/skills/wordpress-api-pro1. Copy config template:
cd ~/.openclaw/workspace/skills/wordpress-api-pro
cp config/sites.example.json config/sites.json
chmod 600 config/sites.json2. Edit config/sites.json:
{
"sites": {
"client-main": {
"url": "https://example.com",
"username": "wp-api-user",
"app_password": "",
"description": "Primary client site"
},
"client-shop": {
"url": "https://shop.example.com",
"username": "wp-api-user",
"app_password": "",
"description": "WooCommerce shop"
}
},
"groups": {
"client": ["client-main", "client-shop"]
}
}Keep real credentials local only. Do not commit config/sites.json.
3. Use the CLI wrapper:
# List configured sites
./wp.sh --list-sites
# Read a post on a specific site
./wp.sh client-main get-post --id 123
# Update a post after approval
./wp.sh client-main update-post --id 123 --status draft
# Group operation requires explicit group execution flag
./wp.sh client --execute-group update-post --id 456 --status draft1. Create an Application Password
- Open
https://your-site.example/wp-admin/profile.php. - Scroll to Application Passwords.
- Create a password for a dedicated API user.
- Copy it once and store it in a secret manager or environment variable.
2. Set environment variables
export WP_URL="https://your-site.example"
export WP_USERNAME="wp-api-user"
read -rs WP_APP_PASSWORD
export WP_APP_PASSWORD3. Use the scripts
cd wordpress-api-proUpdate a post:
python3 scripts/update_post.py \
--post-id 123 \
--title "New Title" \
--content "Updated content" \
--status draftCreate a draft:
python3 scripts/create_post.py \
--title "My Post" \
--content "Post content here" \
--status draftGet a post:
python3 scripts/get_post.py --post-id 123List posts:
python3 scripts/list_posts.py --per-page 10 --status publishDry-run preview is the default:
cd wordpress-api-pro
python3 scripts/batch_update.py \
--group client \
--post-ids 123,456 \
--status draftApply only after review:
cd wordpress-api-pro
python3 scripts/batch_update.py \
--group client \
--post-ids 123,456 \
--status draft \
--execute| Script | Purpose |
|---|---|
update_post.py |
Update an existing post/page |
create_post.py |
Create a new post/page |
get_post.py |
Retrieve a single post/page |
list_posts.py |
List and filter posts/pages |
batch_update.py |
Dry-run-first batch updates across sites/groups |
wp_cli.py |
Multi-site command wrapper backend |
security.py |
Local file and remote URL safety helpers |
| Script | Purpose |
|---|---|
detect_plugins.py |
Auto-detect supported plugins β ACF, Rank Math, Yoast, JetEngine, WooCommerce |
acf_fields.py |
Read/write Advanced Custom Fields |
seo_meta.py |
Read/write Rank Math and Yoast SEO meta |
jetengine_fields.py |
Read/write JetEngine custom fields |
elementor_content.py |
Read/update Elementor page content |
upload_media.py |
Upload local or explicitly approved remote media |
woo_products.py |
Manage WooCommerce products |
Detect supported plugins:
python3 scripts/detect_plugins.pyGet ACF fields:
python3 scripts/acf_fields.py --post-id 123Set SEO meta:
python3 scripts/seo_meta.py \
--post-id 123 \
--set '{"title":"SEO Title","description":"Meta description"}'Update JetEngine field:
python3 scripts/jetengine_fields.py \
--post-id 123 \
--field my_field \
--value "New value"Elementor content:
python3 scripts/elementor_content.py get \
--post-id 123 \
--widget-id some_widget_id
python3 scripts/elementor_content.py update \
--post-id 123 \
--widget-id some_widget_id \
--field title \
--value "New Title"Media upload:
python3 scripts/upload_media.py \
--file ./media/image.jpg \
--title "My Image" \
--caption "A beautiful image"Remote media requires explicit opt-in:
python3 scripts/upload_media.py \
--file https://cdn.example.com/image.png \
--allow-remote-url \
--set-featured \
--post-id 123WooCommerce products:
python3 scripts/woo_products.py list --status publish
python3 scripts/woo_products.py get --id 456
python3 scripts/woo_products.py create --name "New Product" --type simple --regular-price 29.99
python3 scripts/woo_products.py update --id 456 --description "Updated product description"- β Use Application Passwords, not regular account passwords.
- β Prefer a dedicated least-privilege WordPress API user.
- β Always use HTTPS for production sites.
- β Store credentials in environment variables or local untracked config.
- β
Keep
config/sites.jsonlocal, untracked, andchmod 600. - β Review dry-runs before live batch updates.
- β Never commit credentials to git.
- β Never publish or update live content without explicit approval.
wordpress-api-pro/SKILL.mdβ full skill instructions for OpenClaw agents.wordpress-api-pro/references/api-reference.mdβ WordPress REST API reference.wordpress-api-pro/references/gutenberg-blocks.mdβ Gutenberg block format guide.
- Python 3.8+
- WordPress 5.6+ recommended for built-in Application Passwords
requestsfor plugin integration scripts:pip install requests
- Publishing and drafting blog posts.
- Content migration between WordPress sites.
- Batch updates across many posts or client sites.
- Automated content workflows with approval gates.
- WooCommerce product maintenance.
- Elementor landing page updates.
- SEO metadata operations.
- Agency multi-site operations.
- Integration with OpenClaw / agentic workflows.
- Repository: https://github.com/Digitizers/wordpress-api-pro
- ClawHub: https://clawhub.ai/benkalsky/wordpress-api-pro
- OpenClaw: https://openclaw.ai
- WordPress REST API: https://developer.wordpress.org/rest-api/
- Digitizer: https://www.digitizer.studio
MIT-0 β see LICENSE.txt
Built with β€οΈ for OpenClaw by Digitizer