From 0fea15278f933bf474467d21ae9443cd289749ed Mon Sep 17 00:00:00 2001 From: Ben Kalsky Date: Tue, 21 Jul 2026 01:40:05 +0300 Subject: [PATCH 1/5] feat: package repo as Claude Code plugin (wordpress-api-pro) Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude-plugin/plugin.json | 9 +++++++++ .claude/settings.json | 17 +++++++++++++++++ .claude/skills/wordpress-api-pro | 1 + README.md | 8 ++++++++ skills/wordpress-api-pro | 1 + 5 files changed, 36 insertions(+) create mode 100644 .claude-plugin/plugin.json create mode 100644 .claude/settings.json create mode 120000 .claude/skills/wordpress-api-pro create mode 120000 skills/wordpress-api-pro diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..26f0dcd --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,9 @@ +{ + "name": "wordpress-api-pro", + "displayName": "WordPress API Pro", + "description": "Manage WordPress sites via REST API — posts, media, Elementor content, ACF/JetEngine fields, WooCommerce, SEO meta, site audit, and safe batch operations.", + "author": { + "name": "Ben Kalsky", + "email": "benkalsky@gmail.com" + } +} diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..2c66c3c --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,17 @@ +{ + "extraKnownMarketplaces": { + "digitizer-skills": { + "source": { "source": "github", "repo": "Digitizers/agent-skills" } + } + }, + "enabledPlugins": { + "agent-skills@digitizer-skills": true, + "cloudways-mcp@digitizer-skills": true, + "hostinger-mcp@digitizer-skills": true, + "aura-mcp@digitizer-skills": true, + "wordpress-api-pro@digitizer-skills": true, + "siteagent-elementor-studio@digitizer-skills": true, + "meta-ads-mcp@digitizer-skills": true, + "sumit-mcp@digitizer-skills": true + } +} diff --git a/.claude/skills/wordpress-api-pro b/.claude/skills/wordpress-api-pro new file mode 120000 index 0000000..8050a5d --- /dev/null +++ b/.claude/skills/wordpress-api-pro @@ -0,0 +1 @@ +../../wordpress-api-pro \ No newline at end of file diff --git a/README.md b/README.md index 44aa248..605f5b7 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,14 @@ cd wordpress-api-pro bash INSTALL.sh ``` +### Windows note + +The plugin ships its skill through a git **symlink** (`skills/` → the in-repo +source). Cloning with `core.symlinks=false` — the default on many Windows +setups — turns that link into a plain text file and the skill will not load. +Before installing on Windows, enable Developer Mode and run +`git config --global core.symlinks true`, or use WSL. macOS/Linux need nothing. + Then restart Claude Code, export `WP_URL` / `WP_USERNAME` / `WP_APP_PASSWORD` (or set up `config/sites.json`), and ask Claude to use it. The ACF / SEO / JetEngine / plugin-detection scripts need `requests` (`pip install requests`); the core post/page/media/WooCommerce/batch scripts use the Python stdlib only. > Pairs well with the [Elementor MCP kit](https://github.com/Digitizers/siteagent-elementor-studio): build pages with the MCP, then handle media uploads, SEO meta, custom fields, and WooCommerce with these scripts. diff --git a/skills/wordpress-api-pro b/skills/wordpress-api-pro new file mode 120000 index 0000000..bf259cf --- /dev/null +++ b/skills/wordpress-api-pro @@ -0,0 +1 @@ +../wordpress-api-pro \ No newline at end of file From 4b143e2f80f59de5157fc3093ca7cd3d7b8d98d2 Mon Sep 17 00:00:00 2001 From: Ben Kalsky Date: Tue, 21 Jul 2026 01:49:02 +0300 Subject: [PATCH 2/5] chore(plugin): studio author identity + Windows note v2 (owner decisions + Codex P2) - Update plugin author to studio-neutral { "name": "Digitizer" } (owner decision) - Replace Windows note with pre-clone config guidance + checkout repair steps (Codex P2) Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude-plugin/plugin.json | 5 +---- README.md | 10 ++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 26f0dcd..39b98f7 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,8 +2,5 @@ "name": "wordpress-api-pro", "displayName": "WordPress API Pro", "description": "Manage WordPress sites via REST API — posts, media, Elementor content, ACF/JetEngine fields, WooCommerce, SEO meta, site audit, and safe batch operations.", - "author": { - "name": "Ben Kalsky", - "email": "benkalsky@gmail.com" - } + "author": { "name": "Digitizer" } } diff --git a/README.md b/README.md index 605f5b7..f25868f 100644 --- a/README.md +++ b/README.md @@ -90,10 +90,12 @@ bash INSTALL.sh ### Windows note The plugin ships its skill through a git **symlink** (`skills/` → the in-repo -source). Cloning with `core.symlinks=false` — the default on many Windows -setups — turns that link into a plain text file and the skill will not load. -Before installing on Windows, enable Developer Mode and run -`git config --global core.symlinks true`, or use WSL. macOS/Linux need nothing. +source). On Windows, enable Developer Mode and set +`git config --global core.symlinks true` **before** cloning or installing — +the plugin cache clone inherits it. Changing the config does not repair an +existing checkout (the repo may have recorded `core.symlinks=false` locally): +inside it run `git config core.symlinks true && git checkout -- .`, or +re-clone. WSL also works. macOS/Linux need nothing. Then restart Claude Code, export `WP_URL` / `WP_USERNAME` / `WP_APP_PASSWORD` (or set up `config/sites.json`), and ask Claude to use it. The ACF / SEO / JetEngine / plugin-detection scripts need `requests` (`pip install requests`); the core post/page/media/WooCommerce/batch scripts use the Python stdlib only. From 1d531ea709286257254089370b46378d08b183de Mon Sep 17 00:00:00 2001 From: Ben Kalsky Date: Tue, 21 Jul 2026 01:56:16 +0300 Subject: [PATCH 3/5] =?UTF-8?q?docs(readme):=20Windows=20note=20v3=20?= =?UTF-8?q?=E2=80=94=20scoped,=20non-destructive=20repair=20(Codex=20P2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The repair instruction used `&&` (unsupported in PowerShell 5.1) and a repo-wide `git checkout -- .`, which silently discards uncommitted edits everywhere. Now two separate commands, with the checkout scoped to `skills/` so only the symlink entry is re-materialized and the rest of the working tree is untouched. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 305 ++---------------------------------------------------- 1 file changed, 6 insertions(+), 299 deletions(-) diff --git a/README.md b/README.md index f25868f..8991a10 100644 --- a/README.md +++ b/README.md @@ -93,304 +93,11 @@ The plugin ships its skill through a git **symlink** (`skills/` → the in-repo source). On Windows, enable Developer Mode and set `git config --global core.symlinks true` **before** cloning or installing — the plugin cache clone inherits it. Changing the config does not repair an -existing checkout (the repo may have recorded `core.symlinks=false` locally): -inside it run `git config core.symlinks true && git checkout -- .`, or -re-clone. WSL also works. macOS/Linux need nothing. +existing checkout (the repo may have recorded `core.symlinks=false` locally). +To repair one, run these two commands inside it (the second re-materializes +only the `skills/` entry, so nothing else in your working tree is touched): -Then restart Claude Code, export `WP_URL` / `WP_USERNAME` / `WP_APP_PASSWORD` (or set up `config/sites.json`), and ask Claude to use it. The ACF / SEO / JetEngine / plugin-detection scripts need `requests` (`pip install requests`); the core post/page/media/WooCommerce/batch scripts use the Python stdlib only. + git config core.symlinks true + git checkout -- skills/ -> Pairs well with the [Elementor MCP kit](https://github.com/Digitizers/siteagent-elementor-studio): build pages with the MCP, then handle media uploads, SEO meta, custom fields, and WooCommerce with these scripts. - -## Quick Start - -### Option A: Multi-Site Setup — recommended for 2+ sites ⭐ - -**1. Copy config template:** - -```bash -cd ~/.openclaw/workspace/skills/wordpress-api-pro -cp config/sites.example.json config/sites.json -chmod 600 config/sites.json -``` - -**2. Edit `config/sites.json`:** - -```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:** - -```bash -# 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 draft -``` - -### Option B: Single Site Setup - -**1. Create an Application Password** - -1. Open `https://your-site.example/wp-admin/profile.php`. -2. Scroll to **Application Passwords**. -3. Create a password for a dedicated API user. -4. Copy it once and store it in a secret manager or environment variable. - -**2. Set environment variables** - -```bash -export WP_URL="https://your-site.example" -export WP_USERNAME="wp-api-user" -read -rs WP_APP_PASSWORD -export WP_APP_PASSWORD -``` - -**3. Use the scripts** - -```bash -cd wordpress-api-pro -``` - -**Update a post:** - -```bash -python3 scripts/update_post.py \ - --post-id 123 \ - --title "New Title" \ - --content "Updated content" \ - --status draft -``` - -**Create a draft:** - -```bash -python3 scripts/create_post.py \ - --title "My Post" \ - --content "Post content here" \ - --status draft -``` - -**Get a post:** - -```bash -python3 scripts/get_post.py --post-id 123 -``` - -**List posts:** - -```bash -python3 scripts/list_posts.py --per-page 10 --status publish -``` - -## Batch Operations - -Dry-run preview is the default: - -```bash -cd wordpress-api-pro -python3 scripts/batch_update.py \ - --group client \ - --post-ids 123,456 \ - --status draft -``` - -Apply only after review: - -```bash -cd wordpress-api-pro -python3 scripts/batch_update.py \ - --group client \ - --post-ids 123,456 \ - --status draft \ - --execute -``` - -## Scripts - -### Core Scripts - -| 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 | - -### Plugin & Commerce Scripts - -| 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 | - -## Examples - -**Detect supported plugins:** - -```bash -python3 scripts/detect_plugins.py -``` - -**Get ACF fields:** - -```bash -python3 scripts/acf_fields.py --post-id 123 -``` - -**Set SEO meta:** - -```bash -python3 scripts/seo_meta.py \ - --post-id 123 \ - --set '{"title":"SEO Title","description":"Meta description"}' -``` - -**Update JetEngine field:** - -```bash -python3 scripts/jetengine_fields.py \ - --post-id 123 \ - --field my_field \ - --value "New value" -``` - -**Elementor content:** - -```bash -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:** - -```bash -python3 scripts/upload_media.py \ - --file ./media/image.jpg \ - --title "My Image" \ - --caption "A beautiful image" -``` - -Remote media requires explicit opt-in: - -```bash -python3 scripts/upload_media.py \ - --file https://cdn.example.com/image.png \ - --allow-remote-url \ - --set-featured \ - --post-id 123 -``` - -**WooCommerce products:** - -```bash -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" -``` - -## Safety Model - -- ✅ 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.json` local, untracked, and `chmod 600`. -- ✅ Review dry-runs before live batch updates. -- ❌ Never commit credentials to git. -- ❌ Never publish or update live content without explicit approval. - -## Publishing to ClawHub - -Releases are published to ClawHub automatically via GitHub Actions ([`.github/workflows/publish-clawhub.yml`](.github/workflows/publish-clawhub.yml)). - -**One-time setup:** add a repository secret named `CLAWHUB_TOKEN` (Settings → Secrets and variables → Actions). Get the token from `clawhub login` locally or your ClawHub account. - -**Release flow:** -1. Bump the `version:` in `wordpress-api-pro/SKILL.md` (the source of truth ClawHub displays) and add a `CHANGELOG.md` entry. -2. Publish a GitHub Release → the workflow installs the `clawhub` CLI, authenticates with `CLAWHUB_TOKEN`, and runs `clawhub skill publish wordpress-api-pro --version `. - -Trigger it manually from the Actions tab (workflow_dispatch) with **dry-run on** to preview the publish plan without uploading. - -## Documentation - -- **`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. - -## Requirements - -- Python 3.8+ -- WordPress 5.6+ recommended for built-in Application Passwords -- `requests` for plugin integration scripts: `pip install requests` - -## Use Cases - -- 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. - -## Links - -- **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 - -## License - -MIT-0 — see [LICENSE.txt](LICENSE.txt) - ---- - -Built with ❤️ for OpenClaw by [Digitizer](https://www.digitizer.studio) +Or simply re-clone. WSL also works. macOS/Linux need nothing. From 49a88e1384b19ac45b68d437243fed00813d192e Mon Sep 17 00:00:00 2001 From: Ben Kalsky Date: Tue, 21 Jul 2026 02:02:26 +0300 Subject: [PATCH 4/5] fix(readme): restore content truncated by the note-v3 replacement (Codex P2) The automated v3-note swap truncated from the note header to end of file, deleting every section that followed it (quick start, env setup, script docs, release procedure / links and footer). Rebuilt from the pre-v3 revision with only the Windows-note section replaced by v3. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 298 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) diff --git a/README.md b/README.md index 8991a10..4f20b2a 100644 --- a/README.md +++ b/README.md @@ -101,3 +101,301 @@ only the `skills/` entry, so nothing else in your working tree is touched): git checkout -- skills/ Or simply re-clone. WSL also works. macOS/Linux need nothing. + +Then restart Claude Code, export `WP_URL` / `WP_USERNAME` / `WP_APP_PASSWORD` (or set up `config/sites.json`), and ask Claude to use it. The ACF / SEO / JetEngine / plugin-detection scripts need `requests` (`pip install requests`); the core post/page/media/WooCommerce/batch scripts use the Python stdlib only. + +> Pairs well with the [Elementor MCP kit](https://github.com/Digitizers/siteagent-elementor-studio): build pages with the MCP, then handle media uploads, SEO meta, custom fields, and WooCommerce with these scripts. + +## Quick Start + +### Option A: Multi-Site Setup — recommended for 2+ sites ⭐ + +**1. Copy config template:** + +```bash +cd ~/.openclaw/workspace/skills/wordpress-api-pro +cp config/sites.example.json config/sites.json +chmod 600 config/sites.json +``` + +**2. Edit `config/sites.json`:** + +```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:** + +```bash +# 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 draft +``` + +### Option B: Single Site Setup + +**1. Create an Application Password** + +1. Open `https://your-site.example/wp-admin/profile.php`. +2. Scroll to **Application Passwords**. +3. Create a password for a dedicated API user. +4. Copy it once and store it in a secret manager or environment variable. + +**2. Set environment variables** + +```bash +export WP_URL="https://your-site.example" +export WP_USERNAME="wp-api-user" +read -rs WP_APP_PASSWORD +export WP_APP_PASSWORD +``` + +**3. Use the scripts** + +```bash +cd wordpress-api-pro +``` + +**Update a post:** + +```bash +python3 scripts/update_post.py \ + --post-id 123 \ + --title "New Title" \ + --content "Updated content" \ + --status draft +``` + +**Create a draft:** + +```bash +python3 scripts/create_post.py \ + --title "My Post" \ + --content "Post content here" \ + --status draft +``` + +**Get a post:** + +```bash +python3 scripts/get_post.py --post-id 123 +``` + +**List posts:** + +```bash +python3 scripts/list_posts.py --per-page 10 --status publish +``` + +## Batch Operations + +Dry-run preview is the default: + +```bash +cd wordpress-api-pro +python3 scripts/batch_update.py \ + --group client \ + --post-ids 123,456 \ + --status draft +``` + +Apply only after review: + +```bash +cd wordpress-api-pro +python3 scripts/batch_update.py \ + --group client \ + --post-ids 123,456 \ + --status draft \ + --execute +``` + +## Scripts + +### Core Scripts + +| 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 | + +### Plugin & Commerce Scripts + +| 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 | + +## Examples + +**Detect supported plugins:** + +```bash +python3 scripts/detect_plugins.py +``` + +**Get ACF fields:** + +```bash +python3 scripts/acf_fields.py --post-id 123 +``` + +**Set SEO meta:** + +```bash +python3 scripts/seo_meta.py \ + --post-id 123 \ + --set '{"title":"SEO Title","description":"Meta description"}' +``` + +**Update JetEngine field:** + +```bash +python3 scripts/jetengine_fields.py \ + --post-id 123 \ + --field my_field \ + --value "New value" +``` + +**Elementor content:** + +```bash +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:** + +```bash +python3 scripts/upload_media.py \ + --file ./media/image.jpg \ + --title "My Image" \ + --caption "A beautiful image" +``` + +Remote media requires explicit opt-in: + +```bash +python3 scripts/upload_media.py \ + --file https://cdn.example.com/image.png \ + --allow-remote-url \ + --set-featured \ + --post-id 123 +``` + +**WooCommerce products:** + +```bash +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" +``` + +## Safety Model + +- ✅ 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.json` local, untracked, and `chmod 600`. +- ✅ Review dry-runs before live batch updates. +- ❌ Never commit credentials to git. +- ❌ Never publish or update live content without explicit approval. + +## Publishing to ClawHub + +Releases are published to ClawHub automatically via GitHub Actions ([`.github/workflows/publish-clawhub.yml`](.github/workflows/publish-clawhub.yml)). + +**One-time setup:** add a repository secret named `CLAWHUB_TOKEN` (Settings → Secrets and variables → Actions). Get the token from `clawhub login` locally or your ClawHub account. + +**Release flow:** +1. Bump the `version:` in `wordpress-api-pro/SKILL.md` (the source of truth ClawHub displays) and add a `CHANGELOG.md` entry. +2. Publish a GitHub Release → the workflow installs the `clawhub` CLI, authenticates with `CLAWHUB_TOKEN`, and runs `clawhub skill publish wordpress-api-pro --version `. + +Trigger it manually from the Actions tab (workflow_dispatch) with **dry-run on** to preview the publish plan without uploading. + +## Documentation + +- **`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. + +## Requirements + +- Python 3.8+ +- WordPress 5.6+ recommended for built-in Application Passwords +- `requests` for plugin integration scripts: `pip install requests` + +## Use Cases + +- 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. + +## Links + +- **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 + +## License + +MIT-0 — see [LICENSE.txt](LICENSE.txt) + +--- + +Built with ❤️ for OpenClaw by [Digitizer](https://www.digitizer.studio) From 02f1ed2122482fb20394f2d3c619395730450063 Mon Sep 17 00:00:00 2001 From: Ben Kalsky Date: Tue, 21 Jul 2026 02:03:10 +0300 Subject: [PATCH 5/5] =?UTF-8?q?docs(readme):=20Windows=20note=20v4=20?= =?UTF-8?q?=E2=80=94=20repair=20covers=20both=20symlink=20entries=20(Codex?= =?UTF-8?q?=20P2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scoped checkout fixed skills/ but left .claude/skills/ as a plain file on symlink-less checkouts (reproduced by the reviewer), so cloud-session discovery stayed broken after "repair". The command now re-materializes both entries; where .claude/skills/ is the real source directory the extra path is a no-op. cloudways also gains set -euo pipefail in the no-leak guard step so a missing perl or grep error fails CI loudly instead of passing silently. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4f20b2a..be7b747 100644 --- a/README.md +++ b/README.md @@ -95,10 +95,11 @@ source). On Windows, enable Developer Mode and set the plugin cache clone inherits it. Changing the config does not repair an existing checkout (the repo may have recorded `core.symlinks=false` locally). To repair one, run these two commands inside it (the second re-materializes -only the `skills/` entry, so nothing else in your working tree is touched): +only the plugin's symlink entries, so nothing else in your working tree is +touched): git config core.symlinks true - git checkout -- skills/ + git checkout -- skills/ .claude/skills/ Or simply re-clone. WSL also works. macOS/Linux need nothing.