diff --git a/groq-ai-product-text.php b/groq-ai-product-text.php index bcbcfcb..a3ce9c9 100644 --- a/groq-ai-product-text.php +++ b/groq-ai-product-text.php @@ -2,7 +2,7 @@ /** * Plugin Name: SitiAI Product Teksten * Description: Genereer productteksten met diverse AI-aanbieders rechtstreeks vanuit WooCommerce. - * Version: 1.9.7 + * Version: 1.9.8 * Author: Roberto Guagliardo | SitiWeb * Author URI: https://sitiweb.nl/ * Text Domain: siti-ai-product-content-generator diff --git a/includes/SitiWebUpdater2.php b/includes/SitiWebUpdater2.php index 6a2d069..7756606 100644 --- a/includes/SitiWebUpdater2.php +++ b/includes/SitiWebUpdater2.php @@ -6,7 +6,8 @@ * Updates plugins via the Siti Plugin Repo API instead of GitHub * Fully self-contained with built-in license management */ -class SitiWebUpdater2 { +class SitiWebUpdater2 +{ private static $instances = array(); private static $global_settings_registered = false; @@ -22,180 +23,217 @@ class SitiWebUpdater2 { private $plugin_response; private $option_prefix; - public function __construct( $file ) { + public function __construct($file) + { $this->file = $file; - $this->option_prefix = 'siti_updater_' . sanitize_key( dirname( plugin_basename( $this->file ) ) ) . '_'; + $this->option_prefix = 'siti_updater_' . sanitize_key(dirname(plugin_basename($this->file))) . '_'; $this->set_plugin_properties(); // Register this instance globally - self::$instances[ $this->option_prefix ] = $this; + self::$instances[$this->option_prefix] = $this; - add_action( 'admin_init', array( $this, 'set_plugin_properties' ) ); - add_action( 'admin_notices', array( $this, 'admin_notices' ) ); - add_action( 'siti_updater_daily_check_' . $this->option_prefix, array( $this, 'daily_license_check' ) ); + add_action('admin_init', array($this, 'set_plugin_properties')); + add_action('admin_notices', array($this, 'admin_notices')); + add_action('siti_updater_daily_check_' . $this->option_prefix, array($this, 'daily_license_check')); - if ( ! wp_next_scheduled( 'siti_updater_daily_check_' . $this->option_prefix ) ) { - wp_schedule_event( time(), 'daily', 'siti_updater_daily_check_' . $this->option_prefix ); + if (!wp_next_scheduled('siti_updater_daily_check_' . $this->option_prefix)) { + wp_schedule_event(time(), 'daily', 'siti_updater_daily_check_' . $this->option_prefix); } return $this; } - public function initialize() { - add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_for_updates' ) ); - add_filter( 'plugins_api', array( $this, 'plugin_info' ), 10, 3 ); + public function initialize() + { + add_filter('pre_set_site_transient_update_plugins', array($this, 'check_for_updates')); + add_filter('plugins_api', array($this, 'plugin_info'), 10, 3); // Register global settings page only once - if ( ! self::$global_settings_registered ) { - add_action( 'admin_menu', array( $this, 'add_global_settings_page' ) ); + if (!self::$global_settings_registered) { + add_action('admin_menu', array($this, 'add_global_settings_page')); self::$global_settings_registered = true; } } - public function set_plugin_properties() { - if ( ! function_exists( 'get_plugin_data' ) ) { + public function set_plugin_properties() + { + if (!function_exists('get_plugin_data')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } - $this->plugin = get_plugin_data( $this->file, false, false ); - $this->basename = plugin_basename( $this->file ); - $this->active = is_plugin_active( $this->basename ); + $this->plugin = get_plugin_data($this->file, false, false); + $this->basename = plugin_basename($this->file); + $this->active = is_plugin_active($this->basename); } - public static function get_instances() { + public static function get_instances() + { return self::$instances; } - public function get_plugin_data() { + public function get_plugin_data() + { return $this->plugin; } - public function set_owner( $owner ) { + public function set_owner($owner) + { $this->owner = $owner; } - public function set_repository( $repository ) { + public function set_repository($repository) + { $this->repository = $repository; } - public function set_license_key( $key ) { - $sanitized_key = sanitize_text_field( (string) $key ); - $stored_key = get_option( $this->option_prefix . 'license_key', '' ); + public function set_license_key($key) + { + $sanitized_key = sanitize_text_field((string) $key); + $stored_key = get_option($this->option_prefix . 'license_key', ''); - if ( $stored_key !== $sanitized_key ) { + if ($stored_key !== $sanitized_key) { $this->clear_cached_license_data(); } $this->license_key = $sanitized_key; - update_option( $this->option_prefix . 'license_key', $sanitized_key ); + update_option($this->option_prefix . 'license_key', $sanitized_key); } - public function get_license_key() { - if ( null === $this->license_key ) { - $this->license_key = get_option( $this->option_prefix . 'license_key', '' ); + public function get_license_key() + { + if (null === $this->license_key) { + $this->license_key = get_option($this->option_prefix . 'license_key', ''); } return $this->license_key; } - public function get_license_data() { + public function get_license_data() + { return $this->get_stored_license_data(); } - public function set_api_base_url( $api_base_url ) { - $this->api_base_url = rtrim( (string) $api_base_url, '/' ); + public function set_api_base_url($api_base_url) + { + $this->api_base_url = rtrim((string) $api_base_url, '/'); } - private function get_stored_license_data() { - $data = get_option( $this->option_prefix . 'license_data', array() ); + private function normalize_version($version) + { + if (!is_string($version)) { + return $version; + } - return is_array( $data ) ? $data : array(); + $version = trim($version); + if ('' === $version) { + return $version; + } + + if (0 === stripos($version, 'v')) { + $version = ltrim($version, 'vV'); + } + + return $version; } - private function clear_cached_license_data() { - delete_option( $this->option_prefix . 'license_data' ); - delete_option( $this->option_prefix . 'last_check' ); + private function get_stored_license_data() + { + $data = get_option($this->option_prefix . 'license_data', array()); + + return is_array($data) ? $data : array(); } - private function store_license_data( $body ) { - if ( ! is_array( $body ) ) { + private function clear_cached_license_data() + { + delete_option($this->option_prefix . 'license_data'); + delete_option($this->option_prefix . 'last_check'); + } + + private function store_license_data($body) + { + if (!is_array($body)) { $body = array(); } $license_data = array(); - if ( isset( $body['license'] ) && is_array( $body['license'] ) ) { + if (isset($body['license']) && is_array($body['license'])) { $license_data = $body['license']; } - if ( empty( $license_data['key'] ) ) { + if (empty($license_data['key'])) { $license_data['key'] = $this->get_license_key(); } - $license_data['licenseValid'] = ! empty( $body['valid'] ); + $license_data['licenseValid'] = !empty($body['valid']); $version = null; - if ( isset( $body['pluginVersion'] ) && $body['pluginVersion'] ) { + if (isset($body['pluginVersion']) && $body['pluginVersion']) { $version = $body['pluginVersion']; - } elseif ( isset( $body['version'] ) && $body['version'] ) { + } elseif (isset($body['version']) && $body['version']) { $version = $body['version']; - } elseif ( isset( $license_data['pluginVersion'] ) && $license_data['pluginVersion'] ) { + } elseif (isset($license_data['pluginVersion']) && $license_data['pluginVersion']) { $version = $license_data['pluginVersion']; } - if ( $version ) { - $license_data['pluginVersion'] = $version; + if ($version) { + $license_data['pluginVersion'] = $this->normalize_version($version); } - update_option( $this->option_prefix . 'license_data', $license_data ); - update_option( $this->option_prefix . 'last_check', current_time( 'mysql' ) ); + update_option($this->option_prefix . 'license_data', $license_data); + update_option($this->option_prefix . 'last_check', current_time('mysql')); } - private function get_plugin_info() { - if ( is_null( $this->plugin_response ) ) { - $request_uri = sprintf( '%s/api/plugins/%s/%s', $this->api_base_url, $this->owner, $this->repository ); + private function get_plugin_info() + { + if (is_null($this->plugin_response)) { + $request_uri = sprintf('%s/api/plugins/%s/%s', $this->api_base_url, $this->owner, $this->repository); - $response = wp_remote_get( $request_uri, array( 'timeout' => 15 ) ); + $response = wp_remote_get($request_uri, array('timeout' => 15)); - if ( is_wp_error( $response ) ) { + if (is_wp_error($response)) { $this->plugin_response = false; return; } - $code = wp_remote_retrieve_response_code( $response ); - if ( 200 !== $code ) { + $code = wp_remote_retrieve_response_code($response); + if (200 !== $code) { $this->plugin_response = false; return; } - $body = json_decode( wp_remote_retrieve_body( $response ), true ); + $body = json_decode(wp_remote_retrieve_body($response), true); + if (is_array($body) && isset($body['version'])) { + $body['version'] = $this->normalize_version($body['version']); + } $this->plugin_response = $body; } } - public function check_for_updates( $transient ) { - if ( empty( $transient->checked ) ) { + public function check_for_updates($transient) + { + if (empty($transient->checked)) { return $transient; } $this->get_plugin_info(); - if ( false === $this->plugin_response || empty( $this->plugin_response['version'] ) ) { + if (false === $this->plugin_response || empty($this->plugin_response['version'])) { return $transient; } - $remote_version = $this->plugin_response['version']; - $current_version = $this->plugin['Version']; + $remote_version = $this->normalize_version($this->plugin_response['version']); + $current_version = $this->normalize_version($this->plugin['Version']); - if ( version_compare( $remote_version, $current_version, '>' ) ) { - $download_url = $this->get_download_url( 'latest' ); + if ($remote_version && version_compare($remote_version, $current_version, '>')) { + $download_url = $this->get_download_url('latest'); - if ( ! is_wp_error( $download_url ) ) { - $transient->response[ $this->basename ] = (object) array( - 'slug' => dirname( $this->basename ), + if (!is_wp_error($download_url)) { + $transient->response[$this->basename] = (object) array( + 'slug' => dirname($this->basename), 'new_version' => $remote_version, - 'package' => $download_url, - 'tested' => get_bloginfo( 'version' ), - 'url' => $this->plugin_response['homepage'] ?? '', + 'package' => $download_url, + 'tested' => get_bloginfo('version'), + 'url' => $this->plugin_response['homepage'] ?? '', ); } } @@ -203,187 +241,196 @@ class SitiWebUpdater2 { return $transient; } - public function plugin_info( $result, $action, $args ) { - if ( 'plugin_information' !== $action || $args->slug !== dirname( $this->basename ) ) { + public function plugin_info($result, $action, $args) + { + if ('plugin_information' !== $action || $args->slug !== dirname($this->basename)) { return $result; } $this->get_plugin_info(); - if ( false === $this->plugin_response ) { + if (false === $this->plugin_response) { return $result; } return (object) array( - 'name' => $this->plugin_response['name'] ?? $this->plugin['Name'], - 'slug' => $args->slug, - 'version' => $this->plugin_response['version'], - 'author' => $this->plugin_response['author'] ?? $this->plugin['Author'], + 'name' => $this->plugin_response['name'] ?? $this->plugin['Name'], + 'slug' => $args->slug, + 'version' => $this->normalize_version($this->plugin_response['version'] ?? $this->plugin['Version']), + 'author' => $this->plugin_response['author'] ?? $this->plugin['Author'], 'author_profile' => $this->plugin_response['author_url'] ?? $this->plugin['AuthorURI'], - 'homepage' => $this->plugin_response['homepage'] ?? '', - 'requires' => $this->plugin_response['requires'] ?? '', - 'tested' => $this->plugin_response['tested'] ?? get_bloginfo( 'version' ), - 'downloaded' => $this->plugin_response['downloads'] ?? 0, - 'last_updated' => $this->plugin_response['last_updated'] ?? '', - 'sections' => array( + 'homepage' => $this->plugin_response['homepage'] ?? '', + 'requires' => $this->plugin_response['requires'] ?? '', + 'tested' => $this->plugin_response['tested'] ?? get_bloginfo('version'), + 'downloaded' => $this->plugin_response['downloads'] ?? 0, + 'last_updated' => $this->plugin_response['last_updated'] ?? '', + 'sections' => array( 'description' => $this->plugin_response['description'] ?? $this->plugin['Description'], - 'changelog' => $this->plugin_response['changelog'] ?? '', + 'changelog' => $this->plugin_response['changelog'] ?? '', ), - 'download_link' => $this->get_download_url( 'latest' ), + 'download_link' => $this->get_download_url('latest'), ); } - private function get_download_url( $version = 'latest' ) { + private function get_download_url($version = 'latest') + { $license_key = $this->get_license_key(); - if ( empty( $license_key ) ) { - return new WP_Error( 'no_license', 'Geen licentie ingesteld' ); + if (empty($license_key)) { + return new WP_Error('no_license', 'Geen licentie ingesteld'); } - $hostname = parse_url( home_url(), PHP_URL_HOST ); - return $this->api_base_url . '/api/licenses/download?key=' . urlencode( $license_key ) . '&hostname=' . urlencode( $hostname ) . '&version=' . urlencode( $version ); + $hostname = parse_url(home_url(), PHP_URL_HOST); + return $this->api_base_url . '/api/licenses/download?key=' . urlencode($license_key) . '&hostname=' . urlencode($hostname) . '&version=' . urlencode($version); } - public function verify_license() { + public function verify_license() + { $license_key = $this->get_license_key(); - if ( empty( $license_key ) ) { - return new WP_Error( 'missing_license', 'Geen licentiecode ingesteld.' ); + if (empty($license_key)) { + return new WP_Error('missing_license', 'Geen licentiecode ingesteld.'); } - $hostname = parse_url( home_url(), PHP_URL_HOST ); - $current_version = isset( $this->plugin['Version'] ) ? $this->plugin['Version'] : null; - $response = wp_remote_post( $this->api_base_url . '/api/licenses/verify', array( + $hostname = parse_url(home_url(), PHP_URL_HOST); + $current_version = isset($this->plugin['Version']) ? $this->plugin['Version'] : null; + $response = wp_remote_post($this->api_base_url . '/api/licenses/verify', array( 'headers' => array( 'Content-Type' => 'application/json', ), - 'body' => wp_json_encode( array( - 'key' => $license_key, - 'hostname' => $hostname, - 'currentVersion' => $current_version, - 'owner' => $this->owner, - 'repository' => $this->repository, - ) ), + 'body' => wp_json_encode(array( + 'key' => $license_key, + 'hostname' => $hostname, + 'currentVersion' => $current_version, + 'owner' => $this->owner, + 'repository' => $this->repository, + )), 'timeout' => 15, - ) ); + )); - if ( is_wp_error( $response ) ) { + if (is_wp_error($response)) { return $response; } - $code = wp_remote_retrieve_response_code( $response ); - $body = json_decode( wp_remote_retrieve_body( $response ), true ); + $code = wp_remote_retrieve_response_code($response); + $body = json_decode(wp_remote_retrieve_body($response), true); - if ( ! is_array( $body ) ) { + if (!is_array($body)) { $this->clear_cached_license_data(); - return new WP_Error( 'verification_failed', 'Onverwacht antwoord van licentieserver.' ); + return new WP_Error('verification_failed', 'Onverwacht antwoord van licentieserver.'); } - $has_license_payload = isset( $body['license'] ) || isset( $body['pluginVersion'] ) || isset( $body['version'] ); + $has_license_payload = isset($body['license']) || isset($body['pluginVersion']) || isset($body['version']); - if ( 200 !== $code ) { - if ( $has_license_payload ) { - $this->store_license_data( $body ); + if (200 !== $code) { + if ($has_license_payload) { + $this->store_license_data($body); } else { $this->clear_cached_license_data(); } - $error_message = isset( $body['error'] ) ? $body['error'] : 'Licentie verificatie mislukt.'; - return new WP_Error( 'verification_failed', $error_message ); + $error_message = isset($body['error']) ? $body['error'] : 'Licentie verificatie mislukt.'; + return new WP_Error('verification_failed', $error_message); } - if ( empty( $body['valid'] ) ) { - if ( $has_license_payload ) { - $this->store_license_data( $body ); + if (empty($body['valid'])) { + if ($has_license_payload) { + $this->store_license_data($body); } else { $this->clear_cached_license_data(); } - return new WP_Error( 'invalid_license', 'Licentie is ongeldig.' ); + return new WP_Error('invalid_license', 'Licentie is ongeldig.'); } - $this->store_license_data( $body ); + $this->store_license_data($body); return $body; } - public function is_license_valid() { + public function is_license_valid() + { $data = $this->get_license_data(); - if ( empty( $data ) || empty( $data['key'] ) ) { + if (empty($data) || empty($data['key'])) { return false; } - if ( isset( $data['licenseValid'] ) ) { + if (isset($data['licenseValid'])) { return (bool) $data['licenseValid']; } return true; } - public function get_latest_known_version() { + public function get_latest_known_version() + { $this->get_plugin_info(); - if ( ! empty( $this->plugin_response['version'] ) ) { - return $this->plugin_response['version']; + if (!empty($this->plugin_response['version'])) { + return $this->normalize_version($this->plugin_response['version']); } $license_data = $this->get_license_data(); - if ( isset( $license_data['pluginVersion'] ) && $license_data['pluginVersion'] ) { - return $license_data['pluginVersion']; + if (isset($license_data['pluginVersion']) && $license_data['pluginVersion']) { + return $this->normalize_version($license_data['pluginVersion']); } return null; } - public function admin_notices() { - if ( ! current_user_can( 'manage_options' ) ) { + public function admin_notices() + { + if (!current_user_can('manage_options')) { return; } - if ( ! $this->is_license_valid() ) { - $settings_url = admin_url( 'options-general.php?page=siti-plugin-licenses' ); + if (!$this->is_license_valid()) { + $settings_url = admin_url('options-general.php?page=siti-plugin-licenses'); echo '
'; printf( - esc_html__( '%s: Licentie ongeldig of niet ingesteld. Ga naar %s om je licentie in te voeren.', 'siti-updater' ), - esc_html( $this->plugin['Name'] ), - '' . esc_html__( 'plugin licenties', 'siti-updater' ) . '' + esc_html__('%s: Licentie ongeldig of niet ingesteld. Ga naar %s om je licentie in te voeren.', 'siti-updater'), + esc_html($this->plugin['Name']), + '' . esc_html__('plugin licenties', 'siti-updater') . '' ); echo '
- +
- +