You've already forked wc-tier-and-package-prices
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 74cc56005e | |||
| 136eed2bdd | |||
| 178f86f3e6 | |||
| 7286459ff2 | |||
| cbe758267e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -37,3 +37,6 @@ wp-core
|
||||
|
||||
# Releases (not tracked in git)
|
||||
/releases/
|
||||
|
||||
# Claude Code local settings
|
||||
.claude/settings.json
|
||||
|
||||
40
CHANGELOG.md
40
CHANGELOG.md
@@ -5,6 +5,46 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in
|
||||
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).
|
||||
|
||||
## [1.3.1] - 2026-01-27
|
||||
|
||||
### Changed
|
||||
|
||||
- **Switched to SecureLicenseClient**: Upgraded from basic `LicenseClient` to `SecureLicenseClient` with HMAC-SHA256 response signature verification for enhanced security against tampering and replay attacks
|
||||
|
||||
- **Added Server Secret Configuration**: New "Server Secret" field in License settings for secure communication with the license server
|
||||
|
||||
### Added
|
||||
|
||||
- **Rate Limit Handling**: Added proper handling of `RateLimitExceededException` with user-friendly messages showing retry wait time
|
||||
- **Signature Verification Error Handling**: Added dedicated handling for `SignatureException` when response signatures fail verification
|
||||
- **URL Validation Error Handling**: Added handling for `InvalidArgumentException` from SSRF protection in the license client
|
||||
|
||||
### Security
|
||||
|
||||
- Response signatures are now verified using HMAC-SHA256 with license-specific derived keys (RFC 5869 HKDF)
|
||||
- The license client now validates server URLs to prevent SSRF attacks (blocks private IP ranges)
|
||||
- HTTP connections require HTTPS unless explicitly allowed for localhost testing
|
||||
|
||||
### Technical Details
|
||||
|
||||
**License Client Upgrade**:
|
||||
|
||||
- Changed from `LicenseClient` to `SecureLicenseClient`
|
||||
- Added `serverSecret` parameter for signature verification
|
||||
- Library updated from `v0.1.0` to `dev-main` with new security features
|
||||
|
||||
**New Exception Handling**:
|
||||
|
||||
- `RateLimitExceededException` - shows retry time to user
|
||||
- `SignatureException` - indicates server secret mismatch
|
||||
- `InvalidArgumentException` - invalid/blocked URL detected
|
||||
|
||||
**New Settings Field**:
|
||||
|
||||
- `wc_tpp_license_server_secret` (password type) for the shared secret
|
||||
|
||||
---
|
||||
|
||||
## [1.3.0] - 2026-01-25
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
94
CLAUDE.md
94
CLAUDE.md
@@ -1,7 +1,7 @@
|
||||
# WooCommerce Tier and Package Prices - AI Context Document
|
||||
|
||||
**Last Updated:** 2026-01-25
|
||||
**Current Version:** 1.3.0
|
||||
**Last Updated:** 2026-01-27
|
||||
**Current Version:** 1.3.1
|
||||
**Author:** Marco Graetsch
|
||||
**Project Status:** Production-ready WordPress plugin
|
||||
|
||||
@@ -20,9 +20,9 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
|
||||
|
||||
**Note for AI Assistants:** Clean this section after the specific features are done or new releases are made. Effective changes are tracked in `CHANGELOG.md`. Do not add completed versions here - document them in the Session History section at the end of this file. Always keep the `Known Bugs` section and create a section with the next bugfix and minor version after a release.
|
||||
|
||||
### Version 1.3.1
|
||||
### Version 1.3.2
|
||||
|
||||
- TBD
|
||||
- No planned changes yet
|
||||
|
||||
## Technical Stack
|
||||
|
||||
@@ -40,7 +40,7 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
|
||||
```json
|
||||
{
|
||||
"twig/twig": "^3.0",
|
||||
"magdev/wc-licensed-product-client": "^0.1",
|
||||
"magdev/wc-licensed-product-client": "dev-main",
|
||||
"symfony/http-client": "^7.0",
|
||||
"psr/log": "^3.0",
|
||||
"psr/cache": "^3.0",
|
||||
@@ -1101,8 +1101,8 @@ if (!empty($tiers)) {
|
||||
|
||||
### PHP
|
||||
|
||||
- Minimum: 7.4
|
||||
- Uses modern PHP features (type hints acceptable in new code)
|
||||
- Minimum: 8.3 (breaking change in v1.3.0)
|
||||
- Uses modern PHP features (type hints, named arguments, etc.)
|
||||
- Composer autoloader handles namespacing
|
||||
|
||||
### Browsers
|
||||
@@ -1138,4 +1138,84 @@ The plugin architecture is solid and well-tested. Most bugs arise from:
|
||||
|
||||
---
|
||||
|
||||
## Session History
|
||||
|
||||
### v1.3.0 Release Session (2026-01-25)
|
||||
|
||||
**Accomplished:**
|
||||
|
||||
1. Fixed known bugs from CLAUDE.md:
|
||||
- Removed all releases from git tracking (`git rm --cached -r releases/`)
|
||||
- Deleted all MD5 checksum files, keeping only SHA256
|
||||
- Updated `.gitignore` to exclude `/releases/`
|
||||
|
||||
2. Implemented v1.3.0 features:
|
||||
- Bumped PHP requirement from 7.4 to 8.3 (breaking change)
|
||||
- Added PHP version check with admin notice for incompatible servers
|
||||
- Added `magdev/wc-licensed-product-client` library integration
|
||||
- Refactored settings page to use WooCommerce modern sub-tabs pattern (`get_own_sections()`)
|
||||
- Created "General" and "License" sub-tabs
|
||||
- Implemented license management with AJAX validation/activation
|
||||
- Added license status caching via WordPress transients
|
||||
- Added CSS styling for license status display
|
||||
|
||||
3. Updated all translation files:
|
||||
- Added 28 new translation strings for license management
|
||||
- Updated .pot template and all 7 .po files
|
||||
- Compiled all .mo files
|
||||
|
||||
4. Created release package:
|
||||
- Package size: 737KB (increased due to new dependencies)
|
||||
- 642 files included (more due to license client library)
|
||||
- SHA256 checksum generated
|
||||
|
||||
**Key Learnings:**
|
||||
|
||||
- WooCommerce settings sub-tabs use `get_own_sections()` and `get_settings_for_{section}_section()` pattern
|
||||
- License client library `magdev/wc-licensed-product-client` is from private Gitea repo - requires `repositories` config in composer.json
|
||||
- Package version was `^0.1` not `^1.0` - always check available versions before setting constraint
|
||||
- Release package size increased from ~430KB to ~737KB due to new Composer dependencies
|
||||
|
||||
### v1.3.1 Release Session (2026-01-27)
|
||||
|
||||
**Accomplished:**
|
||||
|
||||
1. Reviewed server-implementation.md from license client library
|
||||
2. Upgraded from `LicenseClient` to `SecureLicenseClient`:
|
||||
- Added "Server Secret" configuration field in License settings tab
|
||||
- Updated `get_license_client()` to use `SecureLicenseClient` with HMAC-SHA256 signature verification
|
||||
- Updated JavaScript to pass `server_secret` in AJAX requests
|
||||
|
||||
3. Added comprehensive exception handling:
|
||||
- `RateLimitExceededException` - Shows retry time to user
|
||||
- `SignatureException` - Reports signature verification failures
|
||||
- `InvalidArgumentException` - SSRF protection for private IP blocking
|
||||
|
||||
4. Updated Composer dependencies:
|
||||
- Changed `magdev/wc-licensed-product-client` from `^0.1` to `dev-main`
|
||||
- Library includes new security features (SSRF protection, response signatures)
|
||||
|
||||
5. Updated translations:
|
||||
- Added 7 new translation strings for v1.3.1
|
||||
- All 7 language files updated and compiled
|
||||
|
||||
6. Created release package:
|
||||
- Package size: 745KB
|
||||
- 642 files included
|
||||
- SHA256 checksum generated
|
||||
|
||||
7. Updated README.md:
|
||||
- Documented license management feature
|
||||
- Updated PHP requirement to 8.3
|
||||
- Added v1.3.0 and v1.3.1 changelog entries
|
||||
|
||||
**Key Learnings:**
|
||||
|
||||
- `SecureLicenseClient` requires `serverSecret` parameter for HMAC verification
|
||||
- The library's exception classes are in `Magdev\WcLicensedProductClient\Exception\` and `Magdev\WcLicensedProductClient\Security\` namespaces
|
||||
- `RateLimitExceededException` has a `retryAfter` property (int seconds)
|
||||
- Always check library documentation in `docs/server-implementation.md` for implementation requirements
|
||||
|
||||
---
|
||||
|
||||
Always refer to this document when starting work on this project. Good luck!
|
||||
|
||||
50
README.md
50
README.md
@@ -20,10 +20,11 @@ A powerful WooCommerce plugin that adds tier pricing and package pricing functio
|
||||
|
||||
### Admin Features
|
||||
- Easy-to-use product meta boxes for adding tiers and packages
|
||||
- Global settings page under WooCommerce menu
|
||||
- Global settings page under WooCommerce menu with sub-tabs
|
||||
- Configure display position (before/after add to cart, after price)
|
||||
- Enable/disable tier or package pricing independently
|
||||
- Sortable pricing rules
|
||||
- License management with secure HMAC signature verification
|
||||
|
||||
### Frontend Features
|
||||
- Beautiful pricing tables on product pages
|
||||
@@ -110,7 +111,7 @@ When editing a product, scroll to the **Product data** panel:
|
||||
|
||||
```
|
||||
wc-tier-and-package-prices/
|
||||
├── wc-tier-and-package-prices.php # Main plugin file (v1.1.20)
|
||||
├── wc-tier-and-package-prices.php # Main plugin file (v1.3.1)
|
||||
├── includes/
|
||||
│ ├── class-wc-tpp-admin.php # Admin settings integration
|
||||
│ ├── class-wc-tpp-settings.php # WooCommerce settings page
|
||||
@@ -149,7 +150,7 @@ wc-tier-and-package-prices/
|
||||
|
||||
- WordPress 6.0 or higher (tested up to 6.9.x)
|
||||
- WooCommerce 8.0 or higher (tested up to 10.x)
|
||||
- PHP 7.4 or higher
|
||||
- PHP 8.3 or higher (required since v1.3.0)
|
||||
|
||||
### Compatibility
|
||||
|
||||
@@ -183,9 +184,32 @@ This plugin is licensed under the GPL v2 or later.
|
||||
|
||||
## Changelog
|
||||
|
||||
### Version 1.3.1 - 2026-01-27
|
||||
|
||||
__Current Release__ - Secure License Client
|
||||
|
||||
- __Changed__: Switched to `SecureLicenseClient` with HMAC-SHA256 response signature verification
|
||||
- __New__: Server Secret configuration field for secure communication with license server
|
||||
- __New__: Rate limit exception handling with retry time display
|
||||
- __New__: Signature verification and URL validation error handling
|
||||
- __Security__: Response signatures verified using HMAC-SHA256 with license-specific derived keys
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md) for complete details.
|
||||
|
||||
### Version 1.3.0 - 2026-01-25
|
||||
|
||||
__Breaking Changes__ - PHP 8.3+ Required
|
||||
|
||||
- __Breaking__: Minimum PHP version increased from 7.4 to 8.3
|
||||
- __New__: License management via `magdev/wc-licensed-product-client` library
|
||||
- __New__: Settings page split into "General" and "License" sub-tabs
|
||||
- __New__: AJAX-based license validation and activation with visual feedback
|
||||
- __New__: License status caching with daily auto-refresh
|
||||
- __New__: PHP version check with admin notice for incompatible servers
|
||||
|
||||
### Version 1.2.0 - 2025-12-29
|
||||
|
||||
__Current Release__ - Variable Product Support
|
||||
Variable Product Support
|
||||
|
||||
- __New__: Full support for WooCommerce variable products with variation-level pricing
|
||||
- __New__: Each variation can have independent tier and package pricing configuration
|
||||
@@ -194,24 +218,6 @@ __Current Release__ - Variable Product Support
|
||||
- __Fixed__: Quantity restrictions now work correctly per-variation
|
||||
- 100% backward compatible - no breaking changes
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md) for complete details.
|
||||
|
||||
### Version 1.1.22 - 2025-12-23
|
||||
|
||||
- Increased width of label input fields in admin interface
|
||||
|
||||
#### Fixed
|
||||
- **CRITICAL:** WooCommerce Blocks fatal error in mini-cart and cart blocks
|
||||
- Fixed `woocommerce_store_api_product_quantity_editable` filter signature mismatch
|
||||
- Filter now correctly accepts `WC_Product` object instead of cart item array
|
||||
- Resolves "Cannot use object of type WC_Product_Simple as array" fatal error
|
||||
|
||||
#### Technical Details
|
||||
- Updated `block_quantity_editable()` method signature to accept product object
|
||||
- Changed parameter from `$cart_item` array to `WC_Product $product`
|
||||
- Uses `$product->get_id()` instead of array access for product ID
|
||||
- Full compatibility with WooCommerce Store API and block-based cart/checkout
|
||||
|
||||
### Recent Major Updates
|
||||
|
||||
#### Version 1.1.7 - Enhanced Tier Pricing
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "magdev/wc-tier-package-prices",
|
||||
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
|
||||
"version": "1.3.0",
|
||||
"version": "1.3.1",
|
||||
"type": "wordpress-plugin",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"authors": [
|
||||
@@ -19,7 +19,7 @@
|
||||
"require": {
|
||||
"php": ">=8.3",
|
||||
"twig/twig": "^3.0",
|
||||
"magdev/wc-licensed-product-client": "^0.1"
|
||||
"magdev/wc-licensed-product-client": "dev-main"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
|
||||
@@ -154,6 +154,16 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
'desc_tip' => true,
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('Server Secret', 'wc-tier-package-prices'),
|
||||
'desc' => __('The shared secret for secure communication with the license server.', 'wc-tier-package-prices'),
|
||||
'id' => 'wc_tpp_license_server_secret',
|
||||
'type' => 'password',
|
||||
'default' => '',
|
||||
'css' => 'min-width:400px;',
|
||||
'desc_tip' => true,
|
||||
),
|
||||
|
||||
array(
|
||||
'title' => __('License Status', 'wc-tier-package-prices'),
|
||||
'type' => 'wc_tpp_license_status',
|
||||
@@ -188,13 +198,14 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
|
||||
$license_key = sanitize_text_field(wp_unslash($_POST['license_key'] ?? ''));
|
||||
$server_url = esc_url_raw(wp_unslash($_POST['server_url'] ?? ''));
|
||||
$server_secret = sanitize_text_field(wp_unslash($_POST['server_secret'] ?? ''));
|
||||
|
||||
if (empty($license_key) || empty($server_url)) {
|
||||
wp_send_json_error(array('message' => __('License key and server URL are required.', 'wc-tier-package-prices')));
|
||||
if (empty($license_key) || empty($server_url) || empty($server_secret)) {
|
||||
wp_send_json_error(array('message' => __('License key, server URL, and server secret are required.', 'wc-tier-package-prices')));
|
||||
}
|
||||
|
||||
try {
|
||||
$client = $this->get_license_client($server_url);
|
||||
$client = $this->get_license_client($server_url, $server_secret);
|
||||
$domain = $this->get_current_domain();
|
||||
$result = $client->validate($license_key, $domain);
|
||||
|
||||
@@ -212,16 +223,37 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
'status' => $this->get_cached_license_status(),
|
||||
));
|
||||
|
||||
} catch (\Magdev\WcLicensedProductClient\Exception\RateLimitExceededException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => sprintf(
|
||||
/* translators: %d: Number of seconds to wait */
|
||||
__('Rate limit exceeded. Please try again in %d seconds.', 'wc-tier-package-prices'),
|
||||
$e->retryAfter ?? 60
|
||||
),
|
||||
'code' => 'rate_limit_exceeded',
|
||||
'retry_after' => $e->retryAfter,
|
||||
));
|
||||
} catch (\Magdev\WcLicensedProductClient\Security\SignatureException $e) {
|
||||
delete_transient('wc_tpp_license_status');
|
||||
wp_send_json_error(array(
|
||||
'message' => __('Response signature verification failed. Please check your server secret.', 'wc-tier-package-prices'),
|
||||
'code' => 'signature_error',
|
||||
));
|
||||
} catch (\Magdev\WcLicensedProductClient\Exception\LicenseException $e) {
|
||||
delete_transient('wc_tpp_license_status');
|
||||
wp_send_json_error(array(
|
||||
'message' => $e->getMessage(),
|
||||
'code' => $e->errorCode ?? 'unknown',
|
||||
));
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => $e->getMessage(),
|
||||
'code' => 'invalid_url',
|
||||
));
|
||||
} catch (\Exception $e) {
|
||||
delete_transient('wc_tpp_license_status');
|
||||
wp_send_json_error(array(
|
||||
'message' => $e->getMessage(),
|
||||
'message' => __('An unexpected error occurred. Please try again.', 'wc-tier-package-prices'),
|
||||
'code' => 'exception',
|
||||
));
|
||||
}
|
||||
@@ -239,13 +271,14 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
|
||||
$license_key = sanitize_text_field(wp_unslash($_POST['license_key'] ?? ''));
|
||||
$server_url = esc_url_raw(wp_unslash($_POST['server_url'] ?? ''));
|
||||
$server_secret = sanitize_text_field(wp_unslash($_POST['server_secret'] ?? ''));
|
||||
|
||||
if (empty($license_key) || empty($server_url)) {
|
||||
wp_send_json_error(array('message' => __('License key and server URL are required.', 'wc-tier-package-prices')));
|
||||
if (empty($license_key) || empty($server_url) || empty($server_secret)) {
|
||||
wp_send_json_error(array('message' => __('License key, server URL, and server secret are required.', 'wc-tier-package-prices')));
|
||||
}
|
||||
|
||||
try {
|
||||
$client = $this->get_license_client($server_url);
|
||||
$client = $this->get_license_client($server_url, $server_secret);
|
||||
$domain = $this->get_current_domain();
|
||||
$result = $client->activate($license_key, $domain);
|
||||
|
||||
@@ -269,14 +302,34 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
|
||||
wp_send_json_error(array('message' => $result->message));
|
||||
|
||||
} catch (\Magdev\WcLicensedProductClient\Exception\RateLimitExceededException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => sprintf(
|
||||
/* translators: %d: Number of seconds to wait */
|
||||
__('Rate limit exceeded. Please try again in %d seconds.', 'wc-tier-package-prices'),
|
||||
$e->retryAfter ?? 60
|
||||
),
|
||||
'code' => 'rate_limit_exceeded',
|
||||
'retry_after' => $e->retryAfter,
|
||||
));
|
||||
} catch (\Magdev\WcLicensedProductClient\Security\SignatureException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => __('Response signature verification failed. Please check your server secret.', 'wc-tier-package-prices'),
|
||||
'code' => 'signature_error',
|
||||
));
|
||||
} catch (\Magdev\WcLicensedProductClient\Exception\LicenseException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => $e->getMessage(),
|
||||
'code' => $e->errorCode ?? 'unknown',
|
||||
));
|
||||
} catch (\Exception $e) {
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => $e->getMessage(),
|
||||
'code' => 'invalid_url',
|
||||
));
|
||||
} catch (\Exception $e) {
|
||||
wp_send_json_error(array(
|
||||
'message' => __('An unexpected error occurred. Please try again.', 'wc-tier-package-prices'),
|
||||
'code' => 'exception',
|
||||
));
|
||||
}
|
||||
@@ -285,14 +338,18 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
/**
|
||||
* Get license client instance
|
||||
*
|
||||
* Uses SecureLicenseClient for HMAC signature verification.
|
||||
*
|
||||
* @param string $server_url License server URL.
|
||||
* @param string $server_secret Shared secret for signature verification.
|
||||
* @return \Magdev\WcLicensedProductClient\LicenseClientInterface
|
||||
*/
|
||||
private function get_license_client(string $server_url): \Magdev\WcLicensedProductClient\LicenseClientInterface {
|
||||
private function get_license_client(string $server_url, string $server_secret): \Magdev\WcLicensedProductClient\LicenseClientInterface {
|
||||
$httpClient = \Symfony\Component\HttpClient\HttpClient::create();
|
||||
return new \Magdev\WcLicensedProductClient\LicenseClient(
|
||||
return new \Magdev\WcLicensedProductClient\SecureLicenseClient(
|
||||
httpClient: $httpClient,
|
||||
baseUrl: $server_url,
|
||||
serverSecret: $server_secret,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -402,6 +459,7 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
return {
|
||||
license_key: $('#wc_tpp_license_key').val(),
|
||||
server_url: $('#wc_tpp_license_server_url').val(),
|
||||
server_secret: $('#wc_tpp_license_server_secret').val(),
|
||||
nonce: '<?php echo esc_js($nonce); ?>'
|
||||
};
|
||||
}
|
||||
@@ -420,8 +478,8 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
|
||||
$validateBtn.on('click', function() {
|
||||
var data = getLicenseData();
|
||||
if (!data.license_key || !data.server_url) {
|
||||
alert('<?php echo esc_js(__('Please enter both license server URL and license key.', 'wc-tier-package-prices')); ?>');
|
||||
if (!data.license_key || !data.server_url || !data.server_secret) {
|
||||
alert('<?php echo esc_js(__('Please enter license server URL, license key, and server secret.', 'wc-tier-package-prices')); ?>');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -443,8 +501,8 @@ if (!class_exists('WC_TPP_Settings')) {
|
||||
|
||||
$activateBtn.on('click', function() {
|
||||
var data = getLicenseData();
|
||||
if (!data.license_key || !data.server_url) {
|
||||
alert('<?php echo esc_js(__('Please enter both license server URL and license key.', 'wc-tier-package-prices')); ?>');
|
||||
if (!data.license_key || !data.server_url || !data.server_secret) {
|
||||
alert('<?php echo esc_js(__('Please enter license server URL, license key, and server secret.', 'wc-tier-package-prices')); ?>');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Zugriff verweigert."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "Lizenzschlüssel und Server-URL sind erforderlich."
|
||||
msgid "Server Secret"
|
||||
msgstr "Server-Geheimnis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Bitte geben Sie sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Anfragelimit überschritten. Bitte versuchen Sie es in %d Sekunden erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfen Sie Ihr Server-Geheimnis."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Bitte geben Sie die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Zugriff verweigert."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "Lizenzschlüssel und Server-URL sind erforderlich."
|
||||
msgid "Server Secret"
|
||||
msgstr "Server-Geheimnis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Bitte gib sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Anfragelimit überschritten. Bitte versuche es in %d Sekunden erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfe dein Server-Geheimnis."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Bitte gib die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Zugriff verweigert."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "Lizenzschlüssel und Server-URL sind erforderlich."
|
||||
msgid "Server Secret"
|
||||
msgstr "Server-Geheimnis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Bitte geben Sie sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Anfragelimit überschritten. Bitte versuchen Sie es in %d Sekunden erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfen Sie Ihr Server-Geheimnis."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Bitte geben Sie die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Zugriff verweigert."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "Lizenzschlüssel und Server-URL sind erforderlich."
|
||||
msgid "Server Secret"
|
||||
msgstr "Server-Geheimnis"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Bitte gib sowohl die Lizenzserver-URL als auch den Lizenzschlüssel ein."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Das gemeinsame Geheimnis für die sichere Kommunikation mit dem Lizenzserver."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "Lizenzschlüssel, Server-URL und Server-Geheimnis sind erforderlich."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Anfragelimit überschritten. Bitte versuche es in %d Sekunden erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Überprüfung der Antwortsignatur fehlgeschlagen. Bitte überprüfe dein Server-Geheimnis."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Bitte gib die Lizenzserver-URL, den Lizenzschlüssel und das Server-Geheimnis ein."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Permission denied."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "License key and server URL are required."
|
||||
msgid "Server Secret"
|
||||
msgstr "Server Secret"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Please enter both license server URL and license key."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "The shared secret for secure communication with the license server."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "License key, server URL, and server secret are required."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Rate limit exceeded. Please try again in %d seconds."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Response signature verification failed. Please check your server secret."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "An unexpected error occurred. Please try again."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Please enter license server URL, license key, and server secret."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Accès refusé."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "La clé de licence et l'URL du serveur sont requises."
|
||||
msgid "Server Secret"
|
||||
msgstr "Secret serveur"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Veuillez entrer l'URL du serveur de licence et la clé de licence."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Le secret partagé pour la communication sécurisée avec le serveur de licence."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "La clé de licence, l'URL du serveur et le secret serveur sont requis."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Limite de requêtes dépassée. Veuillez réessayer dans %d secondes."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "La vérification de la signature a échoué. Veuillez vérifier votre secret serveur."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Une erreur inattendue s'est produite. Veuillez réessayer."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Veuillez entrer l'URL du serveur de licence, la clé de licence et le secret serveur."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
Binary file not shown.
@@ -359,12 +359,33 @@ msgid "Permission denied."
|
||||
msgstr "Accesso negato."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgstr "La chiave di licenza e l'URL del server sono obbligatori."
|
||||
msgid "Server Secret"
|
||||
msgstr "Segreto del server"
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgstr "Inserisci sia l'URL del server di licenza che la chiave di licenza."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr "Il segreto condiviso per la comunicazione sicura con il server di licenza."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr "La chiave di licenza, l'URL del server e il segreto del server sono obbligatori."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr "Limite di richieste superato. Per favore riprova tra %d secondi."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr "Verifica della firma della risposta fallita. Per favore controlla il tuo segreto del server."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr "Si è verificato un errore imprevisto. Per favore riprova."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr "Inserisci l'URL del server di licenza, la chiave di licenza e il segreto del server."
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Validation failed."
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
# This file is distributed under the GPL v2 or later.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.2.7\n"
|
||||
"Project-Id-Version: WooCommerce Tier and Package Prices 1.3.1\n"
|
||||
"Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n"
|
||||
"POT-Creation-Date: 2025-12-30 00:00+0000\n"
|
||||
"POT-Creation-Date: 2026-01-27 00:00+0000\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@@ -332,11 +332,32 @@ msgid "Permission denied."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key and server URL are required."
|
||||
msgid "Server Secret"
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter both license server URL and license key."
|
||||
msgid "The shared secret for secure communication with the license server."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "License key, server URL, and server secret are required."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
#. translators: %d: Number of seconds to wait
|
||||
msgid "Rate limit exceeded. Please try again in %d seconds."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Response signature verification failed. Please check your server secret."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "An unexpected error occurred. Please try again."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
msgid "Please enter license server URL, license key, and server secret."
|
||||
msgstr ""
|
||||
|
||||
#: includes/class-wc-tpp-settings.php
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Plugin Name: WooCommerce Tier and Package Prices
|
||||
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
|
||||
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
|
||||
* Version: 1.3.0
|
||||
* Version: 1.3.1
|
||||
* Author: Marco Graetsch
|
||||
* Author URI: https://src.bundespruefstelle.ch/magdev
|
||||
* Text Domain: wc-tier-package-prices
|
||||
@@ -46,7 +46,7 @@ if (!function_exists('wc_tpp_php_version_notice')) {
|
||||
|
||||
// Define plugin constants
|
||||
if (!defined('WC_TPP_VERSION')) {
|
||||
define('WC_TPP_VERSION', '1.3.0');
|
||||
define('WC_TPP_VERSION', '1.3.1');
|
||||
}
|
||||
if (!defined('WC_TPP_PLUGIN_DIR')) {
|
||||
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));
|
||||
|
||||
Reference in New Issue
Block a user