From 12a3a37658867d7881c7a158ee4a9eb8c7d3f189 Mon Sep 17 00:00:00 2001 From: magdev Date: Fri, 23 Jan 2026 12:01:11 +0100 Subject: [PATCH] Add product version display on single product page (v0.3.4) - Display current version under product title for licensed products - Add frontend CSS styling for version badge - Update translations for new "Version:" string - Bump version to 0.3.4 Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 15 + CLAUDE.md | 54 ++++ assets/css/frontend.css | 21 ++ composer.lock | 4 +- languages/wc-licensed-product-de_CH.mo | Bin 29855 -> 29889 bytes languages/wc-licensed-product-de_CH.po | 390 +++++++++++++------------ languages/wc-licensed-product.pot | 366 +++++++++++------------ src/Product/LicensedProductType.php | 54 ++++ wc-licensed-product.php | 4 +- 9 files changed, 530 insertions(+), 378 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c463668..df03204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.4] - 2026-01-23 + +### Added + +- Current version display on single product pages for licensed products +- Version number shown directly under the product title +- Frontend CSS styling for version badge with monospace font + +### Technical Details + +- Added `displayCurrentVersion()` method to `LicensedProductType` class +- Hooked to `woocommerce_single_product_summary` at priority 6 (after title) +- Added `enqueueFrontendStyles()` to load CSS on product pages +- Uses `LicensedProduct::get_current_version()` to fetch latest version + ## [0.3.3] - 2026-01-22 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index d01a294..b9a49eb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -878,3 +878,57 @@ Updated OpenAPI specification to document response signing feature added in v0.2 - Created release package: `releases/wc-licensed-product-0.3.2.zip` (810 KB) - SHA256: `ca33c81516b5dcf4a80b3192d8ae4ad39a7bf67196a1f729b563c5ae01b1d39c` - Tagged as `v0.3.2` and pushed to `main` branch + +### 2026-01-22 - Version 0.3.3 - Bug Fix & License Testing + +**Overview:** + +Fixed version deactivation bug and added license testing functionality. + +**Bug Fix:** + +- Fixed version deactivation button not working in admin product versions table +- Root cause: Parameters in wrong order in `VersionAdminController::ajaxToggleVersion()` +- Changed from `updateVersion($versionId, null, null, !$currentlyActive)` to `updateVersion($versionId, null, !$currentlyActive, null)` + +**Implemented:** + +- Added "Test" action to license overview to validate licenses against `/validate` API endpoint +- Test License modal showing license key, domain, and validation results +- AJAX handler `handleAjaxTestLicense()` for license testing + +**Modified files:** + +- `src/Admin/VersionAdminController.php` - Fixed parameter order in toggle method +- `src/Admin/AdminController.php` - Added Test action to PHP fallback and AJAX handler +- `templates/admin/licenses.html.twig` - Added Test action and modal to Twig template + +**Release v0.3.3:** + +- Created release package: `releases/wc-licensed-product-0.3.3.zip` (795 KB) +- SHA256: `a06d29eabc2da08613ae13874ed152b8ea9363b8284a2e9bdda414e32777558c` +- Tagged as `v0.3.3` and pushed to `main` branch + +### 2026-01-23 - Version 0.3.4 - Frontend Version Display + +**Overview:** + +Added current version display on single product pages for licensed products. + +**Implemented:** + +- Current version displayed directly under the product title +- Styled version badge with monospace font and subtle blue background +- Frontend CSS automatically loaded on licensed product pages + +**Modified files:** + +- `src/Product/LicensedProductType.php` - Added `displayCurrentVersion()` and `enqueueFrontendStyles()` methods +- `assets/css/frontend.css` - Added `.wclp-product-version` styles + +**Technical notes:** + +- Uses `woocommerce_single_product_summary` hook at priority 6 (after title at priority 5) +- Only displays for licensed product type +- Only displays if product has at least one version defined +- Uses `LicensedProduct::get_current_version()` which queries `VersionManager::getLatestVersion()` diff --git a/assets/css/frontend.css b/assets/css/frontend.css index bde49eb..885f7e5 100644 --- a/assets/css/frontend.css +++ b/assets/css/frontend.css @@ -528,3 +528,24 @@ color: #721c24; border: 1px solid #f5c6cb; } + +/* Product Version Display (Single Product Page) */ +.wclp-product-version { + margin: 0.5em 0 1em 0; + font-size: 0.95em; + color: #666; +} + +.wclp-product-version .version-label { + font-weight: 500; + color: #555; +} + +.wclp-product-version .version-number { + font-family: 'SF Mono', Monaco, Consolas, monospace; + background: #e7f3ff; + padding: 0.15em 0.5em; + border-radius: 3px; + color: #2271b1; + font-weight: 500; +} diff --git a/composer.lock b/composer.lock index 220b32f..3f5e60c 100644 --- a/composer.lock +++ b/composer.lock @@ -12,7 +12,7 @@ "source": { "type": "git", "url": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client.git", - "reference": "83037ea0c2d9e365cf9ec0ad50251d3ebc7e4782" + "reference": "a3a957914fd6ef74cb479e213d1d3bc0606f496b" }, "require": { "php": "^8.3", @@ -52,7 +52,7 @@ "issues": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client/issues", "source": "https://src.bundespruefstelle.ch/magdev/wc-licensed-product-client" }, - "time": "2026-01-22T15:24:57+00:00" + "time": "2026-01-22T20:05:48+00:00" }, { "name": "psr/cache", diff --git a/languages/wc-licensed-product-de_CH.mo b/languages/wc-licensed-product-de_CH.mo index d5a2e6511bff220c2e7d195e9622b332b8ee0cc5..570e7e18368d76892d026a09ec5fb2ca8d4cd3f2 100644 GIT binary patch delta 5823 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 bFl%W;-J*s0M?Ww6Rc_$KA8L(@qy7F5pSHF< delta 5806 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 L%=$x%V?+K2!04+U diff --git a/languages/wc-licensed-product-de_CH.po b/languages/wc-licensed-product-de_CH.po index 19d6aaf..07f0ac1 100644 --- a/languages/wc-licensed-product-de_CH.po +++ b/languages/wc-licensed-product-de_CH.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: WC Licensed Product 0.3.1\n" "Report-Msgid-Bugs-To: magdev3.0@gmail.com\n" -"POT-Creation-Date: 2026-01-23 11:41+0100\n" +"POT-Creation-Date: 2026-01-23 11:54+0100\n" "PO-Revision-Date: 2026-01-22T17:15:00+00:00\n" "Last-Translator: Marco Graetsch \n" "Language-Team: German (Switzerland) \n" @@ -79,9 +79,9 @@ msgstr "" "Lizenzen werden generiert, sobald die Bestellung als bezahlt/abgeschlossen " "markiert wird." -#: src/Admin/OrderLicenseController.php:144 src/Admin/AdminController.php:1280 +#: src/Admin/OrderLicenseController.php:144 +#: src/Admin/SettingsController.php:142 src/Admin/AdminController.php:1280 #: src/Admin/AdminController.php:1431 src/Admin/AdminController.php:1480 -#: src/Admin/SettingsController.php:142 #: src/Email/LicenseEmailController.php:230 msgid "License Key" msgstr "Lizenzschlüssel" @@ -129,11 +129,11 @@ msgstr "Domain bearbeiten" msgid "Cancel" msgstr "Abbrechen" -#: src/Admin/OrderLicenseController.php:201 src/Admin/AdminController.php:151 +#: src/Admin/OrderLicenseController.php:201 +#: src/Admin/SettingsController.php:192 src/Admin/AdminController.php:151 #: src/Admin/AdminController.php:266 src/Admin/AdminController.php:1362 -#: src/Admin/AdminController.php:1602 src/Admin/SettingsController.php:192 -#: src/Product/LicensedProductType.php:104 -#: src/Product/LicensedProductType.php:152 +#: src/Admin/AdminController.php:1602 src/Product/LicensedProductType.php:110 +#: src/Product/LicensedProductType.php:158 msgid "Lifetime" msgstr "Lebenslang" @@ -213,6 +213,179 @@ msgstr "Lizenz-Domain aktualisiert." msgid "Failed to update license domain." msgstr "Lizenz-Domain konnte nicht aktualisiert werden." +#: src/Admin/SettingsController.php:54 +msgid "Licensed Products" +msgstr "Lizensierte Produkte" + +#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 +msgid "Plugin License" +msgstr "Plugin-Lizenz" + +#: src/Admin/SettingsController.php:65 +msgid "Default Settings" +msgstr "Standardeinstellungen" + +#: src/Admin/SettingsController.php:66 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: src/Admin/SettingsController.php:130 +msgid "" +"Configure the license for this plugin. A valid license is required for " +"frontend features to work." +msgstr "" +"Konfigurieren Sie die Lizenz für dieses Plugin. Eine gültige Lizenz ist " +"erforderlich, damit die Frontend-Funktionen funktionieren." + +#: src/Admin/SettingsController.php:134 +msgid "License Server URL" +msgstr "Lizenzserver-URL" + +#: src/Admin/SettingsController.php:136 +msgid "The URL of the license server (e.g., https://shop.example.com)." +msgstr "Die URL des Lizenzservers (z.B. https://shop.example.com)." + +#: src/Admin/SettingsController.php:144 +msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." +msgstr "Ihr Lizenzschlüssel im Format XXXX-XXXX-XXXX-XXXX." + +#: src/Admin/SettingsController.php:150 +msgid "Server Secret (Optional)" +msgstr "Server-Secret (Optional)" + +#: src/Admin/SettingsController.php:152 +msgid "" +"If the license server uses signed responses, enter the shared secret here " +"for enhanced security." +msgstr "" +"Falls der Lizenzserver signierte Antworten verwendet, geben Sie hier das " +"gemeinsame Secret für erhöhte Sicherheit ein." + +#: src/Admin/SettingsController.php:170 +msgid "Default License Settings" +msgstr "Standard Lizenz-Einstellungen" + +#: src/Admin/SettingsController.php:172 +msgid "" +"These settings serve as defaults for new licensed products. Individual " +"product settings override these defaults." +msgstr "" +"Diese Einstellungen dienen als Standard für neue lizensierte Produkte. " +"Individuelle Produkteinstellungen überschreiben diese Standards." + +#: src/Admin/SettingsController.php:176 +msgid "Default Max Activations" +msgstr "Standard Max. Aktivierungen" + +#: src/Admin/SettingsController.php:178 +msgid "Default maximum number of domain activations per license." +msgstr "Standard maximale Anzahl der Domain-Aktivierungen pro Lizenz." + +#: src/Admin/SettingsController.php:187 +msgid "Default License Validity (Days)" +msgstr "Standard Lizenz-Gültigkeit (Tage)" + +#: src/Admin/SettingsController.php:189 +msgid "" +"Default number of days a license is valid. Leave empty or set to 0 for " +"lifetime licenses." +msgstr "" +"Standard Anzahl Tage, die eine Lizenz gültig ist. Leer lassen oder auf 0 " +"setzen für lebenslange Lizenzen." + +#: src/Admin/SettingsController.php:199 +msgid "Default Bind to Major Version" +msgstr "Standard An Hauptversion binden" + +#: src/Admin/SettingsController.php:201 +msgid "" +"If enabled, licenses are bound to the major version at purchase time by " +"default." +msgstr "" +"Falls aktiviert, werden Lizenzen standardmässig an die Hauptversion zum " +"Kaufzeitpunkt gebunden." + +#: src/Admin/SettingsController.php:219 +msgid "Expiration Warning Schedule" +msgstr "Ablaufwarnung Zeitplan" + +#: src/Admin/SettingsController.php:223 +#, php-format +msgid "" +"Configure when expiration warning emails are sent. To customize the email " +"template, enable/disable, or change the subject, go to %s." +msgstr "" +"Konfigurieren Sie, wann Ablaufwarnungs-E-Mails gesendet werden. Um die E-" +"Mail-Vorlage anzupassen, zu aktivieren/deaktivieren oder den Betreff zu " +"ändern, gehen Sie zu %s." + +#: src/Admin/SettingsController.php:225 +msgid "WooCommerce > Settings > Emails > License Expiration Warning" +msgstr "WooCommerce > Einstellungen > E-Mails > Lizenzablauf-Warnung" + +#: src/Admin/SettingsController.php:230 +msgid "First Warning (Days Before)" +msgstr "Erste Warnung (Tage vorher)" + +#: src/Admin/SettingsController.php:232 +msgid "Days before expiration to send the first warning email." +msgstr "Tage vor Ablauf, um die erste Warn-E-Mail zu senden." + +#: src/Admin/SettingsController.php:241 +msgid "Second Warning (Days Before)" +msgstr "Zweite Warnung (Tage vorher)" + +#: src/Admin/SettingsController.php:243 +msgid "" +"Days before expiration to send the second warning email. Set to 0 to disable." +msgstr "" +"Tage vor Ablauf, um die zweite Warn-E-Mail zu senden. Setzen Sie auf 0, um " +"sie zu deaktivieren." + +#: src/Admin/SettingsController.php:283 +msgid "Running on localhost - license validation bypassed." +msgstr "Läuft auf localhost - Lizenzvalidierung übersprungen." + +#: src/Admin/SettingsController.php:291 +msgid "License is valid and active." +msgstr "Lizenz ist gültig und aktiv." + +#: src/Admin/SettingsController.php:297 +msgid "License is not valid. Frontend features are disabled." +msgstr "Lizenz ist ungültig. Frontend-Funktionen sind deaktiviert." + +#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 +msgid "Verify License" +msgstr "Lizenz überprüfen" + +#: src/Admin/SettingsController.php:322 +msgid "Verifying..." +msgstr "Überprüfe..." + +#: src/Admin/SettingsController.php:341 +msgid "Request failed." +msgstr "Anfrage fehlgeschlagen." + +#: src/Admin/SettingsController.php:454 src/Admin/AdminController.php:455 +#: src/Admin/AdminController.php:475 src/Admin/AdminController.php:493 +#: src/Admin/AdminController.php:511 src/Admin/AdminController.php:531 +#: src/Admin/AdminController.php:549 src/Admin/AdminController.php:616 +#: src/Admin/AdminController.php:806 src/Frontend/AccountController.php:326 +msgid "Security check failed." +msgstr "Sicherheitsüberprüfung fehlgeschlagen." + +#: src/Admin/SettingsController.php:458 +msgid "Insufficient permissions." +msgstr "Unzureichende Berechtigungen." + +#: src/Admin/SettingsController.php:467 +msgid "License verified successfully!" +msgstr "Lizenz erfolgreich überprüft!" + +#: src/Admin/SettingsController.php:469 +msgid "License validation failed." +msgstr "Lizenzvalidierung fehlgeschlagen." + #: src/Admin/AdminController.php:93 msgid "Overview" msgstr "Übersicht" @@ -333,14 +506,6 @@ msgstr "Lizenz konnte nicht widerrufen werden." msgid "License key and domain are required." msgstr "Lizenzschlüssel und Domain sind erforderlich." -#: src/Admin/AdminController.php:455 src/Admin/AdminController.php:475 -#: src/Admin/AdminController.php:493 src/Admin/AdminController.php:511 -#: src/Admin/AdminController.php:531 src/Admin/AdminController.php:549 -#: src/Admin/AdminController.php:616 src/Admin/AdminController.php:806 -#: src/Admin/SettingsController.php:454 src/Frontend/AccountController.php:326 -msgid "Security check failed." -msgstr "Sicherheitsüberprüfung fehlgeschlagen." - #: src/Admin/AdminController.php:576 msgid "You do not have permission to export licenses." msgstr "Sie haben keine Berechtigung, Lizenzen zu exportieren." @@ -815,171 +980,6 @@ msgstr "Lizenz" msgid "No domain specified" msgstr "Keine Domain angegeben" -#: src/Admin/SettingsController.php:54 -msgid "Licensed Products" -msgstr "Lizensierte Produkte" - -#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 -msgid "Plugin License" -msgstr "Plugin-Lizenz" - -#: src/Admin/SettingsController.php:65 -msgid "Default Settings" -msgstr "Standardeinstellungen" - -#: src/Admin/SettingsController.php:66 -msgid "Notifications" -msgstr "Benachrichtigungen" - -#: src/Admin/SettingsController.php:130 -msgid "" -"Configure the license for this plugin. A valid license is required for " -"frontend features to work." -msgstr "" -"Konfigurieren Sie die Lizenz für dieses Plugin. Eine gültige Lizenz ist " -"erforderlich, damit die Frontend-Funktionen funktionieren." - -#: src/Admin/SettingsController.php:134 -msgid "License Server URL" -msgstr "Lizenzserver-URL" - -#: src/Admin/SettingsController.php:136 -msgid "The URL of the license server (e.g., https://shop.example.com)." -msgstr "Die URL des Lizenzservers (z.B. https://shop.example.com)." - -#: src/Admin/SettingsController.php:144 -msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." -msgstr "Ihr Lizenzschlüssel im Format XXXX-XXXX-XXXX-XXXX." - -#: src/Admin/SettingsController.php:150 -msgid "Server Secret (Optional)" -msgstr "Server-Secret (Optional)" - -#: src/Admin/SettingsController.php:152 -msgid "" -"If the license server uses signed responses, enter the shared secret here " -"for enhanced security." -msgstr "" -"Falls der Lizenzserver signierte Antworten verwendet, geben Sie hier das " -"gemeinsame Secret für erhöhte Sicherheit ein." - -#: src/Admin/SettingsController.php:170 -msgid "Default License Settings" -msgstr "Standard Lizenz-Einstellungen" - -#: src/Admin/SettingsController.php:172 -msgid "" -"These settings serve as defaults for new licensed products. Individual " -"product settings override these defaults." -msgstr "" -"Diese Einstellungen dienen als Standard für neue lizensierte Produkte. " -"Individuelle Produkteinstellungen überschreiben diese Standards." - -#: src/Admin/SettingsController.php:176 -msgid "Default Max Activations" -msgstr "Standard Max. Aktivierungen" - -#: src/Admin/SettingsController.php:178 -msgid "Default maximum number of domain activations per license." -msgstr "Standard maximale Anzahl der Domain-Aktivierungen pro Lizenz." - -#: src/Admin/SettingsController.php:187 -msgid "Default License Validity (Days)" -msgstr "Standard Lizenz-Gültigkeit (Tage)" - -#: src/Admin/SettingsController.php:189 -msgid "" -"Default number of days a license is valid. Leave empty or set to 0 for " -"lifetime licenses." -msgstr "" -"Standard Anzahl Tage, die eine Lizenz gültig ist. Leer lassen oder auf 0 " -"setzen für lebenslange Lizenzen." - -#: src/Admin/SettingsController.php:199 -msgid "Default Bind to Major Version" -msgstr "Standard An Hauptversion binden" - -#: src/Admin/SettingsController.php:201 -msgid "" -"If enabled, licenses are bound to the major version at purchase time by " -"default." -msgstr "" -"Falls aktiviert, werden Lizenzen standardmässig an die Hauptversion zum " -"Kaufzeitpunkt gebunden." - -#: src/Admin/SettingsController.php:219 -msgid "Expiration Warning Schedule" -msgstr "Ablaufwarnung Zeitplan" - -#: src/Admin/SettingsController.php:223 -#, php-format -msgid "" -"Configure when expiration warning emails are sent. To customize the email " -"template, enable/disable, or change the subject, go to %s." -msgstr "" -"Konfigurieren Sie, wann Ablaufwarnungs-E-Mails gesendet werden. Um die E-" -"Mail-Vorlage anzupassen, zu aktivieren/deaktivieren oder den Betreff zu " -"ändern, gehen Sie zu %s." - -#: src/Admin/SettingsController.php:225 -msgid "WooCommerce > Settings > Emails > License Expiration Warning" -msgstr "WooCommerce > Einstellungen > E-Mails > Lizenzablauf-Warnung" - -#: src/Admin/SettingsController.php:230 -msgid "First Warning (Days Before)" -msgstr "Erste Warnung (Tage vorher)" - -#: src/Admin/SettingsController.php:232 -msgid "Days before expiration to send the first warning email." -msgstr "Tage vor Ablauf, um die erste Warn-E-Mail zu senden." - -#: src/Admin/SettingsController.php:241 -msgid "Second Warning (Days Before)" -msgstr "Zweite Warnung (Tage vorher)" - -#: src/Admin/SettingsController.php:243 -msgid "" -"Days before expiration to send the second warning email. Set to 0 to disable." -msgstr "" -"Tage vor Ablauf, um die zweite Warn-E-Mail zu senden. Setzen Sie auf 0, um " -"sie zu deaktivieren." - -#: src/Admin/SettingsController.php:283 -msgid "Running on localhost - license validation bypassed." -msgstr "Läuft auf localhost - Lizenzvalidierung übersprungen." - -#: src/Admin/SettingsController.php:291 -msgid "License is valid and active." -msgstr "Lizenz ist gültig und aktiv." - -#: src/Admin/SettingsController.php:297 -msgid "License is not valid. Frontend features are disabled." -msgstr "Lizenz ist ungültig. Frontend-Funktionen sind deaktiviert." - -#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 -msgid "Verify License" -msgstr "Lizenz überprüfen" - -#: src/Admin/SettingsController.php:322 -msgid "Verifying..." -msgstr "Überprüfe..." - -#: src/Admin/SettingsController.php:341 -msgid "Request failed." -msgstr "Anfrage fehlgeschlagen." - -#: src/Admin/SettingsController.php:458 -msgid "Insufficient permissions." -msgstr "Unzureichende Berechtigungen." - -#: src/Admin/SettingsController.php:467 -msgid "License verified successfully!" -msgstr "Lizenz erfolgreich überprüft!" - -#: src/Admin/SettingsController.php:469 -msgid "License validation failed." -msgstr "Lizenzvalidierung fehlgeschlagen." - #: src/Admin/VersionAdminController.php:58 msgid "Product Versions" msgstr "Produktversionen" @@ -1252,51 +1252,51 @@ msgstr "Lizenzeinstellungen nicht konfiguriert." msgid "Could not connect to license server." msgstr "Verbindung zum Lizenzserver konnte nicht hergestellt werden." -#: src/Product/LicensedProductType.php:55 +#: src/Product/LicensedProductType.php:61 msgid "Licensed Product" msgstr "Lizensiertes Produkt" -#: src/Product/LicensedProductType.php:76 +#: src/Product/LicensedProductType.php:82 msgid "License Settings" msgstr "Lizenz-Einstellungen" -#: src/Product/LicensedProductType.php:103 +#: src/Product/LicensedProductType.php:109 #, php-format msgid "%d days" msgstr "%d Tage" -#: src/Product/LicensedProductType.php:113 +#: src/Product/LicensedProductType.php:119 #, php-format msgid "Leave fields empty to use default settings from %s." msgstr "Felder leer lassen, um Standardeinstellungen von %s zu verwenden." -#: src/Product/LicensedProductType.php:115 +#: src/Product/LicensedProductType.php:121 msgid "WooCommerce > Settings > Licensed Products" msgstr "WooCommerce > Einstellungen > Lizensierte Produkte" -#: src/Product/LicensedProductType.php:122 +#: src/Product/LicensedProductType.php:128 msgid "Max Activations" msgstr "Max. Aktivierungen" -#: src/Product/LicensedProductType.php:125 +#: src/Product/LicensedProductType.php:131 #, php-format msgid "Maximum number of domain activations per license. Default: %d" msgstr "Maximale Anzahl der Domain-Aktivierungen pro Lizenz. Standard: %d" -#: src/Product/LicensedProductType.php:140 +#: src/Product/LicensedProductType.php:146 msgid "License Validity (Days)" msgstr "Lizenz-Gültigkeit (Tage)" -#: src/Product/LicensedProductType.php:143 +#: src/Product/LicensedProductType.php:149 #, php-format msgid "Number of days the license is valid. Leave empty for default (%s)." msgstr "Anzahl Tage, die die Lizenz gültig ist. Leer lassen für Standard (%s)." -#: src/Product/LicensedProductType.php:158 +#: src/Product/LicensedProductType.php:164 msgid "Bind to Major Version" msgstr "An Hauptversion binden" -#: src/Product/LicensedProductType.php:161 +#: src/Product/LicensedProductType.php:167 #, php-format msgid "" "If enabled, licenses are bound to the major version at purchase time. " @@ -1305,14 +1305,18 @@ msgstr "" "Falls aktiviert, werden Lizenzen an die Hauptversion zum Kaufzeitpunkt " "gebunden. Standard: %s" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "Yes" msgstr "Ja" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "No" msgstr "Nein" +#: src/Product/LicensedProductType.php:288 +msgid "Version:" +msgstr "Version:" + #: src/Product/VersionManager.php:166 msgid "Attachment file not found." msgstr "Anhangs-Datei nicht gefunden." diff --git a/languages/wc-licensed-product.pot b/languages/wc-licensed-product.pot index 6a758e5..d4f31dd 100644 --- a/languages/wc-licensed-product.pot +++ b/languages/wc-licensed-product.pot @@ -1,14 +1,14 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Marco Graetsch -# This file is distributed under the same license as the WooCommerce Licensed Product package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the WC Licensed Product package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: WooCommerce Licensed Product 0.3.3\n" +"Project-Id-Version: WC Licensed Product 0.3.4\n" "Report-Msgid-Bugs-To: magdev3.0@gmail.com\n" -"POT-Creation-Date: 2026-01-23 11:41+0100\n" +"POT-Creation-Date: 2026-01-23 11:54+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -75,9 +75,9 @@ msgstr "" msgid "Licenses will be generated when the order is marked as paid/completed." msgstr "" -#: src/Admin/OrderLicenseController.php:144 src/Admin/AdminController.php:1280 +#: src/Admin/OrderLicenseController.php:144 +#: src/Admin/SettingsController.php:142 src/Admin/AdminController.php:1280 #: src/Admin/AdminController.php:1431 src/Admin/AdminController.php:1480 -#: src/Admin/SettingsController.php:142 #: src/Email/LicenseEmailController.php:230 msgid "License Key" msgstr "" @@ -125,11 +125,11 @@ msgstr "" msgid "Cancel" msgstr "" -#: src/Admin/OrderLicenseController.php:201 src/Admin/AdminController.php:151 +#: src/Admin/OrderLicenseController.php:201 +#: src/Admin/SettingsController.php:192 src/Admin/AdminController.php:151 #: src/Admin/AdminController.php:266 src/Admin/AdminController.php:1362 -#: src/Admin/AdminController.php:1602 src/Admin/SettingsController.php:192 -#: src/Product/LicensedProductType.php:104 -#: src/Product/LicensedProductType.php:152 +#: src/Admin/AdminController.php:1602 src/Product/LicensedProductType.php:110 +#: src/Product/LicensedProductType.php:158 msgid "Lifetime" msgstr "" @@ -207,6 +207,164 @@ msgstr "" msgid "Failed to update license domain." msgstr "" +#: src/Admin/SettingsController.php:54 +msgid "Licensed Products" +msgstr "" + +#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 +msgid "Plugin License" +msgstr "" + +#: src/Admin/SettingsController.php:65 +msgid "Default Settings" +msgstr "" + +#: src/Admin/SettingsController.php:66 +msgid "Notifications" +msgstr "" + +#: src/Admin/SettingsController.php:130 +msgid "" +"Configure the license for this plugin. A valid license is required for " +"frontend features to work." +msgstr "" + +#: src/Admin/SettingsController.php:134 +msgid "License Server URL" +msgstr "" + +#: src/Admin/SettingsController.php:136 +msgid "The URL of the license server (e.g., https://shop.example.com)." +msgstr "" + +#: src/Admin/SettingsController.php:144 +msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." +msgstr "" + +#: src/Admin/SettingsController.php:150 +msgid "Server Secret (Optional)" +msgstr "" + +#: src/Admin/SettingsController.php:152 +msgid "" +"If the license server uses signed responses, enter the shared secret here " +"for enhanced security." +msgstr "" + +#: src/Admin/SettingsController.php:170 +msgid "Default License Settings" +msgstr "" + +#: src/Admin/SettingsController.php:172 +msgid "" +"These settings serve as defaults for new licensed products. Individual " +"product settings override these defaults." +msgstr "" + +#: src/Admin/SettingsController.php:176 +msgid "Default Max Activations" +msgstr "" + +#: src/Admin/SettingsController.php:178 +msgid "Default maximum number of domain activations per license." +msgstr "" + +#: src/Admin/SettingsController.php:187 +msgid "Default License Validity (Days)" +msgstr "" + +#: src/Admin/SettingsController.php:189 +msgid "" +"Default number of days a license is valid. Leave empty or set to 0 for " +"lifetime licenses." +msgstr "" + +#: src/Admin/SettingsController.php:199 +msgid "Default Bind to Major Version" +msgstr "" + +#: src/Admin/SettingsController.php:201 +msgid "" +"If enabled, licenses are bound to the major version at purchase time by " +"default." +msgstr "" + +#: src/Admin/SettingsController.php:219 +msgid "Expiration Warning Schedule" +msgstr "" + +#: src/Admin/SettingsController.php:223 +#, php-format +msgid "" +"Configure when expiration warning emails are sent. To customize the email " +"template, enable/disable, or change the subject, go to %s." +msgstr "" + +#: src/Admin/SettingsController.php:225 +msgid "WooCommerce > Settings > Emails > License Expiration Warning" +msgstr "" + +#: src/Admin/SettingsController.php:230 +msgid "First Warning (Days Before)" +msgstr "" + +#: src/Admin/SettingsController.php:232 +msgid "Days before expiration to send the first warning email." +msgstr "" + +#: src/Admin/SettingsController.php:241 +msgid "Second Warning (Days Before)" +msgstr "" + +#: src/Admin/SettingsController.php:243 +msgid "" +"Days before expiration to send the second warning email. Set to 0 to disable." +msgstr "" + +#: src/Admin/SettingsController.php:283 +msgid "Running on localhost - license validation bypassed." +msgstr "" + +#: src/Admin/SettingsController.php:291 +msgid "License is valid and active." +msgstr "" + +#: src/Admin/SettingsController.php:297 +msgid "License is not valid. Frontend features are disabled." +msgstr "" + +#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 +msgid "Verify License" +msgstr "" + +#: src/Admin/SettingsController.php:322 +msgid "Verifying..." +msgstr "" + +#: src/Admin/SettingsController.php:341 +msgid "Request failed." +msgstr "" + +#: src/Admin/SettingsController.php:454 src/Admin/AdminController.php:455 +#: src/Admin/AdminController.php:475 src/Admin/AdminController.php:493 +#: src/Admin/AdminController.php:511 src/Admin/AdminController.php:531 +#: src/Admin/AdminController.php:549 src/Admin/AdminController.php:616 +#: src/Admin/AdminController.php:806 src/Frontend/AccountController.php:326 +msgid "Security check failed." +msgstr "" + +#: src/Admin/SettingsController.php:458 +msgid "Insufficient permissions." +msgstr "" + +#: src/Admin/SettingsController.php:467 +msgid "License verified successfully!" +msgstr "" + +#: src/Admin/SettingsController.php:469 +msgid "License validation failed." +msgstr "" + #: src/Admin/AdminController.php:93 msgid "Overview" msgstr "" @@ -325,14 +483,6 @@ msgstr "" msgid "License key and domain are required." msgstr "" -#: src/Admin/AdminController.php:455 src/Admin/AdminController.php:475 -#: src/Admin/AdminController.php:493 src/Admin/AdminController.php:511 -#: src/Admin/AdminController.php:531 src/Admin/AdminController.php:549 -#: src/Admin/AdminController.php:616 src/Admin/AdminController.php:806 -#: src/Admin/SettingsController.php:454 src/Frontend/AccountController.php:326 -msgid "Security check failed." -msgstr "" - #: src/Admin/AdminController.php:576 msgid "You do not have permission to export licenses." msgstr "" @@ -800,156 +950,6 @@ msgstr "" msgid "No domain specified" msgstr "" -#: src/Admin/SettingsController.php:54 -msgid "Licensed Products" -msgstr "" - -#: src/Admin/SettingsController.php:64 src/Admin/SettingsController.php:128 -msgid "Plugin License" -msgstr "" - -#: src/Admin/SettingsController.php:65 -msgid "Default Settings" -msgstr "" - -#: src/Admin/SettingsController.php:66 -msgid "Notifications" -msgstr "" - -#: src/Admin/SettingsController.php:130 -msgid "" -"Configure the license for this plugin. A valid license is required for " -"frontend features to work." -msgstr "" - -#: src/Admin/SettingsController.php:134 -msgid "License Server URL" -msgstr "" - -#: src/Admin/SettingsController.php:136 -msgid "The URL of the license server (e.g., https://shop.example.com)." -msgstr "" - -#: src/Admin/SettingsController.php:144 -msgid "Your license key in XXXX-XXXX-XXXX-XXXX format." -msgstr "" - -#: src/Admin/SettingsController.php:150 -msgid "Server Secret (Optional)" -msgstr "" - -#: src/Admin/SettingsController.php:152 -msgid "" -"If the license server uses signed responses, enter the shared secret here " -"for enhanced security." -msgstr "" - -#: src/Admin/SettingsController.php:170 -msgid "Default License Settings" -msgstr "" - -#: src/Admin/SettingsController.php:172 -msgid "" -"These settings serve as defaults for new licensed products. Individual " -"product settings override these defaults." -msgstr "" - -#: src/Admin/SettingsController.php:176 -msgid "Default Max Activations" -msgstr "" - -#: src/Admin/SettingsController.php:178 -msgid "Default maximum number of domain activations per license." -msgstr "" - -#: src/Admin/SettingsController.php:187 -msgid "Default License Validity (Days)" -msgstr "" - -#: src/Admin/SettingsController.php:189 -msgid "" -"Default number of days a license is valid. Leave empty or set to 0 for " -"lifetime licenses." -msgstr "" - -#: src/Admin/SettingsController.php:199 -msgid "Default Bind to Major Version" -msgstr "" - -#: src/Admin/SettingsController.php:201 -msgid "" -"If enabled, licenses are bound to the major version at purchase time by " -"default." -msgstr "" - -#: src/Admin/SettingsController.php:219 -msgid "Expiration Warning Schedule" -msgstr "" - -#: src/Admin/SettingsController.php:223 -#, php-format -msgid "" -"Configure when expiration warning emails are sent. To customize the email " -"template, enable/disable, or change the subject, go to %s." -msgstr "" - -#: src/Admin/SettingsController.php:225 -msgid "WooCommerce > Settings > Emails > License Expiration Warning" -msgstr "" - -#: src/Admin/SettingsController.php:230 -msgid "First Warning (Days Before)" -msgstr "" - -#: src/Admin/SettingsController.php:232 -msgid "Days before expiration to send the first warning email." -msgstr "" - -#: src/Admin/SettingsController.php:241 -msgid "Second Warning (Days Before)" -msgstr "" - -#: src/Admin/SettingsController.php:243 -msgid "" -"Days before expiration to send the second warning email. Set to 0 to disable." -msgstr "" - -#: src/Admin/SettingsController.php:283 -msgid "Running on localhost - license validation bypassed." -msgstr "" - -#: src/Admin/SettingsController.php:291 -msgid "License is valid and active." -msgstr "" - -#: src/Admin/SettingsController.php:297 -msgid "License is not valid. Frontend features are disabled." -msgstr "" - -#: src/Admin/SettingsController.php:308 src/Admin/SettingsController.php:344 -msgid "Verify License" -msgstr "" - -#: src/Admin/SettingsController.php:322 -msgid "Verifying..." -msgstr "" - -#: src/Admin/SettingsController.php:341 -msgid "Request failed." -msgstr "" - -#: src/Admin/SettingsController.php:458 -msgid "Insufficient permissions." -msgstr "" - -#: src/Admin/SettingsController.php:467 -msgid "License verified successfully!" -msgstr "" - -#: src/Admin/SettingsController.php:469 -msgid "License validation failed." -msgstr "" - #: src/Admin/VersionAdminController.php:58 msgid "Product Versions" msgstr "" @@ -1212,65 +1212,69 @@ msgstr "" msgid "Could not connect to license server." msgstr "" -#: src/Product/LicensedProductType.php:55 +#: src/Product/LicensedProductType.php:61 msgid "Licensed Product" msgstr "" -#: src/Product/LicensedProductType.php:76 +#: src/Product/LicensedProductType.php:82 msgid "License Settings" msgstr "" -#: src/Product/LicensedProductType.php:103 +#: src/Product/LicensedProductType.php:109 #, php-format msgid "%d days" msgstr "" -#: src/Product/LicensedProductType.php:113 +#: src/Product/LicensedProductType.php:119 #, php-format msgid "Leave fields empty to use default settings from %s." msgstr "" -#: src/Product/LicensedProductType.php:115 +#: src/Product/LicensedProductType.php:121 msgid "WooCommerce > Settings > Licensed Products" msgstr "" -#: src/Product/LicensedProductType.php:122 +#: src/Product/LicensedProductType.php:128 msgid "Max Activations" msgstr "" -#: src/Product/LicensedProductType.php:125 +#: src/Product/LicensedProductType.php:131 #, php-format msgid "Maximum number of domain activations per license. Default: %d" msgstr "" -#: src/Product/LicensedProductType.php:140 +#: src/Product/LicensedProductType.php:146 msgid "License Validity (Days)" msgstr "" -#: src/Product/LicensedProductType.php:143 +#: src/Product/LicensedProductType.php:149 #, php-format msgid "Number of days the license is valid. Leave empty for default (%s)." msgstr "" -#: src/Product/LicensedProductType.php:158 +#: src/Product/LicensedProductType.php:164 msgid "Bind to Major Version" msgstr "" -#: src/Product/LicensedProductType.php:161 +#: src/Product/LicensedProductType.php:167 #, php-format msgid "" "If enabled, licenses are bound to the major version at purchase time. " "Default: %s" msgstr "" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "Yes" msgstr "" -#: src/Product/LicensedProductType.php:162 +#: src/Product/LicensedProductType.php:168 msgid "No" msgstr "" +#: src/Product/LicensedProductType.php:288 +msgid "Version:" +msgstr "" + #: src/Product/VersionManager.php:166 msgid "Attachment file not found." msgstr "" diff --git a/src/Product/LicensedProductType.php b/src/Product/LicensedProductType.php index 3b30e28..0a903c3 100644 --- a/src/Product/LicensedProductType.php +++ b/src/Product/LicensedProductType.php @@ -45,6 +45,12 @@ final class LicensedProductType // Make product virtual by default add_filter('woocommerce_product_is_virtual', [$this, 'isVirtual'], 10, 2); + + // Display current version under product title on single product page + add_action('woocommerce_single_product_summary', [$this, 'displayCurrentVersion'], 6); + + // Enqueue frontend CSS for licensed products on single product pages + add_action('wp_enqueue_scripts', [$this, 'enqueueFrontendStyles']); } /** @@ -235,4 +241,52 @@ final class LicensedProductType } return $isVirtual; } + + /** + * Enqueue frontend styles for licensed products on single product pages + */ + public function enqueueFrontendStyles(): void + { + if (!is_product()) { + return; + } + + global $product; + + if (!$product || !$product->is_type('licensed')) { + return; + } + + wp_enqueue_style( + 'wc-licensed-product-frontend', + WC_LICENSED_PRODUCT_PLUGIN_URL . 'assets/css/frontend.css', + [], + WC_LICENSED_PRODUCT_VERSION + ); + } + + /** + * Display current version under product title on single product page + */ + public function displayCurrentVersion(): void + { + global $product; + + if (!$product || !$product->is_type('licensed')) { + return; + } + + /** @var LicensedProduct $product */ + $version = $product->get_current_version(); + + if (empty($version)) { + return; + } + + printf( + '

%s %s

', + esc_html__('Version:', 'wc-licensed-product'), + esc_html($version) + ); + } } diff --git a/wc-licensed-product.php b/wc-licensed-product.php index 178b7f3..d7fc007 100644 --- a/wc-licensed-product.php +++ b/wc-licensed-product.php @@ -3,7 +3,7 @@ * Plugin Name: WooCommerce Licensed Product * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-licensed-product * Description: WooCommerce plugin to sell software products using license keys with domain-based validation. - * Version: 0.3.3 + * Version: 0.3.4 * Author: Marco Graetsch * Author URI: https://src.bundespruefstelle.ch/magdev * License: GPL-2.0-or-later @@ -28,7 +28,7 @@ if (!defined('ABSPATH')) { } // Plugin constants -define('WC_LICENSED_PRODUCT_VERSION', '0.3.3'); +define('WC_LICENSED_PRODUCT_VERSION', '0.3.4'); define('WC_LICENSED_PRODUCT_PLUGIN_FILE', __FILE__); define('WC_LICENSED_PRODUCT_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WC_LICENSED_PRODUCT_PLUGIN_URL', plugin_dir_url(__FILE__));