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(); + ?> + + + + + +
+ render_update_status_html($available_version); ?> +
+

+ + +

+ + + ' . esc_html__('Current Version:', 'wc-tier-package-prices') . ' ' . esc_html(WC_TPP_VERSION) . '

'; + + if ($available_version) { + echo '

' . 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(); }