9.4 KiB
Software Distribution System Plan (Simplified)
Extends WooNooW Licensing with software versioning, changelog, and update checker API. Works for any software type - not just WordPress plugins/themes.
Core Principle
Reuse existing WooCommerce infrastructure:
- ✅ Downloadable Product = file hosting (already exists)
- ✅ Licensing Module = license validation (already exists)
- ➕ NEW: Version tracking + changelog per product
- ➕ NEW: Update checker API endpoint
What We Add (Minimal)
| Field | Type | Location |
|---|---|---|
Current Version |
Text (e.g., "1.2.3") | Product Edit |
Changelog |
Rich Text/Markdown | Product Edit |
Software Slug |
Text (unique identifier) | Product Edit |
Enable WP Integration |
Checkbox | Product Edit |
If "Enable WP Integration" is checked:
| Field | Type |
|---|---|
Requires WP |
Text |
Tested WP |
Text |
Requires PHP |
Text |
Icon URL |
Image |
Banner URL |
Image |
Database Schema
Table: wp_woonoow_software_versions
CREATE TABLE wp_woonoow_software_versions (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT UNSIGNED NOT NULL,
version VARCHAR(50) NOT NULL,
changelog LONGTEXT,
release_date DATETIME NOT NULL,
is_current TINYINT(1) DEFAULT 0,
download_count INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_product (product_id),
INDEX idx_current (product_id, is_current),
UNIQUE KEY unique_version (product_id, version)
);
Product Meta (stored in wp_postmeta):
_woonoow_software_enabled: yes/no
_woonoow_software_slug: my-awesome-plugin
_woonoow_software_current_version: 1.2.3
_woonoow_software_wp_enabled: yes/no
_woonoow_software_requires_wp: 6.0
_woonoow_software_tested_wp: 6.7
_woonoow_software_requires_php: 7.4
_woonoow_software_icon: attachment_id or URL
_woonoow_software_banner: attachment_id or URL
API Endpoints
1. Update Check (Generic)
GET /wp-json/woonoow/v1/software/check
Request:
{
"license_key": "XXXX-XXXX-XXXX-XXXX",
"slug": "my-software",
"version": "1.0.0",
"site_url": "https://client-site.com"
}
Response (Generic - Any Software):
{
"success": true,
"update_available": true,
"product": {
"name": "My Awesome Software",
"slug": "my-software"
},
"current_version": "1.0.0",
"latest_version": "1.2.3",
"download_url": "https://vendor.com/wp-json/woonoow/v1/software/download?token=abc123",
"changelog_url": "https://vendor.com/wp-json/woonoow/v1/software/changelog?slug=my-software",
"changelog": "## 1.2.3\n- Fixed bug\n- Added feature",
"release_date": "2026-02-06"
}
Response (WordPress Plugin/Theme - Extended):
{
"success": true,
"update_available": true,
"product": {
"name": "My WordPress Plugin",
"slug": "my-wp-plugin"
},
"current_version": "1.0.0",
"latest_version": "1.2.3",
"download_url": "https://vendor.com/wp-json/woonoow/v1/software/download?token=abc123",
"changelog_url": "https://vendor.com/wp-json/woonoow/v1/software/changelog?slug=my-wp-plugin",
"changelog": "## 1.2.3\n- Fixed bug",
"release_date": "2026-02-06",
"wordpress": {
"requires": "6.0",
"tested": "6.7",
"requires_php": "7.4",
"icons": {
"1x": "https://vendor.com/icon-128.png",
"2x": "https://vendor.com/icon-256.png"
},
"banners": {
"low": "https://vendor.com/banner-772x250.jpg",
"high": "https://vendor.com/banner-1544x500.jpg"
}
}
}
Response (No Update):
{
"success": true,
"update_available": false,
"current_version": "1.2.3",
"latest_version": "1.2.3"
}
Response (License Invalid):
{
"success": false,
"error": "license_expired",
"message": "Your license has expired. Renew to receive updates."
}
2. Download
GET /wp-json/woonoow/v1/software/download
Request:
?token=abc123&license_key=XXXX-XXXX-XXXX-XXXX
Response: Binary file stream (the downloadable file from WooCommerce product)
Token Validation:
- One-time use token
- 5-minute expiry
- Tied to specific license
3. Changelog
GET /wp-json/woonoow/v1/software/changelog
Request:
?slug=my-software&version=1.2.3 (optional)
Response:
{
"slug": "my-software",
"versions": [
{
"version": "1.2.3",
"release_date": "2026-02-06",
"changelog": "## 1.2.3\n- Fixed critical bug\n- Added dark mode"
},
{
"version": "1.2.0",
"release_date": "2026-01-15",
"changelog": "## 1.2.0\n- Major feature release"
}
]
}
Client Integration Examples
A. WordPress Plugin (Auto-Updates)
Documented in: woonoow-docs → Developer → Software Updates
// Include the updater class (provided by WooNooW)
require_once 'class-woonoow-updater.php';
new WooNooW_Updater([
'api_url' => 'https://your-store.com/',
'slug' => 'my-plugin',
'version' => MY_PLUGIN_VERSION,
'license_key' => get_option('my_plugin_license'),
'plugin_file' => __FILE__,
]);
B. Generic Software (Manual Check)
For desktop apps, SaaS, scripts, etc:
// Check for updates
const response = await fetch('https://vendor.com/wp-json/woonoow/v1/software/check', {
method: 'POST',
body: JSON.stringify({
license_key: 'XXXX-XXXX-XXXX-XXXX',
slug: 'my-desktop-app',
version: '1.0.0'
})
});
const data = await response.json();
if (data.update_available) {
console.log(`New version ${data.latest_version} available!`);
console.log(`Download: ${data.download_url}`);
}
# Python example
import requests
response = requests.post('https://vendor.com/wp-json/woonoow/v1/software/check', json={
'license_key': 'XXXX-XXXX-XXXX-XXXX',
'slug': 'my-python-tool',
'version': '1.0.0'
})
data = response.json()
if data.get('update_available'):
print(f"Update available: {data['latest_version']}")
Implementation Flow
Product Setup (Seller)
- Create WooCommerce product (Simple, Downloadable)
- Enable Licensing ✓
- Enable Software Distribution ✓
- Set software slug:
my-software - Upload downloadable file (uses existing WC functionality)
- Set version:
1.0.0 - Add changelog
- (Optional) Enable WordPress Integration → fill WP-specific fields
Release New Version
- Upload new file to product
- Click "Add New Version"
- Enter version number:
1.1.0 - Write changelog
- Save → Previous version archived, new version active
Client Updates
- Client software calls
/software/checkwith license key - API validates license → returns latest version info
- Client downloads via
/software/downloadwith token - Client installs update (WordPress = automatic, others = manual/custom)
Files to Create
includes/
├── Api/
│ └── SoftwareController.php # REST endpoints
├── Modules/
│ └── Software/
│ ├── SoftwareModule.php # Bootstrap
│ └── SoftwareManager.php # Core logic
└── Templates/
└── updater/
└── class-woonoow-updater.php # WP client library
admin-spa/src/routes/Settings/
└── Software.tsx # Version manager UI
Documentation (woonoow-docs)
Create new section: Developer → Software Distribution
- Overview - What is software distribution
- Setup Guide - How to configure products
- API Reference - Endpoint documentation
- WordPress Integration - How to use the updater class
- Generic Integration - Examples for non-WP software
- Client Libraries - Download the updater class
Implementation Phases
Phase 1: Core ✅
- Database table + product meta fields (
wp_woonoow_software_versions,wp_woonoow_software_downloads) - SoftwareManager class (
includes/Modules/Software/SoftwareManager.php) - SoftwareModule class (
includes/Modules/Software/SoftwareModule.php) - SoftwareSettings class (
includes/Modules/SoftwareSettings.php) - Product edit fields in WooCommerce
Phase 2: API ✅
- SoftwareController (
includes/Api/SoftwareController.php) /software/checkendpoint (GET/POST)/software/downloadendpoint with token/software/changelogendpoint
Phase 3: Admin UI ✅
- Version release manager in Admin SPA (
routes/Products/SoftwareVersions/index.tsx) - Changelog editor (Dialog with Textarea)
- Version history table
Phase 4: Client Library ✅
class-woonoow-updater.phpfor WP (templates/updater/class-woonoow-updater.php)- Supports both plugins and themes
- Includes license status checking
Phase 5: Documentation ✅
- Add docs to woonoow-docs (
contents/docs/developer/software-updates/index.mdx) - API reference
- Integration examples (WordPress, JavaScript, Python)
Security
| Measure | Description |
|---|---|
| License Validation | All endpoints verify active license |
| Download Tokens | One-time use, 5-min expiry |
| Rate Limiting | Max 10 requests/minute per license |
| Signed URLs | HMAC signature for download links |
Questions Before Implementation
- ✅ Generic for any software (not just WP)
- ✅ Reuse WooCommerce downloadable files
- ✅ WordPress fields are optional
- ✅ Document client library in woonoow-docs
Ready to proceed with Phase 1?