diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f2cc61..262f780 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,63 @@ 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.4.1] - 2026-02-03
+
+### Added
+
+- **Localhost License Bypass**: License validation is automatically bypassed for localhost environments
+ - Supports localhost, 127.0.0.1, ::1 (IPv6), `*.localhost`, `*.local`, `*.test`, `*.example`, `*.invalid`
+ - Private IP ranges (Docker, VMs) are also recognized as localhost
+ - Displays "(Localhost environment - license validation bypassed)" in License Status
+
+- **Self-Licensing Bypass**: License validation is bypassed when the site URL matches the license server URL
+ - Useful for testing the plugin on the license server itself
+ - Displays "(Self-licensing server - license validation bypassed)" in License Status
+
+- **Auto-Update System**: Plugin can now receive updates directly from the license server
+ - New "Auto-Updates" settings tab under WooCommerce > Tier & Package Prices
+ - **Enable Update Notifications**: Toggle to check for available updates (default: enabled)
+ - **Automatically Install Updates**: Optional auto-install when WordPress performs background updates
+ - **Check Frequency**: Configurable hours between update checks (1-168 hours, default: 12)
+ - **Update Status**: Shows current version and available update with "Check for Updates" button
+ - Updates appear in WordPress Dashboard > Updates with full plugin info
+
+- **New Classes**:
+ - `WC_TPP_License_Checker`: Singleton class handling license validation with localhost/self-licensing bypass
+ - `WC_TPP_Update_Checker`: Singleton class integrating with WordPress plugin update system
+
+### Technical Details
+
+**License Checker Features**:
+
+- `is_localhost()`: Detects localhost environments using multiple patterns
+- `is_self_licensing()`: Compares license server URL with site URL
+- `is_license_valid()`: Main entry point with bypass logic
+- `get_bypass_reason()`: Returns 'localhost', 'self_licensing', or null
+- Cached validation (1 hour success, 5 minutes error)
+
+**Update Checker Features**:
+
+- Hooks into `pre_set_site_transient_update_plugins` for update detection
+- Hooks into `plugins_api` for update modal information
+- Hooks into `http_request_args` for license authentication
+- Hooks into `auto_update_plugin` for background updates
+- Can be disabled via `WC_TPP_DISABLE_AUTO_UPDATE` constant
+
+**New Settings Options**:
+
+- `wc_tpp_update_notification_enabled` (yes/no, default: yes)
+- `wc_tpp_auto_install_enabled` (yes/no, default: no)
+- `wc_tpp_update_check_frequency` (number, default: 12)
+
+**Update Server Endpoint**:
+
+- POST to `/wp-json/wc-licensed-product/v1/update-check`
+- Request body: `{license_key, domain, plugin_slug, current_version}`
+- Response: `{success, update_available, version, download_url, ...}`
+
+---
+
## [1.4.0] - 2026-01-29
### Added
diff --git a/CLAUDE.md b/CLAUDE.md
index 7b80416..34c15a1 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,7 +1,7 @@
# WooCommerce Tier and Package Prices - AI Context Document
-**Last Updated:** 2026-01-29
-**Current Version:** 1.4.0
+**Last Updated:** 2026-02-03
+**Current Version:** 1.4.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.4.1
+### Version 1.4.2
-- No planned changes yet
+- No planned features yet
## Technical Stack
@@ -1270,6 +1270,57 @@ The plugin architecture is solid and well-tested. Most bugs arise from:
- Uses `actions/checkout@v4` with `submodules: recursive`
- Modeled after working wp-fedistream implementation
+### v1.4.1 Release Session (2026-02-03)
+
+**Accomplished:**
+
+1. Implemented localhost license bypass:
+ - Created `WC_TPP_License_Checker` class (singleton pattern)
+ - `is_localhost()` detects localhost environments: localhost, 127.0.0.1, ::1, `*.localhost`, `*.local`, `*.test`, `*.example`, `*.invalid`, and private IP ranges
+ - `is_self_licensing()` compares license server URL with site URL
+ - `is_license_valid()` returns true for localhost/self-licensing without server check
+ - Updated license status display to show bypass reason
+
+2. Implemented auto-update system:
+ - Created `WC_TPP_Update_Checker` class (singleton pattern)
+ - Hooks into WordPress plugin update system (`pre_set_site_transient_update_plugins`, `plugins_api`, `http_request_args`, `auto_update_plugin`)
+ - Fetches update info from license server API endpoint
+ - Supports auto-install when WordPress performs background updates
+ - Configurable check frequency (1-168 hours)
+
+3. Added Auto-Updates settings tab:
+ - Enable Update Notifications (checkbox, default: yes)
+ - Automatically Install Updates (checkbox, default: no, requires valid license)
+ - Check Frequency in Hours (number, default: 12)
+ - Update Status display with "Check for Updates" button
+ - AJAX handler for manual update checks
+
+4. Updated all translation files:
+ - Added 23 new translation strings for v1.4.1
+ - All 7 language variants updated (de_DE, de_DE_informal, de_CH, de_CH_informal, fr_CH, it_CH, en_US)
+ - Compiled all .mo files
+
+**Key Implementation Details:**
+
+- License checker uses 1-hour cache for successful validation, 5-minute cache for errors
+- Update checker respects `WC_TPP_DISABLE_AUTO_UPDATE` constant to disable updates
+- Update server endpoint: `POST /wp-json/wc-licensed-product/v1/update-check`
+- Both new classes are instantiated in main plugin's `includes()` method
+- Auto-install requires valid license (disabled when no license active)
+
+**New Files:**
+
+- `includes/class-wc-tpp-license-checker.php`
+- `includes/class-wc-tpp-update-checker.php`
+
+**Modified Files:**
+
+- `wc-tier-and-package-prices.php` - Version bump, include new classes
+- `includes/class-wc-tpp-settings.php` - Added Auto-Updates tab, updated license status display
+- All translation files (.pot, .po, .mo)
+- `CHANGELOG.md` - v1.4.1 release notes
+- `CLAUDE.md` - Updated version and session history
+
---
Always refer to this document when starting work on this project. Good luck!
diff --git a/includes/class-wc-tpp-license-checker.php b/includes/class-wc-tpp-license-checker.php
new file mode 100644
index 0000000..0a8e69e
--- /dev/null
+++ b/includes/class-wc-tpp-license-checker.php
@@ -0,0 +1,333 @@
+get_current_domain();
+
+ // Remove port number if present
+ $domain = preg_replace('/:[\d]+$/', '', $domain);
+ $domain = strtolower($domain);
+
+ // Check exact matches
+ if (in_array($domain, self::LOCALHOST_HOSTS, true)) {
+ return true;
+ }
+
+ // Check TLD patterns
+ foreach (self::LOCALHOST_TLDS as $tld) {
+ if (str_ends_with($domain, $tld)) {
+ return true;
+ }
+ }
+
+ // Check for private IP ranges (Docker, VMs, etc.)
+ if ($this->is_private_ip($domain)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Check if domain is a private IP address
+ *
+ * @param string $domain The domain to check.
+ * @return bool
+ */
+ private function is_private_ip(string $domain): bool {
+ // Check if it's a valid IP first
+ if (!filter_var($domain, FILTER_VALIDATE_IP)) {
+ return false;
+ }
+
+ // Check for private/reserved ranges
+ return !filter_var(
+ $domain,
+ FILTER_VALIDATE_IP,
+ FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
+ );
+ }
+
+ /**
+ * Check if the current site is self-licensing
+ *
+ * Returns true if the license server URL and site URL are on the same domain.
+ * This allows the license server itself to use the plugin without a license.
+ *
+ * @return bool
+ */
+ public function is_self_licensing(): bool {
+ $server_url = get_option('wc_tpp_license_server_url', '');
+
+ if (empty($server_url)) {
+ return false;
+ }
+
+ $server_domain = $this->normalize_domain($server_url);
+ $site_domain = $this->normalize_domain(get_site_url());
+
+ return $server_domain === $site_domain;
+ }
+
+ /**
+ * Normalize a URL to its domain
+ *
+ * @param string $url The URL to normalize.
+ * @return string
+ */
+ private function normalize_domain(string $url): string {
+ $parsed = wp_parse_url($url);
+ $host = $parsed['host'] ?? '';
+
+ // Convert to lowercase
+ $host = strtolower($host);
+
+ // Remove www. prefix
+ $host = preg_replace('/^www\./', '', $host);
+
+ return $host;
+ }
+
+ /**
+ * Get current domain from site URL
+ *
+ * @return string
+ */
+ public function get_current_domain(): string {
+ $site_url = get_site_url();
+ $parsed = wp_parse_url($site_url);
+ $host = $parsed['host'] ?? 'localhost';
+
+ // Include port if non-standard
+ if (isset($parsed['port'])) {
+ $host .= ':' . $parsed['port'];
+ }
+
+ return strtolower($host);
+ }
+
+ /**
+ * Check if the license is valid
+ *
+ * This is the main entry point for license validation.
+ * It implements the bypass logic for localhost and self-licensing.
+ *
+ * @return bool
+ */
+ public function is_license_valid(): bool {
+ // Always valid on localhost
+ if ($this->is_localhost()) {
+ return true;
+ }
+
+ // Always valid for self-licensing
+ if ($this->is_self_licensing()) {
+ return true;
+ }
+
+ // Check cached status
+ $cached = $this->get_cached_status();
+ if (false !== $cached) {
+ return !empty($cached['valid']);
+ }
+
+ // Validate against server
+ return $this->validate_license();
+ }
+
+ /**
+ * Get the license bypass reason if applicable
+ *
+ * @return string|null 'localhost', 'self_licensing', or null
+ */
+ public function get_bypass_reason(): ?string {
+ if ($this->is_localhost()) {
+ return 'localhost';
+ }
+
+ if ($this->is_self_licensing()) {
+ return 'self_licensing';
+ }
+
+ return null;
+ }
+
+ /**
+ * Get cached license status
+ *
+ * @return array|false
+ */
+ public function get_cached_status() {
+ return get_transient(self::CACHE_KEY);
+ }
+
+ /**
+ * Validate license against the server
+ *
+ * @return bool
+ */
+ private function validate_license(): bool {
+ $license_key = get_option('wc_tpp_license_key', '');
+ $server_url = get_option('wc_tpp_license_server_url', '');
+ $server_secret = get_option('wc_tpp_license_server_secret', '');
+
+ // Can't validate without credentials
+ if (empty($license_key) || empty($server_url) || empty($server_secret)) {
+ return false;
+ }
+
+ try {
+ $client = $this->get_license_client($server_url, $server_secret);
+ $domain = $this->get_current_domain();
+
+ // Remove port for validation
+ $domain = preg_replace('/:[\d]+$/', '', $domain);
+
+ $result = $client->validate($license_key, $domain);
+
+ // Cache successful validation
+ set_transient(self::CACHE_KEY, array(
+ 'valid' => true,
+ 'product_id' => $result->productId,
+ 'expires_at' => $result->expiresAt?->format('Y-m-d H:i:s'),
+ 'is_lifetime' => $result->isLifetime(),
+ 'checked_at' => current_time('mysql'),
+ ), self::CACHE_TTL_SUCCESS);
+
+ return true;
+
+ } catch (\Exception $e) {
+ // Cache validation failure
+ set_transient(self::CACHE_KEY, array(
+ 'valid' => false,
+ 'error' => $e->getMessage(),
+ 'checked_at' => current_time('mysql'),
+ ), self::CACHE_TTL_ERROR);
+
+ return false;
+ }
+ }
+
+ /**
+ * Get license client instance
+ *
+ * @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, string $server_secret): \Magdev\WcLicensedProductClient\LicenseClientInterface {
+ $httpClient = \Symfony\Component\HttpClient\HttpClient::create();
+ return new \Magdev\WcLicensedProductClient\SecureLicenseClient(
+ httpClient: $httpClient,
+ baseUrl: $server_url,
+ serverSecret: $server_secret,
+ );
+ }
+
+ /**
+ * Clear the license cache
+ */
+ public function clear_cache(): void {
+ delete_transient(self::CACHE_KEY);
+ }
+
+ /**
+ * Force revalidation of the license
+ *
+ * @return bool
+ */
+ public function revalidate(): bool {
+ $this->clear_cache();
+ return $this->is_license_valid();
+ }
+ }
+}
diff --git a/includes/class-wc-tpp-settings.php b/includes/class-wc-tpp-settings.php
index 6783ab4..5600795 100755
--- a/includes/class-wc-tpp-settings.php
+++ b/includes/class-wc-tpp-settings.php
@@ -33,6 +33,9 @@ if (!class_exists('WC_TPP_Settings')) {
// Add AJAX handlers for license validation
add_action('wp_ajax_wc_tpp_validate_license', array($this, 'ajax_validate_license'));
add_action('wp_ajax_wc_tpp_activate_license', array($this, 'ajax_activate_license'));
+
+ // Add AJAX handler for update checks
+ add_action('wp_ajax_wc_tpp_check_updates', array($this, 'ajax_check_updates'));
}
/**
@@ -44,6 +47,7 @@ if (!class_exists('WC_TPP_Settings')) {
return array(
'' => __('General', 'wc-tier-package-prices'),
'license' => __('License', 'wc-tier-package-prices'),
+ 'updates' => __('Auto-Updates', 'wc-tier-package-prices'),
);
}
@@ -177,6 +181,75 @@ if (!class_exists('WC_TPP_Settings')) {
);
}
+ /**
+ * Get settings for the Auto-Updates section
+ *
+ * @return array
+ */
+ protected function get_settings_for_updates_section() {
+ // Check if auto-install is available (requires valid license or bypass)
+ $license_checker = WC_TPP_License_Checker::get_instance();
+ $auto_install_disabled = !$license_checker->is_license_valid();
+ $auto_install_desc = __('Automatically install updates when available.', 'wc-tier-package-prices');
+
+ if ($auto_install_disabled) {
+ $auto_install_desc .= ' ' . __('(Requires a valid license)', 'wc-tier-package-prices');
+ }
+
+ return array(
+ array(
+ 'title' => __('Auto-Update Settings', 'wc-tier-package-prices'),
+ 'type' => 'title',
+ 'desc' => __('Configure automatic plugin updates from the license server.', 'wc-tier-package-prices'),
+ 'id' => 'wc_tpp_update_settings',
+ ),
+
+ array(
+ 'title' => __('Enable Update Notifications', 'wc-tier-package-prices'),
+ 'desc' => __('Check for available plugin updates.', 'wc-tier-package-prices'),
+ 'id' => 'wc_tpp_update_notification_enabled',
+ 'default' => 'yes',
+ 'type' => 'checkbox',
+ 'desc_tip' => __('When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin.', 'wc-tier-package-prices'),
+ ),
+
+ array(
+ 'title' => __('Automatically Install Updates', 'wc-tier-package-prices'),
+ 'desc' => $auto_install_desc,
+ 'id' => 'wc_tpp_auto_install_enabled',
+ 'default' => 'no',
+ 'type' => 'checkbox',
+ 'desc_tip' => __('When enabled, updates will be automatically installed when WordPress performs background updates.', 'wc-tier-package-prices'),
+ 'custom_attributes' => $auto_install_disabled ? array('disabled' => 'disabled') : array(),
+ ),
+
+ array(
+ 'title' => __('Check Frequency (Hours)', 'wc-tier-package-prices'),
+ 'desc' => __('How often to check for updates.', 'wc-tier-package-prices'),
+ 'id' => 'wc_tpp_update_check_frequency',
+ 'default' => '12',
+ 'type' => 'number',
+ 'css' => 'width: 80px;',
+ 'desc_tip' => __('Number of hours between update checks. Default is 12 hours.', 'wc-tier-package-prices'),
+ 'custom_attributes' => array(
+ 'min' => '1',
+ 'max' => '168',
+ ),
+ ),
+
+ array(
+ 'title' => __('Update Status', 'wc-tier-package-prices'),
+ 'type' => 'wc_tpp_update_status',
+ 'id' => 'wc_tpp_update_status_display',
+ ),
+
+ array(
+ 'type' => 'sectionend',
+ 'id' => 'wc_tpp_update_settings',
+ ),
+ );
+ }
+
/**
* Get cached license status
*
@@ -368,8 +441,9 @@ if (!class_exists('WC_TPP_Settings')) {
public function output() {
global $current_section;
- // Register custom field type for license status display
+ // Register custom field types
add_action('woocommerce_admin_field_wc_tpp_license_status', array($this, 'output_license_status_field'));
+ add_action('woocommerce_admin_field_wc_tpp_update_status', array($this, 'output_update_status_field'));
parent::output();
@@ -377,6 +451,11 @@ if (!class_exists('WC_TPP_Settings')) {
if ('license' === $current_section) {
$this->output_license_scripts();
}
+
+ // Add JavaScript for updates section
+ if ('updates' === $current_section) {
+ $this->output_updates_scripts();
+ }
}
/**
@@ -415,6 +494,20 @@ if (!class_exists('WC_TPP_Settings')) {
* @param array|false $status License status data.
*/
private function render_license_status_html($status) {
+ // Check for license bypass
+ $license_checker = WC_TPP_License_Checker::get_instance();
+ $bypass_reason = $license_checker->get_bypass_reason();
+
+ if ($bypass_reason) {
+ echo '' . esc_html__('License Active', 'wc-tier-package-prices') . '';
+ if ('localhost' === $bypass_reason) {
+ echo '
' . esc_html__('(Localhost environment - license validation bypassed)', 'wc-tier-package-prices') . '';
+ } elseif ('self_licensing' === $bypass_reason) {
+ echo '
' . esc_html__('(Self-licensing server - license validation bypassed)', 'wc-tier-package-prices') . '';
+ }
+ return;
+ }
+
if (empty($status)) {
echo '' . esc_html__('No license activated', 'wc-tier-package-prices') . '';
return;
@@ -443,6 +536,50 @@ if (!class_exists('WC_TPP_Settings')) {
}
}
+ /**
+ * Output update status custom field
+ *
+ * @param array $value Field configuration.
+ */
+ public function output_update_status_field($value) {
+ $update_checker = WC_TPP_Update_Checker::get_instance();
+ $available_version = $update_checker->get_available_version();
+ ?>
+
+ + +
+' . esc_html__('Update Available:', 'wc-tier-package-prices') . ' ' . esc_html($available_version) . '
'; + echo '' . esc_html__('Update Now', 'wc-tier-package-prices') . '
'; + } else { + echo '' . esc_html__('You are running the latest version.', 'wc-tier-package-prices') . '
'; + } + } + /** * Output JavaScript for license management */ @@ -525,5 +662,87 @@ if (!class_exists('WC_TPP_Settings')) { __('Permission denied.', 'wc-tier-package-prices'))); + } + + $update_checker = WC_TPP_Update_Checker::get_instance(); + $update_info = $update_checker->force_check(); + + if ($update_info && !empty($update_info['update_available'])) { + wp_send_json_success(array( + 'message' => sprintf( + /* translators: %s: Version number */ + __('Update available: version %s', 'wc-tier-package-prices'), + $update_info['version'] + ), + 'update_available' => true, + 'version' => $update_info['version'], + 'current_version' => WC_TPP_VERSION, + )); + } else { + wp_send_json_success(array( + 'message' => __('You are running the latest version.', 'wc-tier-package-prices'), + 'update_available' => false, + 'current_version' => WC_TPP_VERSION, + )); + } + } + + /** + * Output JavaScript for update management + */ + private function output_updates_scripts() { + $nonce = wp_create_nonce('wc_tpp_update_nonce'); + ?> + + is_disabled()) { + return; + } + + $this->register_hooks(); + } + + /** + * Check if auto-updates are disabled via constant + * + * @return bool + */ + private function is_disabled(): bool { + return defined('WC_TPP_DISABLE_AUTO_UPDATE') && WC_TPP_DISABLE_AUTO_UPDATE; + } + + /** + * Register WordPress hooks + */ + private function register_hooks(): void { + // Check for updates + add_filter('pre_set_site_transient_update_plugins', array($this, 'check_for_updates')); + + // Provide plugin information for update modal + add_filter('plugins_api', array($this, 'get_plugin_info'), 10, 3); + + // Add authentication headers to download requests + add_filter('http_request_args', array($this, 'add_auth_headers'), 10, 2); + + // Handle auto-install setting + add_filter('auto_update_plugin', array($this, 'handle_auto_install'), 10, 2); + + // Clear cache when settings change + add_action('update_option_wc_tpp_license_key', array($this, 'clear_cache')); + add_action('update_option_wc_tpp_license_server_url', array($this, 'clear_cache')); + add_action('update_option_wc_tpp_update_notification_enabled', array($this, 'clear_cache')); + } + + /** + * Check if update notifications are enabled + * + * @return bool + */ + public static function is_update_notification_enabled(): bool { + return get_option('wc_tpp_update_notification_enabled', 'yes') === 'yes'; + } + + /** + * Check if auto-install is enabled + * + * @return bool + */ + public static function is_auto_install_enabled(): bool { + return get_option('wc_tpp_auto_install_enabled', 'no') === 'yes'; + } + + /** + * Get update check frequency in hours + * + * @return int + */ + public static function get_check_frequency(): int { + $frequency = (int) get_option('wc_tpp_update_check_frequency', self::DEFAULT_CHECK_FREQUENCY); + return max(1, min(168, $frequency)); // Clamp between 1 and 168 hours + } + + /** + * Check for plugin updates + * + * @param object $transient WordPress update transient. + * @return object + */ + public function check_for_updates($transient) { + if (empty($transient->checked)) { + return $transient; + } + + // Skip if notifications disabled + if (!self::is_update_notification_enabled()) { + return $transient; + } + + // Get update info (cached) + $update_info = $this->get_update_info(); + + if (empty($update_info) || !$update_info['update_available']) { + return $transient; + } + + // Build update object + $update_obj = $this->build_update_object($update_info); + + if ($update_obj) { + $transient->response[WC_TPP_PLUGIN_BASENAME] = $update_obj; + } + + return $transient; + } + + /** + * Get plugin information for update modal + * + * @param false|object|array $result The result object or array. + * @param string $action The type of information being requested. + * @param object $args Plugin API arguments. + * @return false|object + */ + public function get_plugin_info($result, $action, $args) { + if ('plugin_information' !== $action) { + return $result; + } + + if (!isset($args->slug) || self::PLUGIN_SLUG !== $args->slug) { + return $result; + } + + // Get update info + $update_info = $this->get_update_info(true); // Force fetch for full info + + if (empty($update_info)) { + return $result; + } + + // Build plugin info object + return $this->build_plugin_info_object($update_info); + } + + /** + * Add authentication headers to download requests + * + * @param array $args HTTP request arguments. + * @param string $url The request URL. + * @return array + */ + public function add_auth_headers(array $args, string $url): array { + $server_url = get_option('wc_tpp_license_server_url', ''); + + // Only add headers for requests to our license server + if (empty($server_url) || strpos($url, $server_url) !== 0) { + return $args; + } + + $license_key = get_option('wc_tpp_license_key', ''); + + if (!empty($license_key)) { + $args['headers']['X-License-Key'] = $license_key; + } + + return $args; + } + + /** + * Handle auto-install setting + * + * @param bool|null $update Whether to auto-update. + * @param object $item The plugin update object. + * @return bool|null + */ + public function handle_auto_install($update, $item) { + // Check if this is our plugin + if (!isset($item->plugin) || WC_TPP_PLUGIN_BASENAME !== $item->plugin) { + return $update; + } + + // Return our setting, or default behavior + if (self::is_auto_install_enabled()) { + return true; + } + + return $update; + } + + /** + * Get update info from cache or server + * + * @param bool $force_fetch Force fetching from server. + * @return array|null + */ + private function get_update_info(bool $force_fetch = false): ?array { + // Check cache first + if (!$force_fetch) { + $cached = get_transient(self::CACHE_KEY); + if (false !== $cached) { + return $cached; + } + } + + // Fetch from server + $update_info = $this->fetch_update_info(); + + if ($update_info) { + // Cache the result + $cache_ttl = self::get_check_frequency() * HOUR_IN_SECONDS; + set_transient(self::CACHE_KEY, $update_info, $cache_ttl); + } + + return $update_info; + } + + /** + * Fetch update info from license server + * + * @return array|null + */ + private function fetch_update_info(): ?array { + $server_url = get_option('wc_tpp_license_server_url', ''); + $license_key = get_option('wc_tpp_license_key', ''); + $server_secret = get_option('wc_tpp_license_server_secret', ''); + + if (empty($server_url)) { + return null; + } + + // Build the update check endpoint + $endpoint = trailingslashit($server_url) . 'wp-json/wc-licensed-product/v1/update-check'; + + // Get license checker for domain + $license_checker = WC_TPP_License_Checker::get_instance(); + $domain = $license_checker->get_current_domain(); + + // Remove port for API call + $domain = preg_replace('/:[\d]+$/', '', $domain); + + // Prepare request body + $body = array( + 'license_key' => $license_key, + 'domain' => $domain, + 'plugin_slug' => self::PLUGIN_SLUG, + 'current_version' => WC_TPP_VERSION, + ); + + // Make the request + $response = wp_remote_post($endpoint, array( + 'timeout' => 15, + 'headers' => array( + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ), + 'body' => wp_json_encode($body), + )); + + if (is_wp_error($response)) { + return null; + } + + $response_code = wp_remote_retrieve_response_code($response); + + // Handle rate limiting + if (429 === $response_code) { + return null; + } + + // Handle other errors + if ($response_code < 200 || $response_code >= 300) { + return null; + } + + $body = wp_remote_retrieve_body($response); + $data = json_decode($body, true); + + if (empty($data) || !isset($data['success'])) { + return null; + } + + return $data; + } + + /** + * Build WordPress update object + * + * @param array $update_info Update information from server. + * @return object|null + */ + private function build_update_object(array $update_info): ?object { + if (empty($update_info['version'])) { + return null; + } + + // Check if update is actually available + if (version_compare(WC_TPP_VERSION, $update_info['version'], '>=')) { + return null; + } + + $obj = new \stdClass(); + $obj->id = $update_info['id'] ?? self::PLUGIN_SLUG; + $obj->slug = $update_info['slug'] ?? self::PLUGIN_SLUG; + $obj->plugin = $update_info['plugin'] ?? WC_TPP_PLUGIN_BASENAME; + $obj->new_version = $update_info['version']; + $obj->url = $update_info['url'] ?? ''; + $obj->package = $update_info['download_url'] ?? $update_info['package'] ?? ''; + $obj->tested = $update_info['tested'] ?? ''; + $obj->requires = $update_info['requires'] ?? '6.0'; + $obj->requires_php = $update_info['requires_php'] ?? '8.3'; + + // Icons + if (!empty($update_info['icons'])) { + $obj->icons = $update_info['icons']; + } + + // Banners + if (!empty($update_info['banners'])) { + $obj->banners = $update_info['banners']; + } + + return $obj; + } + + /** + * Build plugin info object for update modal + * + * @param array $update_info Update information from server. + * @return object + */ + private function build_plugin_info_object(array $update_info): object { + $obj = new \stdClass(); + + $obj->name = $update_info['name'] ?? 'WooCommerce Tier and Package Prices'; + $obj->slug = $update_info['slug'] ?? self::PLUGIN_SLUG; + $obj->version = $update_info['version'] ?? WC_TPP_VERSION; + $obj->author = $update_info['author'] ?? 'Marco Graetsch'; + $obj->author_profile = $update_info['author_profile'] ?? 'https://src.bundespruefstelle.ch/magdev'; + $obj->homepage = $update_info['homepage'] ?? $update_info['url'] ?? ''; + $obj->requires = $update_info['requires'] ?? '6.0'; + $obj->tested = $update_info['tested'] ?? ''; + $obj->requires_php = $update_info['requires_php'] ?? '8.3'; + $obj->last_updated = $update_info['last_updated'] ?? ''; + $obj->download_link = $update_info['download_url'] ?? $update_info['package'] ?? ''; + + // Sections (description, changelog, etc.) + $obj->sections = array(); + + if (!empty($update_info['sections']['description'])) { + $obj->sections['description'] = $update_info['sections']['description']; + } else { + $obj->sections['description'] = __('Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices.', 'wc-tier-package-prices'); + } + + if (!empty($update_info['sections']['changelog'])) { + $obj->sections['changelog'] = $update_info['sections']['changelog']; + } elseif (!empty($update_info['changelog'])) { + $obj->sections['changelog'] = $update_info['changelog']; + } + + if (!empty($update_info['sections']['installation'])) { + $obj->sections['installation'] = $update_info['sections']['installation']; + } + + // Icons + if (!empty($update_info['icons'])) { + $obj->icons = $update_info['icons']; + } + + // Banners + if (!empty($update_info['banners'])) { + $obj->banners = $update_info['banners']; + } + + return $obj; + } + + /** + * Clear update cache + */ + public function clear_cache(): void { + delete_transient(self::CACHE_KEY); + + // Also clear WordPress plugin update transient to force recheck + delete_site_transient('update_plugins'); + } + + /** + * Force check for updates + * + * @return array|null + */ + public function force_check(): ?array { + $this->clear_cache(); + return $this->get_update_info(true); + } + + /** + * Get the available update version if any + * + * @return string|null + */ + public function get_available_version(): ?string { + $update_info = $this->get_update_info(); + + if (empty($update_info) || empty($update_info['version'])) { + return null; + } + + // Check if it's actually newer + if (version_compare(WC_TPP_VERSION, $update_info['version'], '>=')) { + return null; + } + + return $update_info['version']; + } + + /** + * Check if an update is available + * + * @return bool + */ + public function is_update_available(): bool { + return null !== $this->get_available_version(); + } + } +} diff --git a/languages/wc-tier-package-prices-de_CH.mo b/languages/wc-tier-package-prices-de_CH.mo index 2897606..460f8b9 100644 Binary files a/languages/wc-tier-package-prices-de_CH.mo and b/languages/wc-tier-package-prices-de_CH.mo differ diff --git a/languages/wc-tier-package-prices-de_CH.po b/languages/wc-tier-package-prices-de_CH.po index a61bc70..2a278b0 100644 --- a/languages/wc-tier-package-prices-de_CH.po +++ b/languages/wc-tier-package-prices-de_CH.po @@ -1,12 +1,12 @@ # German (Switzerland) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: German (Switzerland)\n" "Language: de_CH\n" @@ -398,3 +398,98 @@ msgstr "Aktivierung fehlgeschlagen." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Anfrage fehlgeschlagen. Bitte versuchen Sie es erneut." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Auto-Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Auto-Update Einstellungen" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Konfigurieren Sie automatische Plugin-Updates vom Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Update-Benachrichtigungen aktivieren" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Nach verfügbaren Plugin-Updates suchen." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Wenn aktiviert, prüft das Plugin auf Updates vom Lizenzserver und zeigt Benachrichtigungen im WordPress-Admin an." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Updates automatisch installieren" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Updates automatisch installieren, wenn verfügbar." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Erfordert eine gültige Lizenz)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Wenn aktiviert, werden Updates automatisch installiert, wenn WordPress Hintergrund-Updates durchführt." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Prüfhäufigkeit (Stunden)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Wie oft nach Updates gesucht werden soll." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Anzahl der Stunden zwischen Update-Prüfungen. Standard ist 12 Stunden." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Update-Status" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Nach Updates suchen" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Aktuelle Version:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Update verfügbar:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Sie verwenden die neueste Version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Jetzt aktualisieren" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Update verfügbar: Version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Fehler beim Suchen nach Updates." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Localhost-Umgebung - Lizenzvalidierung übersprungen)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Selbstlizenzierender Server - Lizenzvalidierung übersprungen)" diff --git a/languages/wc-tier-package-prices-de_CH_informal.mo b/languages/wc-tier-package-prices-de_CH_informal.mo index 64b6c14..868dbca 100644 Binary files a/languages/wc-tier-package-prices-de_CH_informal.mo and b/languages/wc-tier-package-prices-de_CH_informal.mo differ diff --git a/languages/wc-tier-package-prices-de_CH_informal.po b/languages/wc-tier-package-prices-de_CH_informal.po index 82a4f29..55ba46a 100644 --- a/languages/wc-tier-package-prices-de_CH_informal.po +++ b/languages/wc-tier-package-prices-de_CH_informal.po @@ -1,12 +1,12 @@ # German (Switzerland, Informal) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: German (Switzerland)\n" "Language: de_CH_informal\n" @@ -398,3 +398,98 @@ msgstr "Aktivierung fehlgeschlagen." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Anfrage fehlgeschlagen. Bitte versuche es erneut." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Auto-Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Auto-Update Einstellungen" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Konfiguriere automatische Plugin-Updates vom Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Update-Benachrichtigungen aktivieren" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Nach verfügbaren Plugin-Updates suchen." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Wenn aktiviert, prüft das Plugin auf Updates vom Lizenzserver und zeigt Benachrichtigungen im WordPress-Admin an." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Updates automatisch installieren" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Updates automatisch installieren, wenn verfügbar." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Erfordert eine gültige Lizenz)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Wenn aktiviert, werden Updates automatisch installiert, wenn WordPress Hintergrund-Updates durchführt." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Prüfhäufigkeit (Stunden)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Wie oft nach Updates gesucht werden soll." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Anzahl der Stunden zwischen Update-Prüfungen. Standard ist 12 Stunden." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Update-Status" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Nach Updates suchen" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Aktuelle Version:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Update verfügbar:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Du verwendest die neueste Version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Jetzt aktualisieren" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Update verfügbar: Version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Fehler beim Suchen nach Updates." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Localhost-Umgebung - Lizenzvalidierung übersprungen)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Selbstlizenzierender Server - Lizenzvalidierung übersprungen)" diff --git a/languages/wc-tier-package-prices-de_DE.mo b/languages/wc-tier-package-prices-de_DE.mo index 39a2868..0e6c7e8 100644 Binary files a/languages/wc-tier-package-prices-de_DE.mo and b/languages/wc-tier-package-prices-de_DE.mo differ diff --git a/languages/wc-tier-package-prices-de_DE.po b/languages/wc-tier-package-prices-de_DE.po index ee2d551..4490949 100644 --- a/languages/wc-tier-package-prices-de_DE.po +++ b/languages/wc-tier-package-prices-de_DE.po @@ -1,12 +1,12 @@ # German (Germany) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: German\n" "Language: de_DE\n" @@ -398,3 +398,98 @@ msgstr "Aktivierung fehlgeschlagen." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Anfrage fehlgeschlagen. Bitte versuchen Sie es erneut." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Auto-Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Auto-Update Einstellungen" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Konfigurieren Sie automatische Plugin-Updates vom Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Update-Benachrichtigungen aktivieren" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Nach verfügbaren Plugin-Updates suchen." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Wenn aktiviert, prüft das Plugin auf Updates vom Lizenzserver und zeigt Benachrichtigungen im WordPress-Admin an." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Updates automatisch installieren" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Updates automatisch installieren, wenn verfügbar." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Erfordert eine gültige Lizenz)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Wenn aktiviert, werden Updates automatisch installiert, wenn WordPress Hintergrund-Updates durchführt." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Prüfhäufigkeit (Stunden)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Wie oft nach Updates gesucht werden soll." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Anzahl der Stunden zwischen Update-Prüfungen. Standard ist 12 Stunden." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Update-Status" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Nach Updates suchen" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Aktuelle Version:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Update verfügbar:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Sie verwenden die neueste Version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Jetzt aktualisieren" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Update verfügbar: Version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Fehler beim Suchen nach Updates." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Localhost-Umgebung - Lizenzvalidierung übersprungen)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Selbstlizenzierender Server - Lizenzvalidierung übersprungen)" diff --git a/languages/wc-tier-package-prices-de_DE_informal.mo b/languages/wc-tier-package-prices-de_DE_informal.mo index b338813..ec27219 100644 Binary files a/languages/wc-tier-package-prices-de_DE_informal.mo and b/languages/wc-tier-package-prices-de_DE_informal.mo differ diff --git a/languages/wc-tier-package-prices-de_DE_informal.po b/languages/wc-tier-package-prices-de_DE_informal.po index 5b46e58..1e0fc28 100644 --- a/languages/wc-tier-package-prices-de_DE_informal.po +++ b/languages/wc-tier-package-prices-de_DE_informal.po @@ -1,12 +1,12 @@ # German (Germany, Informal) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: German (Germany)\n" "Language: de_DE_informal\n" @@ -398,3 +398,98 @@ msgstr "Aktivierung fehlgeschlagen." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Anfrage fehlgeschlagen. Bitte versuche es erneut." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Auto-Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Auto-Update Einstellungen" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Konfiguriere automatische Plugin-Updates vom Lizenzserver." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Update-Benachrichtigungen aktivieren" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Nach verfügbaren Plugin-Updates suchen." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Wenn aktiviert, prüft das Plugin auf Updates vom Lizenzserver und zeigt Benachrichtigungen im WordPress-Admin an." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Updates automatisch installieren" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Updates automatisch installieren, wenn verfügbar." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Erfordert eine gültige Lizenz)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Wenn aktiviert, werden Updates automatisch installiert, wenn WordPress Hintergrund-Updates durchführt." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Prüfhäufigkeit (Stunden)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Wie oft nach Updates gesucht werden soll." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Anzahl der Stunden zwischen Update-Prüfungen. Standard ist 12 Stunden." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Update-Status" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Nach Updates suchen" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Aktuelle Version:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Update verfügbar:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Du verwendest die neueste Version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Jetzt aktualisieren" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Update verfügbar: Version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Fehler beim Suchen nach Updates." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Localhost-Umgebung - Lizenzvalidierung übersprungen)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Selbstlizenzierender Server - Lizenzvalidierung übersprungen)" diff --git a/languages/wc-tier-package-prices-en_US.mo b/languages/wc-tier-package-prices-en_US.mo index 4628058..2cfb228 100644 Binary files a/languages/wc-tier-package-prices-en_US.mo and b/languages/wc-tier-package-prices-en_US.mo differ diff --git a/languages/wc-tier-package-prices-en_US.po b/languages/wc-tier-package-prices-en_US.po index 1ff2228..ae2f68c 100644 --- a/languages/wc-tier-package-prices-en_US.po +++ b/languages/wc-tier-package-prices-en_US.po @@ -1,12 +1,12 @@ # English (US) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: English\n" "Language: en_US\n" @@ -398,3 +398,98 @@ msgstr "Activation failed." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Request failed. Please try again." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Auto-Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Auto-Update Settings" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Configure automatic plugin updates from the license server." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Enable Update Notifications" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Check for available plugin updates." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Automatically Install Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Automatically install updates when available." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Requires a valid license)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "When enabled, updates will be automatically installed when WordPress performs background updates." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Check Frequency (Hours)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "How often to check for updates." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Number of hours between update checks. Default is 12 hours." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Update Status" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Check for Updates" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Current Version:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Update Available:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "You are running the latest version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Update Now" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Update available: version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Failed to check for updates." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Localhost environment - license validation bypassed)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Self-licensing server - license validation bypassed)" diff --git a/languages/wc-tier-package-prices-fr_CH.mo b/languages/wc-tier-package-prices-fr_CH.mo index b058265..2402f96 100644 Binary files a/languages/wc-tier-package-prices-fr_CH.mo and b/languages/wc-tier-package-prices-fr_CH.mo differ diff --git a/languages/wc-tier-package-prices-fr_CH.po b/languages/wc-tier-package-prices-fr_CH.po index 42dd529..f295c65 100644 --- a/languages/wc-tier-package-prices-fr_CH.po +++ b/languages/wc-tier-package-prices-fr_CH.po @@ -1,12 +1,12 @@ # French (Switzerland) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: French (Switzerland)\n" "Language: fr_CH\n" @@ -398,3 +398,98 @@ msgstr "L'activation a échoué." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "La requête a échoué. Veuillez réessayer." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Mises à jour automatiques" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Paramètres de mise à jour automatique" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Configurez les mises à jour automatiques du plugin depuis le serveur de licence." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Activer les notifications de mise à jour" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Rechercher les mises à jour disponibles du plugin." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Lorsque cette option est activée, le plugin vérifiera les mises à jour depuis le serveur de licence et affichera des notifications dans l'administration WordPress." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Installer automatiquement les mises à jour" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Installer automatiquement les mises à jour lorsqu'elles sont disponibles." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Nécessite une licence valide)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Lorsque cette option est activée, les mises à jour seront automatiquement installées lors des mises à jour en arrière-plan de WordPress." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Fréquence de vérification (heures)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Fréquence de recherche des mises à jour." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Nombre d'heures entre les vérifications de mise à jour. Par défaut: 12 heures." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Statut de mise à jour" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Rechercher des mises à jour" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Version actuelle:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Mise à jour disponible:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Vous utilisez la dernière version." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Mettre à jour maintenant" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Mise à jour disponible: version %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Échec de la recherche de mises à jour." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Environnement localhost - validation de licence ignorée)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Serveur auto-licencié - validation de licence ignorée)" diff --git a/languages/wc-tier-package-prices-it_CH.mo b/languages/wc-tier-package-prices-it_CH.mo index d9981a8..141fc65 100644 Binary files a/languages/wc-tier-package-prices-it_CH.mo and b/languages/wc-tier-package-prices-it_CH.mo differ diff --git a/languages/wc-tier-package-prices-it_CH.po b/languages/wc-tier-package-prices-it_CH.po index a9d9d83..273d5b3 100644 --- a/languages/wc-tier-package-prices-it_CH.po +++ b/languages/wc-tier-package-prices-it_CH.po @@ -1,12 +1,12 @@ # Italian (Switzerland) translation for WooCommerce Tier and Package Prices -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # 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.4.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" -"PO-Revision-Date: 2025-12-30 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" +"PO-Revision-Date: 2026-02-03 00:00+0000\n" "Last-Translator: Marco Graetsch\n" "Language-Team: Italian (Switzerland)\n" "Language: it_CH\n" @@ -398,3 +398,98 @@ msgstr "Attivazione fallita." #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "Richiesta fallita. Per favore riprova." + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "Aggiornamenti automatici" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "Impostazioni aggiornamento automatico" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "Configura gli aggiornamenti automatici del plugin dal server di licenza." + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "Abilita notifiche di aggiornamento" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "Verifica la disponibilità di aggiornamenti del plugin." + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "Se abilitato, il plugin verificherà la presenza di aggiornamenti dal server di licenza e mostrerà le notifiche nell'amministrazione WordPress." + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "Installa automaticamente gli aggiornamenti" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "Installa automaticamente gli aggiornamenti quando disponibili." + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "(Richiede una licenza valida)" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "Se abilitato, gli aggiornamenti verranno installati automaticamente quando WordPress esegue gli aggiornamenti in background." + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "Frequenza di controllo (ore)" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "Con quale frequenza controllare gli aggiornamenti." + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "Numero di ore tra i controlli degli aggiornamenti. Predefinito: 12 ore." + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "Stato aggiornamento" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "Verifica aggiornamenti" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "Versione attuale:" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "Aggiornamento disponibile:" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "Stai utilizzando l'ultima versione." + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "Aggiorna ora" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "Aggiornamento disponibile: versione %s" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "Impossibile verificare la presenza di aggiornamenti." + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "(Ambiente localhost - verifica della licenza saltata)" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "(Server auto-licenziato - verifica della licenza saltata)" diff --git a/languages/wc-tier-package-prices.pot b/languages/wc-tier-package-prices.pot index 7896ff5..2bd0c46 100644 --- a/languages/wc-tier-package-prices.pot +++ b/languages/wc-tier-package-prices.pot @@ -1,10 +1,10 @@ -# Copyright (C) 2025 Marco Graetsch +# Copyright (C) 2026 Marco Graetsch # This file is distributed under the GPL v2 or later. msgid "" msgstr "" -"Project-Id-Version: WooCommerce Tier and Package Prices 1.3.1\n" +"Project-Id-Version: WooCommerce Tier and Package Prices 1.4.1\n" "Report-Msgid-Bugs-To: https://src.bundespruefstelle.ch/wc-tier-package-prices\n" -"POT-Creation-Date: 2026-01-27 00:00+0000\n" +"POT-Creation-Date: 2026-02-03 00:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -371,3 +371,98 @@ msgstr "" #: includes/class-wc-tpp-settings.php msgid "Request failed. Please try again." msgstr "" + +#. v1.4.1 - Auto-Updates and License Bypass + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Updates" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Auto-Update Settings" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Configure automatic plugin updates from the license server." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Enable Update Notifications" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Check for available plugin updates." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, the plugin will check for updates from the license server and show notifications in the WordPress admin." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically Install Updates" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Automatically install updates when available." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "(Requires a valid license)" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "When enabled, updates will be automatically installed when WordPress performs background updates." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Check Frequency (Hours)" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "How often to check for updates." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Number of hours between update checks. Default is 12 hours." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Update Status" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Check for Updates" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Current Version:" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Update Available:" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "You are running the latest version." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Update Now" +msgstr "" + +#: includes/class-wc-tpp-settings.php +#. translators: %s: Version number +msgid "Update available: version %s" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "Failed to check for updates." +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "(Localhost environment - license validation bypassed)" +msgstr "" + +#: includes/class-wc-tpp-settings.php +msgid "(Self-licensing server - license validation bypassed)" +msgstr "" diff --git a/wc-tier-and-package-prices.php b/wc-tier-and-package-prices.php index b7de9ec..8d15f4e 100755 --- a/wc-tier-and-package-prices.php +++ b/wc-tier-and-package-prices.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.4.0 + * Version: 1.4.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.4.0'); + define('WC_TPP_VERSION', '1.4.1'); } if (!defined('WC_TPP_PLUGIN_DIR')) { define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__)); @@ -111,10 +111,18 @@ if (!class_exists('WC_Tier_Package_Prices')) { private function includes() { require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-template-loader.php'; + require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-license-checker.php'; + require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-update-checker.php'; require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-admin.php'; require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-product-meta.php'; require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-frontend.php'; require_once WC_TPP_PLUGIN_DIR . 'includes/class-wc-tpp-cart.php'; + + // Initialize license checker (singleton) + WC_TPP_License_Checker::get_instance(); + + // Initialize update checker (singleton) + WC_TPP_Update_Checker::get_instance(); } public function declare_hpos_compatibility() { @@ -132,6 +140,12 @@ if (!class_exists('WC_Tier_Package_Prices')) { add_option('wc_tpp_enable_tier_pricing', 'yes'); add_option('wc_tpp_enable_package_pricing', 'yes'); add_option('wc_tpp_display_table', 'yes'); + + // Add default auto-update options + add_option('wc_tpp_update_notification_enabled', 'yes'); + add_option('wc_tpp_auto_install_enabled', 'no'); + add_option('wc_tpp_update_check_frequency', '12'); + flush_rewrite_rules(); }