feat/fix: checkout email tracing, UI tweaks for add-to-cart, cart page overflow fix, implement hide admin bar setting

This commit is contained in:
Dwindi Ramadhana
2026-02-27 23:15:10 +07:00
parent 687a2318b0
commit a62037d993
22 changed files with 2711 additions and 294 deletions

View File

@@ -0,0 +1,379 @@
# 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`**
```sql
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:**
```json
{
"license_key": "XXXX-XXXX-XXXX-XXXX",
"slug": "my-software",
"version": "1.0.0",
"site_url": "https://client-site.com"
}
```
**Response (Generic - Any Software):**
```json
{
"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):**
```json
{
"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):**
```json
{
"success": true,
"update_available": false,
"current_version": "1.2.3",
"latest_version": "1.2.3"
}
```
**Response (License Invalid):**
```json
{
"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:**
```json
{
"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
```php
// 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:
```javascript
// 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
# 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)
1. Create WooCommerce product (Simple, Downloadable)
2. Enable Licensing ✓
3. Enable Software Distribution ✓
4. Set software slug: `my-software`
5. Upload downloadable file (uses existing WC functionality)
6. Set version: `1.0.0`
7. Add changelog
8. (Optional) Enable WordPress Integration → fill WP-specific fields
### Release New Version
1. Upload new file to product
2. Click "Add New Version"
3. Enter version number: `1.1.0`
4. Write changelog
5. Save → Previous version archived, new version active
### Client Updates
1. Client software calls `/software/check` with license key
2. API validates license → returns latest version info
3. Client downloads via `/software/download` with token
4. 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**
1. **Overview** - What is software distribution
2. **Setup Guide** - How to configure products
3. **API Reference** - Endpoint documentation
4. **WordPress Integration** - How to use the updater class
5. **Generic Integration** - Examples for non-WP software
6. **Client Libraries** - Download the updater class
---
## Implementation Phases
### Phase 1: Core ✅
- [x] Database table + product meta fields (`wp_woonoow_software_versions`, `wp_woonoow_software_downloads`)
- [x] SoftwareManager class (`includes/Modules/Software/SoftwareManager.php`)
- [x] SoftwareModule class (`includes/Modules/Software/SoftwareModule.php`)
- [x] SoftwareSettings class (`includes/Modules/SoftwareSettings.php`)
- [x] Product edit fields in WooCommerce
### Phase 2: API ✅
- [x] SoftwareController (`includes/Api/SoftwareController.php`)
- [x] `/software/check` endpoint (GET/POST)
- [x] `/software/download` endpoint with token
- [x] `/software/changelog` endpoint
### Phase 3: Admin UI ✅
- [x] Version release manager in Admin SPA (`routes/Products/SoftwareVersions/index.tsx`)
- [x] Changelog editor (Dialog with Textarea)
- [x] Version history table
### Phase 4: Client Library ✅
- [x] `class-woonoow-updater.php` for WP (`templates/updater/class-woonoow-updater.php`)
- [x] Supports both plugins and themes
- [x] Includes license status checking
### Phase 5: Documentation ✅
- [x] Add docs to woonoow-docs (`contents/docs/developer/software-updates/index.mdx`)
- [x] API reference
- [x] 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
1. ✅ Generic for any software (not just WP)
2. ✅ Reuse WooCommerce downloadable files
3. ✅ WordPress fields are optional
4. ✅ Document client library in woonoow-docs
Ready to proceed with Phase 1?