diff --git a/kgv-updater.php b/kgv-updater.php index 35e8f36..1a1d6df 100644 --- a/kgv-updater.php +++ b/kgv-updater.php @@ -5,7 +5,7 @@ * Description: Aktualisiert KGV-Plugins direkt aus den Gitea-Repositories. * Update URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Updater.git * Gitea Plugin URI: https://git.apex-project.de/Wordpress_Plugins/KGV-Updater.git - * Version: 1.0.1 + * Version: 1.0.3 * Author: Ronny Grobel * Text Domain: kgv-updater */ @@ -17,6 +17,7 @@ if ( ! defined( 'ABSPATH' ) ) { final class KGV_Updater { const GITEA_HOST = 'git.apex-project.de'; const GITEA_TOKEN = ''; + const INSTALLED_TAGS_OPTION = 'kgv_updater_installed_tags'; private static $instance = null; @@ -31,6 +32,7 @@ final class KGV_Updater { private function __construct() { add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'inject_updates' ) ); add_filter( 'plugins_api', array( $this, 'plugins_api' ), 10, 3 ); + add_action( 'upgrader_process_complete', array( $this, 'mark_installed_release_tags' ), 10, 2 ); } public function inject_updates( $transient ) { @@ -39,17 +41,22 @@ final class KGV_Updater { } $plugins = $this->get_managed_plugins(); + $installed_tags = $this->get_installed_tags(); foreach ( $plugins as $plugin_file => $plugin_data ) { $current_version = isset( $plugin_data['Version'] ) ? $plugin_data['Version'] : ''; $repo_url = isset( $plugin_data['UpdateURI'] ) ? $plugin_data['UpdateURI'] : ''; $release = $this->get_release_data( $repo_url ); + $installed_tag = isset( $installed_tags[ $plugin_file ] ) ? (string) $installed_tags[ $plugin_file ] : ''; + $release_tag = isset( $release['tag'] ) ? (string) $release['tag'] : ''; if ( empty( $release['version'] ) ) { continue; } - if ( version_compare( $release['version'], $current_version, '>' ) ) { + $tag_already_installed = '' !== $installed_tag && '' !== $release_tag && 0 === strcasecmp( $installed_tag, $release_tag ); + + if ( version_compare( $release['version'], $current_version, '>' ) && ! $tag_already_installed ) { $transient->response[ $plugin_file ] = (object) array( 'id' => $repo_url, 'slug' => dirname( $plugin_file ), @@ -74,6 +81,54 @@ final class KGV_Updater { return $transient; } + public function mark_installed_release_tags( $upgrader, $hook_extra ) { + if ( ! is_array( $hook_extra ) ) { + return; + } + + if ( empty( $hook_extra['type'] ) || 'plugin' !== $hook_extra['type'] ) { + return; + } + + if ( empty( $hook_extra['action'] ) || 'update' !== $hook_extra['action'] ) { + return; + } + + if ( empty( $hook_extra['plugins'] ) || ! is_array( $hook_extra['plugins'] ) ) { + return; + } + + $managed_plugins = $this->get_managed_plugins(); + if ( empty( $managed_plugins ) ) { + return; + } + + $update_transient = get_site_transient( 'update_plugins' ); + + foreach ( $hook_extra['plugins'] as $plugin_file ) { + if ( ! isset( $managed_plugins[ $plugin_file ] ) ) { + continue; + } + + $tag = ''; + + if ( is_object( $update_transient ) && isset( $update_transient->response[ $plugin_file ] ) && is_object( $update_transient->response[ $plugin_file ] ) ) { + $package_url = isset( $update_transient->response[ $plugin_file ]->package ) ? (string) $update_transient->response[ $plugin_file ]->package : ''; + $tag = $this->extract_tag_from_package_url( $package_url ); + } + + if ( '' === $tag ) { + $repo_url = isset( $managed_plugins[ $plugin_file ]['UpdateURI'] ) ? (string) $managed_plugins[ $plugin_file ]['UpdateURI'] : ''; + $release = $this->get_release_data( $repo_url ); + $tag = isset( $release['tag'] ) ? (string) $release['tag'] : ''; + } + + if ( '' !== $tag ) { + $this->set_installed_tag( $plugin_file, $tag ); + } + } + } + public function plugins_api( $result, $action, $args ) { if ( 'plugin_information' !== $action || empty( $args->slug ) ) { return $result; @@ -262,6 +317,35 @@ final class KGV_Updater { ); } + private function extract_tag_from_package_url( $package_url ) { + if ( '' === $package_url ) { + return ''; + } + + $path = (string) wp_parse_url( $package_url, PHP_URL_PATH ); + if ( preg_match( '#/archive/([^/]+)\.zip$#i', $path, $matches ) ) { + return rawurldecode( $matches[1] ); + } + + return ''; + } + + private function get_installed_tags() { + $tags = get_site_option( self::INSTALLED_TAGS_OPTION, array() ); + + return is_array( $tags ) ? $tags : array(); + } + + private function set_installed_tag( $plugin_file, $tag ) { + if ( '' === $plugin_file || '' === $tag ) { + return; + } + + $tags = $this->get_installed_tags(); + $tags[ $plugin_file ] = $tag; + update_site_option( self::INSTALLED_TAGS_OPTION, $tags ); + } + } KGV_Updater::instance();