diff --git a/wp-multi-toolkit.php b/wp-multi-toolkit.php new file mode 100644 index 0000000..164170a --- /dev/null +++ b/wp-multi-toolkit.php @@ -0,0 +1,410 @@ + 'wpmt_sanitize_settings' + )); + add_settings_section('wpmt_main_section', __('WP Multi Einstellungen', 'wp-multi-toolkit'), null, 'wpmt_settings'); + add_settings_field('wpmt_enable_multi', __('Multi-Funktion aktivieren', 'wp-multi-toolkit'), 'wpmt_enable_multi_callback', 'wpmt_settings', 'wpmt_main_section'); +} +add_action('admin_init', 'wpmt_register_settings'); + +function wpmt_sanitize_settings($input) { + $new_input = array(); + $new_input['enable_multi'] = isset($input['enable_multi']) ? 1 : 0; + return $new_input; +} + +function wpmt_enable_multi_callback() { + $options = get_option('wpmt_multi_settings', array('enable_multi' => 0)); + echo ''; +} + +function wpmt_add_admin_menu() { + add_options_page( + __('WP Multi Toolkit Einstellungen', 'wp-multi-toolkit'), + __('WP Multi Toolkit', 'wp-multi-toolkit'), + 'manage_options', + 'wpmt_settings', + 'wpmt_settings_page' + ); +} +add_action('admin_menu', 'wpmt_add_admin_menu'); + +function wpmt_settings_page() { + ?> +
+

+
+ +
+
+ 0)); + if ($options['enable_multi']) { + return '

' . __('Multi-Funktion ist aktiviert!', 'wp-multi-toolkit') . '

'; + } + return '

' . __('Multi-Funktion ist deaktiviert.', 'wp-multi-toolkit') . '

'; +} +add_shortcode('wpmt_multi', 'wpmt_multi_shortcode'); + +// ### Update-Management ### + +// Widget zum Admin-Dashboard hinzufügen +function wpmt_update_dashboard_widget() { + wp_add_dashboard_widget( + 'wpmt_update_widget', + __('Verfügbare Updates für WP Multi Toolkit', 'wp-multi-toolkit'), + 'wpmt_update_dashboard_widget_content', + null, + null, + 'normal', + 'high' + ); +} + +// Dashboard-Setup anpassen +function wpmt_force_widget_position() { + global $wp_meta_boxes; + + if (isset($wp_meta_boxes['dashboard']['normal']['high']['wpmt_update_widget'])) { + $widget = $wp_meta_boxes['dashboard']['normal']['high']['wpmt_update_widget']; + unset($wp_meta_boxes['dashboard']['normal']['high']['wpmt_update_widget']); + $wp_meta_boxes['dashboard']['normal']['high'] = array('wpmt_update_widget' => $widget) + $wp_meta_boxes['dashboard']['normal']['high']; + } +} +add_action('wp_dashboard_setup', 'wpmt_update_dashboard_widget', 1); +add_action('wp_dashboard_setup', 'wpmt_force_widget_position', 999); + +// Widget nicht ausblendbar machen +function wpmt_prevent_widget_hiding($widgets) { + $widgets['wpmt_update_widget'] = array( + 'id' => 'wpmt_update_widget', + 'title' => __('Verfügbare Updates für WP Multi Toolkit', 'wp-multi-toolkit'), + 'callback' => 'wpmt_update_dashboard_widget_content' + ); + return $widgets; +} +add_filter('dashboard_available_widgets', 'wpmt_prevent_widget_hiding'); + +// Benutzerdefiniertes Cron-Intervall hinzufügen +add_filter('cron_schedules', function ($schedules) { + $schedules['hourly'] = array( + 'interval' => 3600, + 'display' => __('Stündlich', 'wp-multi-toolkit'), + ); + return $schedules; +}); + +// Cron-Job registrieren +function wpmt_update_schedule_check() { + if (!wp_next_scheduled('wpmt_update_check_event')) { + wp_schedule_event(time(), 'hourly', 'wpmt_update_check_event'); + } +} +add_action('wp', 'wpmt_update_schedule_check'); + +// Hilfsfunktion zur Wiederverwendung der Gitea-API-Abfrage +function wpmt_fetch_latest_release($repo, $show_prereleases = false) { + $api_url = "https://git.viper.ipv64.net/api/v1/repos/M_Viper/{$repo}/releases"; + $response = wp_remote_get($api_url, array('timeout' => 10)); + + if (is_wp_error($response)) { + error_log("WP Multi Toolkit Update Fehler für {$repo}: " . $response->get_error_message()); + return false; + } + + $body = wp_remote_retrieve_body($response); + $data = json_decode($body, true); + + if (!is_array($data)) { + error_log("WP Multi Toolkit Update für {$repo}: Ungültige API-Antwort"); + return false; + } + + foreach ($data as $release) { + if (!$show_prereleases && isset($release['prerelease']) && $release['prerelease']) { + continue; + } + if (!empty($release['tag_name'])) { + return $release; + } + } + return null; +} + +// Cron-Job für Update-Überprüfung +function wpmt_update_check() { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + $show_prereleases = get_option('wpmt_update_show_prereleases', false); + $installed_plugins = get_plugins(); + $plugins_to_check = array( + 'wp-multi-toolkit' => 'WP-Multi-Toolkit/wp-multi-toolkit.php', + 'wp-multi' => 'WP-Multi/wp-multi.php', + 'WP-Multi-Search' => 'wp-multi-search/wp-multi-search.php', + 'wp-multi-comment-notifications' => 'wp-multi-comment-notifications/wp-multi-comment-notifications.php' + ); + + foreach ($plugins_to_check as $repo => $file) { + if (array_key_exists($file, $installed_plugins) && is_plugin_active($file)) { + $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $file); + $installed_version = $plugin_data['Version']; + $valid_release = wpmt_fetch_latest_release($repo, $show_prereleases); + + if ($valid_release) { + $latest_version = $valid_release['tag_name']; + $release_notes = $valid_release['body'] ?? ''; + $is_prerelease = isset($valid_release['prerelease']) && $valid_release['prerelease']; + + update_option("wpmt_update_latest_version_{$repo}", $latest_version); + update_option("wpmt_update_release_notes_{$repo}", $release_notes); + update_option("wpmt_update_is_prerelease_{$repo}", $is_prerelease); + } + } + } +} +add_action('wpmt_update_check_event', 'wpmt_update_check'); + +// Callback-Funktion für das Widget +function wpmt_update_dashboard_widget_content() { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + $installed_plugins = get_plugins(); + $show_prereleases = get_option('wpmt_update_show_prereleases', false); + + $plugins_to_check = array( + 'wp-multi-toolkit' => array( + 'file' => 'WP-Multi-Toolkit/wp-multi-toolkit.php', + 'name' => 'WP Multi Toolkit', + 'repo' => 'wp-multi-toolkit' + ), + 'wp-multi' => array( + 'file' => 'WP-Multi/wp-multi.php', + 'name' => 'WP Multi', + 'repo' => 'wp-multi' + ), + 'WP-Multi-Search' => array( + 'file' => 'wp-multi-search/wp-multi-search.php', + 'name' => 'WP Multi Search', + 'repo' => 'WP-Multi-Search' + ), + 'wp-multi-comment-notifications' => array( + 'file' => 'wp-multi-comment-notifications/wp-multi-comment-notifications.php', + 'name' => 'WP Multi Comment Notifications', + 'repo' => 'wp-multi-comment-notifications' + ) + ); + + $has_active_plugins = false; + foreach ($plugins_to_check as $key => $plugin) { + $is_installed = array_key_exists($plugin['file'], $installed_plugins); + $is_active = $is_installed && is_plugin_active($plugin['file']); + + if ($is_installed && $is_active) { + $has_active_plugins = true; + $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin['file']); + $installed_version = $plugin_data['Version']; + $valid_release = wpmt_fetch_latest_release($plugin['repo'], $show_prereleases); + + echo '

' . esc_html($plugin['name']) . '

'; + if ($valid_release === false) { + printf('

%s

', esc_html__('Fehler beim Abrufen der Versionsinformationen von Gitea.', 'wp-multi-toolkit')); + } elseif ($valid_release) { + $latest_version = $valid_release['tag_name']; + $release_notes = $valid_release['body'] ?? ''; + $is_prerelease = isset($valid_release['prerelease']) && $valid_release['prerelease']; + + if (version_compare($installed_version, $latest_version, '>=')) { + printf( + '

%s

', + sprintf( + __('Ihre Version ist aktuell. Version %s ist die neueste Version.', 'wp-multi-toolkit'), + esc_html($installed_version) + ) + ); + } else { + printf( + '

%s

', + sprintf( + __('Es ist eine neue Version von %s verfügbar! Version %s ist jetzt verfügbar.', 'wp-multi-toolkit'), + esc_html($plugin['name']), + esc_html($latest_version) + ) + ); + printf( + '

%s: %s

', + __('Aktuell installierte Version', 'wp-multi-toolkit'), + esc_html($installed_version) + ); + printf( + '

%s: %s

', + __('Neue Version auf Gitea', 'wp-multi-toolkit'), + esc_html($latest_version) + ); + + if ($is_prerelease && $show_prereleases) { + printf('

%s

', __('Dieses Update ist ein PreRelease.', 'wp-multi-toolkit')); + } + + if (!empty($release_notes)) { + printf( + '

%s:

%s

', + __('Information zum Update', 'wp-multi-toolkit'), + nl2br(esc_html($release_notes)) + ); + } + + $button_text = $is_prerelease ? __('PreRelease herunterladen', 'wp-multi-toolkit') : __('Update herunterladen', 'wp-multi-toolkit'); + $download_url = $valid_release['assets'][0]['browser_download_url'] ?? '#'; + printf( + '

%s

', + esc_url($download_url), + esc_html($button_text) + ); + } + } else { + printf('

%s

', esc_html__('Keine Versionsinformationen gefunden.', 'wp-multi-toolkit')); + } + } + } + + if (!$has_active_plugins) { + echo '

' . __('Keine aktiven WP Multi Plugins gefunden.', 'wp-multi-toolkit') . '

'; + } + + // Optionale Plugins + $optional_plugins = array( + 'wp-multi-toolkit' => array( + 'file' => 'WP-Multi-Toolkit/wp-multi-toolkit.php', + 'download_url' => 'https://git.viper.ipv64.net/M_Viper/wp-multi-toolkit/releases', + 'description' => __('Kern-Toolkit für WP Multi Plugins.', 'wp-multi-toolkit') + ), + 'wp-multi' => array( + 'file' => 'WP-Multi/wp-multi.php', + 'download_url' => 'https://git.viper.ipv64.net/M_Viper/wp-multi/releases', + 'description' => __('Hauptplugin für WP Multi Funktionen.', 'wp-multi-toolkit') + ), + 'WP-Multi-Search' => array( + 'file' => 'wp-multi-search/wp-multi-search.php', + 'download_url' => 'https://git.viper.ipv64.net/M_Viper/WP-Multi-Search/releases', + 'description' => __('Erweiterte Suchfunktionen.', 'wp-multi-toolkit') + ), + 'wp-multi-comment-notifications' => array( + 'file' => 'wp-multi-comment-notifications/wp-multi-comment-notifications.php', + 'download_url' => 'https://git.viper.ipv64.net/M_Viper/wp-multi-comment-notifications/releases', + 'description' => __('Kommentar-Benachrichtigungen.', 'wp-multi-toolkit') + ) + ); + + echo '

' . __('Optionale Plugins', 'wp-multi-toolkit') . '

'; + echo ''; + echo ''; + + foreach ($optional_plugins as $key => $plugin) { + $is_installed = array_key_exists($plugin['file'], $installed_plugins); + $is_active = $is_installed && is_plugin_active($plugin['file']); + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
' . __('Plugin', 'wp-multi-toolkit') . '' . __('Beschreibung', 'wp-multi-toolkit') . '' . __('Status', 'wp-multi-toolkit') . '' . __('Aktion', 'wp-multi-toolkit') . '
' . esc_html($plugins_to_check[$key]['name']) . '' . esc_html($plugin['description']) . ''; + if ($is_active) { + echo '' . __('Aktiv', 'wp-multi-toolkit') . ''; + } elseif ($is_installed) { + echo '' . __('Inaktiv', 'wp-multi-toolkit') . ''; + } else { + echo '' . __('Nicht installiert', 'wp-multi-toolkit') . ''; + } + echo ''; + if ($is_active) { + echo '—'; + } elseif ($is_installed) { + echo '' . __('Aktivieren', 'wp-multi-toolkit') . ''; + } else { + echo '' . __('Herunterladen', 'wp-multi-toolkit') . ''; + } + echo '
'; +} + +// Update-Einstellungen +function wpmt_update_general_settings() { + add_settings_section( + 'wpmt_update_section', + __('WP Multi Toolkit Update Einstellungen', 'wp-multi-toolkit'), + null, + 'general' + ); + + add_settings_field( + 'wpmt_update_show_prereleases', + __('Pre-Releases anzeigen', 'wp-multi-toolkit'), + 'wpmt_update_show_prereleases_callback', + 'general', + 'wpmt_update_section' + ); + + register_setting('general', 'wpmt_update_show_prereleases', array( + 'type' => 'boolean', + 'description' => __('Aktivieren, um Pre-Releases im Dashboard und in den Versionsinformationen anzuzeigen.', 'wp-multi-toolkit'), + 'default' => 0, + )); +} +add_action('admin_init', 'wpmt_update_general_settings'); + +// Callback-Funktion für das Anzeigen der Checkbox +function wpmt_update_show_prereleases_callback() { + $checked = get_option('wpmt_update_show_prereleases', false); + echo ''; + echo '

' . __('Achtung: Pre-Releases sind Beta-Versionen und können Fehler enthalten. Verwenden Sie sie nur, wenn Sie Fehlerberichterstattung oder Tests durchführen möchten.', 'wp-multi-toolkit') . '

'; +} + +// Deinstallation +function wpmt_uninstall() { + $repos = array('wp-multi-toolkit', 'wp-multi', 'WP-Multi-Search', 'wp-multi-comment-notifications'); + foreach ($repos as $repo) { + delete_option("wpmt_update_latest_version_{$repo}"); + delete_option("wpmt_update_release_notes_{$repo}"); + delete_option("wpmt_update_is_prerelease_{$repo}"); + } + delete_option('wpmt_update_show_prereleases'); + delete_option('wpmt_multi_settings'); + wp_clear_scheduled_hook('wpmt_update_check_event'); +} +register_uninstall_hook(__FILE__, 'wpmt_uninstall'); \ No newline at end of file