This repository (WebDecoy/wordpress-plugin) is the canonical home of the
plugin. Releases are cut here. The copy under php-sdk/wordpress/ in the app
monorepo is a deprecated mirror — do not develop or release from it.
Update the version string in all of these:
webdecoy.php— theVersion:header and theWEBDECOY_VERSIONconstantreadme.txt—Stable tag:and the changelog sectionchangelog.txt— add the new version entry at the top
The SDK User-Agent derives from WEBDECOY_VERSION automatically — nothing to
bump there.
Before raising Tested up to: in readme.txt (or WC tested up to: in
webdecoy.php), run the Docker smoke tests in tests/wp-compat/ against that
WordPress or WooCommerce release (see its README). release.sh
copies Tested up to: into the CDN update-info.json, so the readme is the
single source of truth for both channels.
There are two builds from one codebase:
- CDN / self-hosted —
./build.sh <version>→dist/webdecoy-<version>.zip. Includes the self-hosted updater (includes/class-webdecoy-updater.php) and the bundled clearance client (public/js/webdecoy-clearance.js). This is whatrelease.shbuilds and uploads to the CDN. - WordPress.org —
./build.sh <version> --org→dist/webdecoy-<version>-wporg.zip. Strips the self-updater (the directory forbids self-updating plugins) and the minified clearance client, and drops CDN release tooling. This is what you submit to / commit to WordPress.org SVN. Chart.js is bundled locally in both builds.
./release.sh <version> # e.g. ./release.sh 2.2.1 (CDN build)This runs build.sh, produces dist/webdecoy-<version>.zip, and regenerates
cdn-files/update-info.json with the ZIP's SHA-256 (the self-hosted updater
rejects a package whose hash doesn't match). cdn-files/update-info.json is
git-ignored on purpose — it's a per-build artifact, uploaded to the CDN rather
than committed. cdn-files/plugin-info.json (the "View details" metadata) is
tracked; bump its version, download_url and changelog with every release.
bin/release-all.sh refuses to publish until it names the release, then
uploads it with the zip and manifest and checks what the CDN serves.
The plugin ZIP and CDN JSON are hosted on Cloudflare R2
(webdecoy-cdn-assets bucket, served at https://cdn.webdecoy.com/wordpress/):
npx wrangler r2 object put webdecoy-cdn-assets/wordpress/webdecoy-<version>.zip \
--file=./dist/webdecoy-<version>.zip --remote
npx wrangler r2 object put webdecoy-cdn-assets/wordpress/update-info.json \
--file=./cdn-files/update-info.json --remote
npx wrangler r2 object put webdecoy-cdn-assets/wordpress/plugin-info.json \
--file=./cdn-files/plugin-info.json --remoteSelf-hosted auto-updates are gated behind the WEBDECOY_SELF_HOSTED constant
and read update-info.json from the CDN — so the CDN's update-info.json must
always point at a ZIP that actually exists there with a matching SHA-256.
git tag -a v<version> -m "v<version> — <summary>"
git push origin v<version>The directory listing at https://wordpress.org/plugins/webdecoy is driven by
the SVN repo (https://plugins.svn.wordpress.org/webdecoy). A working copy
lives at .svn-wporg/ (git-ignored, excluded from builds). Credentials:
username webdecoy1, SVN password set separately at
https://profiles.wordpress.org/me/profile/edit/group/3/?screen=svn-password.
./build.sh <version> --org
rm -rf .svn-wporg/trunk/* && unzip -q dist/webdecoy-<version>-wporg.zip -d /tmp/wporg
cp -R /tmp/wporg/webdecoy/. .svn-wporg/trunk/ && rm -rf /tmp/wporg
cd .svn-wporg
svn add --force trunk assets
svn status # sanity-check: no unexpected deletes/adds; `svn rm` any removed files
svn ci -m "Release <version>" --username webdecoy1
svn cp trunk tags/<version>
svn ci -m "Tag <version>" --username webdecoy1readme.txt's Stable tag: must match the SVN tag name — the directory serves
whatever tag Stable tag: in trunk/readme.txt points at. Listing images
(icon/banner PNGs, regenerated from assets/*.svg per assets/README.md) and
screenshot-N.png files go in the SVN top-level assets/ dir, not trunk.