2026-01-21 18:55:18 +01:00
|
|
|
# Changelog
|
|
|
|
|
|
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
|
|
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
|
|
|
|
|
|
## [Unreleased]
|
|
|
|
|
|
2026-01-22 00:10:32 +01:00
|
|
|
## [0.0.11] - 2026-01-22
|
2026-01-21 23:50:57 +01:00
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- Created date column in admin license overview
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
2026-01-22 00:10:32 +01:00
|
|
|
- Added "Created" column to licenses table in admin (Twig template and PHP fallback)
|
|
|
|
|
- Shows when each license was generated
|
2026-01-21 23:50:57 +01:00
|
|
|
|
2026-01-21 22:18:27 +01:00
|
|
|
## [0.0.10] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- License meta box on WooCommerce order edit pages
|
|
|
|
|
- Editable order domain field with AJAX save
|
|
|
|
|
- Editable license domains directly from order page
|
|
|
|
|
- View licenses table showing all licenses for an order
|
|
|
|
|
- Link to full licenses management page from order view
|
|
|
|
|
- Support for both classic orders and HPOS (High-Performance Order Storage)
|
2026-01-21 23:23:16 +01:00
|
|
|
- Inline editing for license fields (status, expiry date, domain) in admin
|
|
|
|
|
- Copy license key button in admin licenses overview
|
|
|
|
|
- Live search for licenses in admin overview
|
|
|
|
|
- Settings link in plugin actions
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
- Fixed 404 error on licenses menu item
|
|
|
|
|
- Fixed Twig template cache issues with auto_reload
|
2026-01-21 22:18:27 +01:00
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New `OrderLicenseController` class for order page integration
|
|
|
|
|
- New `getLicensesByOrder()` method in LicenseManager
|
2026-01-21 23:23:16 +01:00
|
|
|
- New `updateLicenseExpiry()` method in LicenseManager
|
2026-01-21 22:18:27 +01:00
|
|
|
- JavaScript file `order-licenses.js` for inline domain editing
|
2026-01-21 23:23:16 +01:00
|
|
|
- JavaScript file `admin-licenses.js` for live search and inline editing
|
2026-01-21 22:18:27 +01:00
|
|
|
- AJAX handlers for updating order domain and license domains
|
2026-01-21 23:23:16 +01:00
|
|
|
- AJAX handlers for inline editing (status, expiry, domain updates)
|
2026-01-21 22:18:27 +01:00
|
|
|
|
|
|
|
|
## [0.0.9] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- API client examples for multiple programming languages
|
|
|
|
|
- cURL command examples (`docs/client-examples/curl.sh`)
|
|
|
|
|
- PHP client class (`docs/client-examples/php-client.php`)
|
|
|
|
|
- Python client class (`docs/client-examples/python-client.py`)
|
|
|
|
|
- JavaScript/Node.js client (`docs/client-examples/javascript-client.js`)
|
|
|
|
|
- C# client class (`docs/client-examples/csharp-client.cs`)
|
|
|
|
|
- Client examples documentation (`docs/client-examples/README.md`)
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- All clients include rate limiting handling (HTTP 429)
|
|
|
|
|
- Examples demonstrate validate, status, and activate endpoints
|
|
|
|
|
- JavaScript client works in both browser and Node.js environments
|
|
|
|
|
- Python client uses dataclasses for type-safe responses
|
|
|
|
|
- C# client uses async/await patterns
|
|
|
|
|
|
|
|
|
|
## [0.0.8] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Current version now automatically derived from latest product version
|
|
|
|
|
- Email system refactored to use WooCommerce transactional emails
|
|
|
|
|
- License expiration warning email now configurable via WooCommerce email settings
|
|
|
|
|
|
|
|
|
|
### Removed
|
|
|
|
|
|
|
|
|
|
- "Current Version" field from product license settings panel
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New `LicenseExpirationEmail` class extends WC_Email
|
|
|
|
|
- LicensedProduct's `get_current_version()` queries VersionManager
|
|
|
|
|
- Uses WooCommerce email header/footer templates
|
|
|
|
|
- Warning days configurable in plugin settings
|
|
|
|
|
|
2026-01-21 20:32:35 +01:00
|
|
|
## [0.0.7] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- License Dashboard moved to WooCommerce Reports section (Reports > Licenses)
|
|
|
|
|
- License search and filtering in admin (by license key, domain, status, product)
|
|
|
|
|
- Customer-facing license transfer request with AJAX-based modal
|
|
|
|
|
- Email notifications for license expiration warnings (7 days and 1 day before)
|
|
|
|
|
- Bulk import licenses from CSV functionality
|
|
|
|
|
- Import page with detailed format instructions
|
|
|
|
|
- Scheduled cron job for daily expiration checks
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Dashboard now accessible via WooCommerce > Reports > Licenses tab
|
|
|
|
|
- License list page includes search box and filter dropdowns
|
|
|
|
|
- Pagination preserves filter state
|
|
|
|
|
- Import CSV button added to licenses page header
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- AccountController extended with customer transfer AJAX handler and domain normalization
|
|
|
|
|
- LicenseEmailController extended with expiration warning scheduling and email templates
|
|
|
|
|
- LicenseManager extended with `getLicensesExpiringSoon()`, `markExpirationNotified()`, `wasExpirationNotified()`, `importLicense()` methods
|
|
|
|
|
- AdminController extended with CSV import handling and import page rendering
|
|
|
|
|
- Installer clears cron events on plugin deactivation
|
|
|
|
|
- Frontend JavaScript extended for transfer modal handling
|
|
|
|
|
- Frontend CSS extended with modal and transfer button styles
|
|
|
|
|
|
|
|
|
|
## [0.0.6] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- License usage statistics/analytics dashboard (WooCommerce > License Dashboard)
|
|
|
|
|
- License transfer functionality to change domain from admin
|
|
|
|
|
- Export licenses to CSV functionality
|
|
|
|
|
- OpenAPI 3.1 specification for REST API documentation (`openapi.json`)
|
|
|
|
|
- Monthly license creation chart on dashboard
|
|
|
|
|
- Top products and top domains statistics
|
|
|
|
|
- Expiring soon alerts on dashboard
|
|
|
|
|
|
|
|
|
|
### Removed
|
|
|
|
|
|
|
|
|
|
- API endpoint `/deactivate` removed (license deactivation is now admin-only)
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Licenses admin page header now includes Export CSV button
|
|
|
|
|
- Actions column widened to accommodate Transfer link
|
|
|
|
|
- Dashboard link added to licenses page
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New admin page: License Dashboard with statistics overview
|
|
|
|
|
- LicenseManager extended with `transferLicense()`, `getStatistics()`, `exportLicensesForCsv()` methods
|
|
|
|
|
- AdminController extended with dashboard rendering, CSV export, and transfer handling
|
|
|
|
|
- Transfer modal with form for domain change
|
|
|
|
|
- REST API now only has three endpoints: `/validate`, `/status`, `/activate`
|
|
|
|
|
- OpenAPI 3.1 specification documents all API endpoints with examples
|
|
|
|
|
|
|
|
|
|
## [0.0.5] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- Bulk license operations in admin (activate, deactivate, revoke, extend, delete)
|
|
|
|
|
- License renewal/extension functionality (extend by 30/90/365 days)
|
|
|
|
|
- Set license to lifetime (remove expiration)
|
|
|
|
|
- Quick action buttons per license row (+30d, ∞, Revoke, Delete)
|
|
|
|
|
- Checkbox selection for bulk operations with select-all functionality
|
|
|
|
|
- Improved admin notices for bulk operation results
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Licenses admin page redesigned with WordPress list table styling
|
|
|
|
|
- License actions use row-actions pattern for cleaner UI
|
|
|
|
|
- Bulk action dropdowns at top and bottom of table (synchronized)
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- LicenseManager extended with `extendLicense()`, `setLicenseLifetime()`, `bulkUpdateStatus()`, `bulkDelete()`, `bulkExtend()` methods
|
|
|
|
|
- AdminController extended with bulk action handling and extend/lifetime actions
|
|
|
|
|
- Twig template functions for generating action URLs with nonces
|
|
|
|
|
- JavaScript for checkbox sync and bulk action handling
|
|
|
|
|
|
|
|
|
|
## [0.0.4] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- WooCommerce settings tab "Licensed Products" for default license settings
|
|
|
|
|
- Default settings for Max Activations, License Validity, and Bind to Major Version
|
|
|
|
|
- Per-product settings now override global defaults (empty = use default)
|
|
|
|
|
- Settings link in product edit page pointing to WooCommerce settings
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Product license settings now show placeholder with default values
|
|
|
|
|
- LicensedProduct class now falls back to global defaults when product settings are empty
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New class: SettingsController for WooCommerce settings integration
|
|
|
|
|
- LicensedProduct model extended with `has_custom_*` methods for checking overrides
|
|
|
|
|
- Settings stored using WooCommerce options API
|
|
|
|
|
|
2026-01-21 19:46:50 +01:00
|
|
|
## [0.0.3] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- File attachment support for product versions (WordPress Media Library integration)
|
|
|
|
|
- Version auto-detection from uploaded filenames (e.g., `plugin-v1.2.3.zip`)
|
|
|
|
|
- Customer download page for purchased licenses with secure authenticated downloads
|
|
|
|
|
- License key copy-to-clipboard functionality on account page and emails
|
|
|
|
|
- New card-based UI for customer licenses page with download section
|
|
|
|
|
- DownloadController for secure file delivery with hash-based URL verification
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Product versions meta box now hidden for non-licensed product types (dynamic show/hide)
|
|
|
|
|
- Redesigned customer licenses page with modern card layout
|
|
|
|
|
- Frontend JavaScript and CSS enhancements for better UX
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New class: DownloadController for secure file downloads
|
|
|
|
|
- Database schema updated: `attachment_id` column added to versions table
|
|
|
|
|
- ProductVersion model extended with `getEffectiveDownloadUrl()` and `getDownloadFilename()`
|
|
|
|
|
- Secure download URLs use hash verification (license_id-version_id-hash format)
|
|
|
|
|
|
2026-01-21 19:15:19 +01:00
|
|
|
## [0.0.2] - 2026-01-21
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- Product version management UI in admin (meta box on product edit page)
|
|
|
|
|
- AJAX-based version CRUD operations (add, delete, toggle active status)
|
|
|
|
|
- ProductVersion model and VersionManager for version data handling
|
|
|
|
|
- Email notifications with license keys on order completion
|
|
|
|
|
- License information included in WooCommerce order completed emails
|
|
|
|
|
- Rate limiting for REST API endpoints (30 requests/minute per IP)
|
|
|
|
|
- Cloudflare and proxy-aware IP detection for rate limiting
|
|
|
|
|
- JavaScript for version management interactions
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
- Declared WooCommerce HPOS and cart/checkout blocks compatibility
|
|
|
|
|
- Plugin name changed from "WC Licensed Product" to "WooCommerce Licensed Product"
|
|
|
|
|
|
|
|
|
|
### Technical Details
|
|
|
|
|
|
|
|
|
|
- New classes: ProductVersion, VersionManager, VersionAdminController, LicenseEmailController
|
|
|
|
|
- Rate limiting uses WordPress transients for request counting
|
|
|
|
|
- HTTP 429 response with Retry-After header when rate limited
|
|
|
|
|
|
|
|
|
|
## [0.0.1] - 2026-01-21
|
2026-01-21 18:55:18 +01:00
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- Initial plugin structure with WordPress Plugin API integration
|
|
|
|
|
- New WooCommerce product type "Licensed Product" for selling software licenses
|
|
|
|
|
- License key generation with format XXXX-XXXX-XXXX-XXXX on order completion
|
|
|
|
|
- Domain-based license validation (licenses bound to specific domains)
|
|
|
|
|
- REST API endpoints for license management:
|
|
|
|
|
- `POST /wp-json/wc-licensed-product/v1/validate` - Validate license for domain
|
|
|
|
|
- `POST /wp-json/wc-licensed-product/v1/status` - Check license status
|
|
|
|
|
- `POST /wp-json/wc-licensed-product/v1/activate` - Activate license on domain
|
|
|
|
|
- Checkout domain field for licensed products
|
|
|
|
|
- Customer account page "Licenses" to view purchased licenses
|
|
|
|
|
- Admin interface for license management (WooCommerce > Licenses)
|
|
|
|
|
- License settings per product:
|
|
|
|
|
- Maximum activations per license
|
|
|
|
|
- License validity period (days or lifetime)
|
|
|
|
|
- Optional binding to major software version
|
|
|
|
|
- Current version tracking
|
|
|
|
|
- Custom database tables for licenses and product versions
|
|
|
|
|
- Twig template engine integration for views
|
|
|
|
|
- Full internationalization support (i18n)
|
|
|
|
|
- German (Switzerland, formal) translation (de_CH)
|
|
|
|
|
- WooCommerce HPOS compatibility
|
|
|
|
|
- Responsive frontend license table
|
|
|
|
|
|
|
|
|
|
### Technical
|
|
|
|
|
|
|
|
|
|
- PHP 8.3+ required
|
|
|
|
|
- WooCommerce 10.0+ required
|
|
|
|
|
- PSR-4 autoloading via Composer
|
|
|
|
|
- Twig 3.0 template engine
|
|
|
|
|
- WordPress REST API integration
|
|
|
|
|
- Custom WooCommerce product type extending WC_Product
|
|
|
|
|
|
2026-01-21 23:50:57 +01:00
|
|
|
[Unreleased]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.11...HEAD
|
|
|
|
|
[0.0.11]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.10...v0.0.11
|
|
|
|
|
[0.0.10]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.9...v0.0.10
|
|
|
|
|
[0.0.9]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.8...v0.0.9
|
|
|
|
|
[0.0.8]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.7...v0.0.8
|
2026-01-21 20:32:35 +01:00
|
|
|
[0.0.7]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.6...v0.0.7
|
|
|
|
|
[0.0.6]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.5...v0.0.6
|
|
|
|
|
[0.0.5]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.4...v0.0.5
|
|
|
|
|
[0.0.4]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.3...v0.0.4
|
2026-01-21 19:46:50 +01:00
|
|
|
[0.0.3]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.2...v0.0.3
|
2026-01-21 19:15:19 +01:00
|
|
|
[0.0.2]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/compare/v0.0.1...v0.0.2
|
2026-01-21 18:55:18 +01:00
|
|
|
[0.0.1]: https://src.bundespruefstelle.ch/magdev/wc-licensed-product/releases/tag/v0.0.1
|