get_results('SHOW TABLES', ARRAY_N); if (empty($tables)) { return new WP_Error('backup_error', 'Keine Tabellen in der Datenbank gefunden.'); } // Öffne die Backup-Datei $backup_file = fopen($backup_file_path, 'w'); if (!$backup_file) { return new WP_Error('backup_error', 'Fehler beim Öffnen der Backup-Datei.'); } // Schreibe die SQL-Dumps für jede Tabelle foreach ($tables as $table) { $table_name = $table[0]; // SQL-Dump für die Tabelle hinzufügen fwrite($backup_file, "DROP TABLE IF EXISTS `$table_name`;\n"); // Struktur der Tabelle $create_table_query = $wpdb->get_row("SHOW CREATE TABLE $table_name", ARRAY_N); fwrite($backup_file, $create_table_query[1] . ";\n\n"); // Daten der Tabelle $rows = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A); foreach ($rows as $row) { $columns = array_map(function ($col) use ($wpdb) { return $wpdb->prepare('%s', $col); }, array_values($row)); $columns_str = implode(", ", $columns); fwrite($backup_file, "INSERT INTO `$table_name` VALUES ($columns_str);\n"); } fwrite($backup_file, "\n\n"); } // Datei schließen fclose($backup_file); // Gebe den Pfad zur herunterladbaren Datei zurück return $backup_file_path; } // Neue Funktion zum Löschen von Backups function wpmt_delete_backup() { if (isset($_POST['wpmt_action']) && $_POST['wpmt_action'] == 'delete_backup' && isset($_POST['backup_file'])) { $upload_dir = wp_upload_dir(); $backup_file = $upload_dir['basedir'] . '/wpmt_backups/' . sanitize_file_name($_POST['backup_file']); if (file_exists($backup_file)) { unlink($backup_file); echo '

' . __('Backup erfolgreich gelöscht!', 'wp-multi-toolkit') . '

'; } else { echo '

' . __('Backup-Datei nicht gefunden.', 'wp-multi-toolkit') . '

'; } } } // Funktion zur Anzeige der Backup-Seite und der Liste der Backups im Admin-Bereich function wpmt_display_backup_page() { $upload_dir = wp_upload_dir(); $backup_dir = $upload_dir['basedir'] . '/wpmt_backups'; // Hole eine Liste der Backups $backups = glob($backup_dir . '/*.sql'); ?>

' . $backup_path->get_error_message() . '

'; } else { echo '

' . __('Datenbank-Backup erfolgreich erstellt!', 'wp-multi-toolkit') . '

'; } } } // Admin-Menüpunkt unter Tools/Werkzeuge hinzufügen function wpmt_add_backup_menu() { add_submenu_page( 'tools.php', 'WP-Multi DB-Backup', 'WP-Multi DB-Backup', 'manage_options', 'wpmt-database-backup', 'wpmt_display_backup_page' ); } add_action('admin_menu', 'wpmt_add_backup_menu'); // Sicherstellen, dass die Anfrage bearbeitet wird add_action('admin_init', 'wpmt_handle_backup_request'); /* * DB cleaner */ function wp_multi_db_cleaner_page() { if (!current_user_can('manage_options')) return; global $wpdb; $db_tables = $wpdb->get_results("SHOW TABLES", ARRAY_N); $core_protected_tables = [ $wpdb->prefix . 'posts', $wpdb->prefix . 'postmeta', $wpdb->prefix . 'users', $wpdb->prefix . 'usermeta', $wpdb->prefix . 'options', $wpdb->prefix . 'comments', $wpdb->prefix . 'commentmeta', $wpdb->prefix . 'terms', $wpdb->prefix . 'termmeta', $wpdb->prefix . 'term_relationships', $wpdb->prefix . 'term_taxonomy', $wpdb->prefix . 'links', ]; $allow_system_tables = get_option('wp_multi_allow_system_tables', 'no') === 'yes'; if (isset($_POST['wp_multi_clean_submit']) && check_admin_referer('wp_multi_clean_action', 'wp_multi_clean_nonce')) { // Option für die Systemtabellen sperre speichern if (isset($_POST['allow_system_tables'])) { update_option('wp_multi_allow_system_tables', 'yes'); } else { update_option('wp_multi_allow_system_tables', 'no'); } $results = wp_multi_clean_database($_POST['clean_options'] ?? [], $_POST['truncate_tables'] ?? [], $core_protected_tables, $allow_system_tables); echo '

Datenbankbereinigung abgeschlossen:

'; } ?>

🧹 WP Multi Toolkit – Datenbank Cleaner

Hier kannst du gezielt Inhalte aus deiner Datenbank löschen oder bereinigen.

⚠️ Systemtabellen (Achtung!)

Wenn du diese Option aktivierst, können Systemtabellen (z.B. Optionen, Beiträge) ebenfalls geleert werden. Sei vorsichtig und stelle sicher, dass du weißt, was du tust!


🔧 Standardbereinigung





🧱 Tabellen gezielt leeren

Hier kannst du benutzerdefinierte oder Plugin-Tabellen auswählen, deren Inhalte gelöscht werden sollen. Systemtabellen sind aus Sicherheitsgründen deaktiviert, es sei denn, die Sperre wurde aufgehoben.

prefix, '', $table_name); $entry_count = $wpdb->get_var("SELECT COUNT(*) FROM `$table_name`"); $description = wp_multi_get_table_description($short_name); $is_core = in_array($table_name, $core_protected_tables) && !$allow_system_tables; ?>
Leeren? Tabellenname Einträge Beschreibung
🔒 (geschützt)

query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'"); $results[] = "$deleted Revision(en) gelöscht."; } if (in_array('transients', $options)) { $transients = $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'"); $results[] = "$transients Transient(en) gelöscht."; } if (in_array('options', $options)) { $orphaned = $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_value = '' OR option_value IS NULL"); $results[] = "$orphaned verwaiste Option(en) gelöscht."; } foreach ($truncate_tables as $table) { if (!$allow_system_tables && in_array($table, $protected)) { $results[] = "Tabelle $table ist geschützt und wurde nicht geleert."; } else { $wpdb->query("TRUNCATE TABLE `$table`"); $results[] = "Tabelle $table geleert."; } } if (empty($results)) { $results[] = "Keine Aktionen durchgeführt."; } return $results; } function wp_multi_get_table_description($short_name) { // Hier kannst du für jede Tabelle eine Beschreibung hinzufügen $descriptions = [ 'postmeta' => 'Meta-Daten zu Beiträgen', 'options' => 'Allgemeine Optionen', // Weitere Tabellenbeschreibungen hier hinzufügen ]; return isset($descriptions[$short_name]) ? $descriptions[$short_name] : 'Keine Beschreibung verfügbar'; } // Menüpunkt unter Werkzeuge hinzufügen function wp_multi_toolkit_menu() { add_submenu_page( 'tools.php', // Untermenü von Werkzeuge 'WP Multi DB cleaner', // Titel der Seite 'WP Multi DB cleaner', // Name des Menüpunkts 'manage_options', // Berechtigung 'wp-multi-toolkit', // Slug 'wp_multi_db_cleaner_page' // Funktion zum Anzeigen der Seite ); } add_action('admin_menu', 'wp_multi_toolkit_menu'); /* * Cookie-Banner */ // Menü für das Cookie-Banner function wpmt_cookie_banner_menu() { add_options_page( __('Cookie Banner Einstellungen', 'wp-multi-toolkit'), __('Cookie Banner', 'wp-multi-toolkit'), 'manage_options', 'wpmt-cookie-banner', 'wpmt_cookie_banner_settings_page' ); } add_action('admin_menu', 'wpmt_cookie_banner_menu'); // Admin-Bereich für die Cookie-Einstellungen function wpmt_cookie_banner_settings_page() { // Speichern der Daten, wenn das Formular übermittelt wird if(isset($_POST['wpmt_save_cookie_settings'])) { update_option('wpmt_cookie_banner_text', sanitize_textarea_field($_POST['wpmt_cookie_banner_text'])); update_option('wpmt_cookie_accept_text', sanitize_text_field($_POST['wpmt_cookie_accept_text'])); update_option('wpmt_cookie_decline_text', sanitize_text_field($_POST['wpmt_cookie_decline_text'])); update_option('wpmt_cookie_policy_url', esc_url_raw($_POST['wpmt_cookie_policy_url'])); update_option('wpmt_cookie_impressum_url', esc_url_raw($_POST['wpmt_cookie_impressum_url'])); update_option('wpmt_cookie_banner_background_color', sanitize_hex_color($_POST['wpmt_cookie_banner_background_color'])); update_option('wpmt_cookie_type_necessary', isset($_POST['wpmt_cookie_type_necessary']) ? '1' : '0'); update_option('wpmt_cookie_type_preferences', isset($_POST['wpmt_cookie_type_preferences']) ? '1' : '0'); update_option('wpmt_cookie_type_statistics', isset($_POST['wpmt_cookie_type_statistics']) ? '1' : '0'); update_option('wpmt_cookie_type_marketing', isset($_POST['wpmt_cookie_type_marketing']) ? '1' : '0'); update_option('wpmt_content_blocking_enabled', isset($_POST['wpmt_content_blocking_enabled']) ? '1' : '0'); update_option('wpmt_enable_cookie_banner', isset($_POST['wpmt_enable_cookie_banner']) ? '1' : '0'); echo '

' . __('Einstellungen gespeichert!', 'wp-multi-toolkit') . '

'; } // Optionen aus der Datenbank abrufen $cookie_banner_text = get_option('wpmt_cookie_banner_text', __('Wir verwenden Cookies, um Ihnen das beste Erlebnis zu bieten.', 'wp-multi-toolkit')); $cookie_accept_text = get_option('wpmt_cookie_accept_text', __('Akzeptieren', 'wp-multi-toolkit')); $cookie_decline_text = get_option('wpmt_cookie_decline_text', __('Ablehnen', 'wp-multi-toolkit')); $cookie_policy_url = get_option('wpmt_cookie_policy_url', ''); $cookie_impressum_url = get_option('wpmt_cookie_impressum_url', ''); $cookie_banner_background_color = get_option('wpmt_cookie_banner_background_color', '#f0f0f0'); $cookie_type_necessary = get_option('wpmt_cookie_type_necessary', '1'); $cookie_type_preferences = get_option('wpmt_cookie_type_preferences', '0'); $cookie_type_statistics = get_option('wpmt_cookie_type_statistics', '0'); $cookie_type_marketing = get_option('wpmt_cookie_type_marketing', '0'); $content_blocking_enabled = get_option('wpmt_content_blocking_enabled', '0'); $enable_cookie_banner = get_option('wpmt_enable_cookie_banner', '1'); // HTML für Einstellungsseite ?>

/>




'; echo '

' . esc_html($banner_text) . ' ' . __('Mehr erfahren', 'wp-multi-toolkit') . ' | ' . __('Impressum', 'wp-multi-toolkit') . '

'; echo ''; echo ''; echo ''; // JavaScript zum Setzen des Cookies nach Zustimmung ?> insert( $wpdb->prefix . 'wpmt_cookie_consent', array( 'user_ip' => $_SERVER['REMOTE_ADDR'], 'consent_given' => 1, 'timestamp' => current_time('mysql') ) ); } wp_die(); } add_action('wp_ajax_wpmt_save_cookie_consent', 'wpmt_save_cookie_consent'); add_action('wp_ajax_nopriv_wpmt_save_cookie_consent', 'wpmt_save_cookie_consent'); // Tabelle für die Cookie-Zustimmung erstellen (bei Aktivierung des Plugins oder beim Laden des Plugins) function wpmt_create_cookie_consent_table() { global $wpdb; $table_name = $wpdb->prefix . 'wpmt_cookie_consent'; // Prüfen, ob die Tabelle bereits existiert if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") !== $table_name) { // Tabelle erstellen $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( id bigint(20) NOT NULL AUTO_INCREMENT, user_ip varchar(255) NOT NULL, consent_given tinyint(1) NOT NULL, timestamp datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } } // Aufruf beim Laden des Plugins add_action('plugins_loaded', 'wpmt_create_cookie_consent_table'); // Aufruf bei der Aktivierung des Plugins register_activation_hook(__FILE__, 'wpmt_create_cookie_consent_table'); /* * Backup Autoveröffentlichung */ // Funktion, um zukünftige Posts zu veröffentlichen function pubMissedPosts() { if (is_front_page() || is_single()) { global $wpdb; $now = gmdate('Y-m-d H:i:00'); // Überprüfe, ob benutzerdefinierte Beitragstypen vorhanden sind $args = array( 'public' => true, '_builtin' => false, ); $output = 'names'; // names oder objects, names ist der Standard $operator = 'and'; // 'and' oder 'or' $post_types = get_post_types($args, $output, $operator); if (count($post_types) === 0) { $sql = "SELECT ID FROM $wpdb->posts WHERE post_type IN ('post', 'page') AND post_status = 'future' AND post_date_gmt < '$now'"; } else { $str = implode('\',\'', $post_types); $sql = "SELECT ID FROM $wpdb->posts WHERE post_type IN ('page', 'post', '$str') AND post_status = 'future' AND post_date_gmt < '$now'"; } $resulto = $wpdb->get_results($sql); if ($resulto) { foreach ($resulto as $thisarr) { wp_publish_post($thisarr->ID); } } } } // Die Funktion beim Laden der Seite aufrufen add_action('wp_head', 'pubMissedPosts'); /* * Gitea - Ticket - BUG - Report */ /** * Sendet ein Support-Ticket an den Server und leitet es an das entsprechende Gitea-Repository weiter. * * @param string $plugin_name Der Name des Plugins (z. B. wp-multi, wp-multi-teamcard). * @param string $title Der Titel des Tickets. * @param string $description Die Beschreibung des Tickets. * @param string $label Die Kategorie des Tickets (z. B. bug, enhancement). * @return string Die Rückmeldung (Erfolg oder Fehler). */ function send_support_ticket_to_server($plugin_name, $title, $description, $label = 'bug') { $server_url = 'https://m-viper.de/gitea-issue-creator.php'; // Daten für die Anfrage vorbereiten $data = [ 'plugin' => $plugin_name, 'title' => $title, 'description' => $description, 'label' => $label ]; $args = [ 'method' => 'POST', 'body' => json_encode($data), 'headers' => [ 'Content-Type' => 'application/json', ], 'timeout' => 45, ]; $response = wp_remote_post($server_url, $args); if (is_wp_error($response)) { $error_message = $response->get_error_message(); return '' . sprintf(__('Es gab einen Fehler bei der Ticketübertragung: %s', 'wp-multi-toolkit'), $error_message) . ''; } $response_body = wp_remote_retrieve_body($response); $response_data = json_decode($response_body, true); if (isset($response_data['message']) && $response_data['message'] === 'Issues erfolgreich erstellt') { return '' . __('Issues erfolgreich erstellt', 'wp-multi-toolkit') . ''; } else { return '' . sprintf(__('Es gab einen Fehler: %s', 'wp-multi-toolkit'), esc_html($response_body)) . ''; } } /** * Rendert das Support-Ticket-Formular im Admin-Bereich. */ function support_ticket_form() { ?>

' . $result . '
'; } ?>
__('Entschuldigung, das verstehe ich nicht. Versuche es mit einer anderen Frage oder erstelle ein Support-Ticket unter WP-Multi Support!', 'wp-multi-toolkit') )); // Stichwörter aus den Antworten extrahieren (ohne 'default') $keywords = array_keys($assistant_responses); unset($keywords[array_search('default', $keywords)]); // Entfernt 'default' aus der Liste $keywords_list = implode(', ', $keywords); ?>

<?php _e('Virtueller Assistent', 'wp-multi-toolkit'); ?>

TG-Notify".', 'wp-multi-toolkit'); $responses['discord'] = __('Schickt Benachrichtigungen für neue Beiträge an Discord. Konfiguriere dies unter "Notify > DC-Notify".', 'wp-multi-toolkit'); $responses['admin links'] = __('Füge eigene Links (z. B. zu externen Seiten) im Adminpanel hinzu. Gehe zu "Werkzeuge > Admin-Link hinzufügen".', 'wp-multi-toolkit'); $responses['gast-autor'] = __('Gib Gastautoren unter "Benutzer > Gastautor (Übersicht)" ein. Sie werden in jedem Beitrag im Frontend angezeigt.', 'wp-multi-toolkit'); $responses['beitrag report'] = __('Unangemessene Beiträge melden und bearbeiten. Sieh die Liste unter "Gemeldete Beiträge".', 'wp-multi-toolkit'); $responses['textbox'] = __('Fügt eine Textbox mit vordefinierten Texten am Beitragsende hinzu. Texte können im Adminpanel hinterlegt werden.', 'wp-multi-toolkit'); $responses['banner'] = __('Stelle ein Informationsbanner unter "WP Stat & Notice" ein (Header oder Footer).', 'wp-multi-toolkit'); $responses['inhaltsverzeichnis'] = __('Nutze den Shortcode [alphabetical_index], um ein Inhaltsverzeichnis aller Beiträge zu erstellen.', 'wp-multi-toolkit'); $responses['lesezeichen'] = __('Gäste können Lesezeichen mit [add_bookmark] setzen und mit [display_bookmarks] anzeigen. Per Cookie gespeichert.', 'wp-multi-toolkit'); $responses['custom shortcode'] = __('Erstelle eigene Shortcodes und wähle sie unter "Beitrag erstellen" im Editor aus.', 'wp-multi-toolkit'); $responses['kommentar sperren'] = __('Sperre Benutzer für Kommentare unter "Benutzer sperren" (z. B. via Benutzername, IP, Mail).', 'wp-multi-toolkit'); $responses['filter'] = __('Verbiete Rufnummern, Mailadressen, URLs, IPs oder Schimpfwörter unter "Kommentare > Kommentar Filter". Verstöße werden mit * ersetzt.', 'wp-multi-toolkit'); $responses['analytics'] = __('Sieh die beliebtesten Beiträge (Views, Kommentare, Titel, ID, Zeitstempel) unter "Benutzer > Benutzer Analytics".', 'wp-multi-toolkit'); $responses['pinwand'] = __('Hinterlege Nachrichten für Backend-Nutzer unter "Pinnwand". Diese können erstellt, bearbeitet oder gelöscht werden.', 'wp-multi-toolkit'); $responses['brute force'] = __('Schutz vor Brute-Force: Loggt Fehlversuche und sperrt nach 5 Versuchen. Einstellungen unter "Sicherheit".', 'wp-multi-toolkit'); $responses['anti spam'] = __('Blockiert Spam und Bots. Konfiguriere dies unter "Sicherheit" mit Übersicht im Adminpanel.', 'wp-multi-toolkit'); $responses['auto tag'] = __('Fügt fehlende Tags automatisch hinzu. Verwalte verbotene Wörter unter "Beiträge > Automatische Tags".', 'wp-multi-toolkit'); $responses['login deaktivieren'] = __('Deaktiviere Logins im Profil unter "Benutzer > Alle Benutzer > Benutzer auswählen".', 'wp-multi-toolkit'); $responses['text copy'] = __('Schützt Texte vor Kopieren (Rechtsklick-Sperre). Aktiviere dies in den WP Multi-Einstellungen.', 'wp-multi-toolkit'); $responses['trash mail'] = __('Verbietet Trash-Mail-Adressen in Kommentaren. Die Liste wird vom Entwickler gepflegt.', 'wp-multi-toolkit'); // WP Multi Comment Notifications $responses['kommentar benachrichtigung'] = __('Schickt Benachrichtigungen für neue Kommentare per Mail, Telegram oder Discord. Einstellungen unter "Kommentare > Kommentar Benachrichtigung".', 'wp-multi-toolkit'); // WP Multi Kategorie $responses['kategorien ausblenden'] = __('Blende einzelne Kategorien unter "Beiträge > Kategorie Filter" aus.', 'wp-multi-toolkit'); // WP Multi Search $responses['suchfunktion'] = __('Füge eine Suchfunktion (Allgemein, Gastautor, Titel) als Shortcode, Widget oder Menüeintrag hinzu. Einstellungen unter "Einstellung > WP-Multi Search".', 'wp-multi-toolkit'); // WP Multi Team-Card $responses['teamcard'] = __('Mit dem WP Multi Team-Card Plugin kannst du Teammitglieder mit Name, Funktion, Zuständigkeit und Bild erstellen. Nutze den Shortcode [teamcards] für die Anzeige im Frontend.', 'wp-multi-toolkit'); $responses['teammitglied hinzufügen'] = __('Gehe zu "Team-Cards" im Admin-Menü, fülle die Felder (Name, Funktion, Zuständigkeit, Bild) aus und klicke auf "Teammitglied hinzufügen".', 'wp-multi-toolkit'); $responses['teamcard shortcode'] = __('Verwende den Shortcode [teamcards] in einem Beitrag oder einer Seite, um alle Teammitglieder anzuzeigen. Für eine bestimmte Kategorie nutze z. B. [teamcards kategorie="slug"].', 'wp-multi-toolkit'); $responses['teamcard kategorie'] = __('Erstelle Kategorien für Teammitglieder unter "Beiträge > Kategorien". Weise sie den Teammitgliedern zu, um sie mit dem Shortcode [teamcards kategorie="slug"] gefiltert anzuzeigen.', 'wp-multi-toolkit'); $responses['teamcard bild'] = __('Füge ein Bild für ein Teammitglied hinzu, indem du in der "Team-Cards"-Verwaltung auf "Bild auswählen" klickst. Das Bild wird im Frontend in der Teamkarte angezeigt.', 'wp-multi-toolkit'); $responses['teamcard löschen'] = __('Um ein Teammitglied zu löschen, gehe zu "Team-Cards", finde das Mitglied in der Liste und klicke auf "Löschen".', 'wp-multi-toolkit'); $responses['teamcard reihenfolge'] = __('Ändere die Reihenfolge der Teammitglieder, indem du die Zeilen in der "Team-Cards"-Tabelle per Drag-and-Drop verschiebst.', 'wp-multi-toolkit'); $responses['teamcard deinstallation'] = __('Beim Löschen des WP Multi Team-Card Plugins werden alle Teammitglieder, Kategorien und Bilder aus der Datenbank entfernt. Erstelle ein Backup, wenn du die Daten behalten möchtest.', 'wp-multi-toolkit'); $responses['teamcard updates'] = __('Prüfe Updates für das WP Multi Team-Card Plugin unter https://git.viper.ipv64.net/M_Viper/wp-multi-teamcard. Eine Benachrichtigung erscheint im Admin-Bereich, wenn eine neue Version verfügbar ist.', 'wp-multi-toolkit'); // WP Multi Toolkit $responses['update management'] = __('Zeigt den Status der WP Multi Plugins und verfügbare Updates im Dashboard-Widget "Verfügbare Updates für WP Multi Toolkit".', 'wp-multi-toolkit'); $responses['support issues'] = __('Erstelle Support-Tickets unter "WP-Multi Support" für Antworten zu WP Multi Plugins.', 'wp-multi-toolkit'); $responses['dokumentation'] = __('Finde die Dokumentation unter "WP-Multi Support > Dokumentation" mit Links zu den Plugins.', 'wp-multi-toolkit'); $responses['virtueller assistent'] = __('Ich bin der virtuelle Assistent! Stelle mir Fragen zu WP Multi Plugins unter "WP-Multi Support > Virtueller Assistent".', 'wp-multi-toolkit'); $responses['toolbar'] = __('Die Schnellstart-Toolbar unten rechts bietet Zugriff auf Support, Updates, Dokumentation und mich!', 'wp-multi-toolkit'); $responses['wp multi plugins'] = __('Folgende Plugins gehören zur WP Multi-Reihe:
- WP Multi Toolkit: Schnittstelle für alle WP Multi Plugins.
- WP Multi: Hauptplugin mit vielen Funktionen.
- WP Multi Comment Notifications: Benachrichtigungen für Kommentare.
- WP Multi Search: Erweiterte Suchfunktion.
- WP Multi Kategorie: Kategoriefilter.', 'wp-multi-toolkit'); // Allgemeine Fragen und Antworten zu WP Multi Plugins $responses['was sind wp multi plugins'] = __('Die WP Multi Plugins sind eine Sammlung von WordPress-Plugins, die erweiterte Funktionen für deine Website bieten. Dazu gehören Tools für Benachrichtigungen, Sicherheit, Statistiken, Kommentar-Management und mehr. Sieh dir die Liste unter "wp multi plugins" an!', 'wp-multi-toolkit'); $responses['wie installiere ich ein plugin'] = __('Gehe zu "Plugins > Neu hinzufügen" in deinem WordPress-Dashboard, lade die Plugin-Datei (z. B. von https://git.viper.ipv64.net/M_Viper) hoch und aktiviere es. Alternativ kannst du es manuell über FTP in den Ordner /wp-content/plugins/ hochladen und aktivieren.', 'wp-multi-toolkit'); $responses['wo finde ich updates'] = __('Updates für WP Multi Plugins findest du im Dashboard-Widget "Verfügbare Updates für WP Multi Toolkit" oder auf https://git.viper.ipv64.net/M_Viper. Lade die neueste Version herunter und aktualisiere das Plugin manuell.', 'wp-multi-toolkit'); $responses['wie erstelle ich ein support ticket'] = __('Gehe zu "WP-Multi Support" im Admin-Menü, wähle das Plugin, gib einen Titel und eine Beschreibung ein und sende das Ticket ab. Du erhältst eine Bestätigung, wenn es erfolgreich erstellt wurde.', 'wp-multi-toolkit'); $responses['welche voraussetzungen gibt es'] = __('Die WP Multi Plugins benötigen mindestens WordPress 6.7.2. Einige Funktionen (z. B. Telegram- oder Discord-Benachrichtigungen) erfordern API-Keys oder zusätzliche Konfiguration. Details findest du in der Dokumentation.', 'wp-multi-toolkit'); $responses['sind die plugins kostenlos'] = __('Ja, alle WP Multi Plugins sind kostenlos verfügbar unter https://git.viper.ipv64.net/M_Viper. Es gibt keine versteckten Kosten und es wird kein Geld angenommen.', 'wp-multi-toolkit'); $responses['wie deaktiviere ich ein plugin'] = __('Gehe zu "Plugins > Installierte Plugins" in deinem WordPress-Dashboard, suche das Plugin und klicke auf "Deaktivieren". Du kannst es danach löschen, wenn du es nicht mehr benötigst.', 'wp-multi-toolkit'); $responses['wo finde ich die dokumentation'] = __('Die Dokumentation ist unter "WP-Multi Support > Dokumentation" im Admin-Menü verfügbar. Sie enthält Details zu jedem Plugin und Links zu den Download-Seiten.', 'wp-multi-toolkit'); $responses['wer entwickelt die plugins'] = __('Die WP Multi Plugins werden von M_Viper entwickelt. Mehr Infos findest du auf https://m-viper.de oder im Repository https://git.viper.ipv64.net/M_Viper.', 'wp-multi-toolkit'); $responses['kann ich eigene funktionen hinzufügen'] = __('Ja, die Plugins sind Open Source. Du kannst den Code auf https://git.viper.ipv64.net/M_Viper anpassen. Für Vorschläge erstelle ein Support-Ticket mit der Kategorie "Verbesserung".', 'wp-multi-toolkit'); return $responses; }); /* * Schnellzugriff-Menü (Floating Toolbar) */ function wpmt_add_floating_toolbar() { if (!current_user_can('manage_options') || !is_admin()) { return; } ?>
'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_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'); // ### Automatisierte Plugin-Dokumentation ### /** * Ruft die neueste Version eines Plugins aus der Gitea-API ab. * * @param string $repo_name Der Name des Gitea-Repositorys. * @return string|null Die neueste Version oder null bei Fehlern. */ function wpmt_get_latest_plugin_version($repo_name) { $api_url = "https://git.viper.ipv64.net/api/v1/repos/M_Viper/{$repo_name}/releases"; $response = wp_remote_get($api_url, array( 'timeout' => 10, 'headers' => array('Accept' => 'application/json') )); if (is_wp_error($response)) { return null; } $body = wp_remote_retrieve_body($response); $releases = json_decode($body, true); if (empty($releases) || !is_array($releases)) { return null; } // Sortiere Releases nach Erstellungsdatum (neuestes zuerst) usort($releases, function($a, $b) { return strtotime($b['created_at']) - strtotime($a['created_at']); }); return !empty($releases[0]['tag_name']) ? ltrim($releases[0]['tag_name'], 'v') : null; } function wpmt_generate_plugin_docs() { require_once ABSPATH . 'wp-admin/includes/plugin.php'; $installed_plugins = get_plugins(); $wp_multi_plugins = array( 'wp-multi-toolkit' => array( 'file' => 'wp-multi-toolkit/wp-multi-toolkit.php', 'name' => 'WP Multi Toolkit', 'description' => __('Zentrales Toolkit für die WP Multi Plugin-Reihe mit Update-Management und Support-Funktionen.', 'wp-multi-toolkit'), 'repo' => 'wp-multi-toolkit' ), 'wp-multi' => array( 'file' => 'WP-Multi/wp-multi.php', 'name' => 'WP Multi', 'description' => __('Hauptplugin für Multi-Funktionen mit Shortcode-Unterstützung.', 'wp-multi-toolkit'), 'repo' => 'wp-multi' ), 'wp-multi-search' => array( 'file' => 'wp-multi-search/wp-multi-search.php', 'name' => 'WP Multi Search', 'description' => __('Erweiterte Suchfunktionen für WordPress.', 'wp-multi-toolkit'), 'repo' => 'WP-Multi-Search' ), 'wp-multi-comment-notifications' => array( 'file' => 'wp-multi-comment-notifications/wp-multi-comment-notifications.php', 'name' => 'WP Multi Comment Notifications', 'description' => __('Automatische Benachrichtigungen für neue Kommentare.', 'wp-multi-toolkit'), 'repo' => 'wp-multi-comment-notifications' ), 'wp-multi-kategorie' => array( 'file' => 'wp-multi-kategorie/wp-multi-kategorie.php', 'name' => 'WP Multi Kategorie', 'description' => __('Filtert und verwaltet Kategorien für Beiträge.', 'wp-multi-toolkit'), 'repo' => 'wp-multi-kategorie' ), 'wp-multi-teamcard' => array( 'file' => 'wp-multi-teamcards/wp-multi-team-card.php', // Korrekter Pfad, wie von dir bestätigt 'name' => 'WP Multi Team-Card', 'description' => __('Erstellt Teamkarten mit Name, Funktion, Zuständigkeit und Bild, die über den Shortcode [teamcards] angezeigt werden.', 'wp-multi-toolkit'), 'repo' => 'wp-multi-teamcard' ) ); ?>

$plugin) : ?>

'); ?>

:

:

:

:

:

:

:

:

:

$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($release['prerelease']) && $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'); // Funktion zur Überprüfung des Update-Server-Status function wpmt_check_update_server_status() { $update_server_url = 'https://git.viper.ipv64.net'; $response = wp_remote_head($update_server_url, array('timeout' => 5)); return !is_wp_error($response) && wp_remote_retrieve_response_code($response) == 200; } // 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); // Update-Server-Status nur bei Offline anzeigen $server_online = wpmt_check_update_server_status(); if (!$server_online) { echo '

🔴 ' . __('Update Server offline', 'wp-multi-toolkit') . '

'; echo '
'; } $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' ), 'wp-multi-kategorie' => array( 'file' => 'wp-multi-kategorie/wp-multi-kategorie.php', 'name' => 'WP Multi Kategorie', 'repo' => 'wp-multi-kategorie' ) ); $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.', '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') ), 'wp-multi-kategorie' => array( 'file' => 'wp-multi-kategorie/wp-multi-kategorie.php', 'download_url' => 'https://git.viper.ipv64.net/M_Viper/wp-multi-kategorie/releases', 'description' => __('Erweiterte Kategorie-Funktionen für WP Multi.', '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'); /* * Ban Funktion */ // Add Admin Menu add_action('admin_menu', 'wp_multi_toolkit_setup_menu'); function wp_multi_toolkit_setup_menu() { if (!current_user_can('manage_options')) { return; } add_submenu_page( 'users.php', 'WP Multi Ban', 'WP Multi Ban', 'manage_options', 'wp-multi-ban', 'wp_multi_ban_options_page' ); } // WP Multi Ban Functions ### Function: Get IP Address function wp_multi_ban_get_ip() { $banned_options = get_option('wp_multi_ban_options', array('reverse_proxy' => 0)); if (!empty($banned_options['reverse_proxy']) && intval($banned_options['reverse_proxy']) === 1) { foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (!empty($_SERVER[$key])) { foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { return esc_attr($ip); } } } } } elseif (!empty($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; if (strpos($ip, ',') !== false) { $ip = explode(',', $ip)[0]; } return esc_attr($ip); } return ''; } ### Function: Preview Banned Message add_action('wp_ajax_wp_multi_ban_admin', 'wp_multi_ban_preview_banned_message'); function wp_multi_ban_preview_banned_message() { if (!current_user_can('manage_options')) { wp_send_json_error('Zugriff verweigert'); } $banned_stats = get_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); $banned_message = stripslashes(get_option('wp_multi_ban_message', 'Ihr Zugriff auf %SITE_NAME% (%SITE_URL%) wurde gesperrt.')); $banned_message = str_replace( array( '%SITE_NAME%', '%SITE_URL%', '%USER_ATTEMPTS_COUNT%', '%USER_IP%', '%USER_HOSTNAME%', '%TOTAL_ATTEMPTS_COUNT%' ), array( esc_html(get_option('blogname')), esc_url(get_option('siteurl')), number_format_i18n($banned_stats['users'][wp_multi_ban_get_ip()] ?? 0), esc_html(wp_multi_ban_get_ip()), esc_html(@gethostbyaddr(wp_multi_ban_get_ip())), number_format_i18n($banned_stats['count'] ?? 0) ), $banned_message ); wp_send_json_success(array('message' => $banned_message)); } ### Function: Print Out Banned Message function wp_multi_ban_print_banned_message() { $banned_ip = wp_multi_ban_get_ip(); $banned_stats = get_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); $banned_stats['count'] = isset($banned_stats['count']) ? $banned_stats['count'] + 1 : 1; $banned_stats['users'][$banned_ip] = isset($banned_stats['users'][$banned_ip]) ? $banned_stats['users'][$banned_ip] + 1 : 1; update_option('wp_multi_ban_stats', $banned_stats); $banned_message = stripslashes(get_option('wp_multi_ban_message', 'Ihr Zugriff auf %SITE_NAME% (%SITE_URL%) wurde gesperrt.')); $banned_message = str_replace( array( '%SITE_NAME%', '%SITE_URL%', '%USER_ATTEMPTS_COUNT%', '%USER_IP%', '%USER_HOSTNAME%', '%TOTAL_ATTEMPTS_COUNT%' ), array( esc_html(get_option('blogname')), esc_url(get_option('siteurl')), number_format_i18n($banned_stats['users'][$banned_ip] ?? 0), esc_html($banned_ip), esc_html(@gethostbyaddr($banned_ip)), number_format_i18n($banned_stats['count'] ?? 0) ), $banned_message ); echo 'Gesperrt' . $banned_message . ''; exit; } ### Function: Process Banning function wp_multi_ban_process_ban($banarray, $against) { if (!empty($banarray) && !empty($against) && is_array($banarray)) { foreach ($banarray as $cban) { if (wp_multi_ban_preg_match_wildcard($cban, $against)) { wp_multi_ban_print_banned_message(); } } } } ### Function: Process Banned IP Range function wp_multi_ban_process_ban_ip_range($banned_ips_range) { if (!empty($banned_ips_range) && is_array($banned_ips_range)) { foreach ($banned_ips_range as $banned_ip_range) { $range = explode('-', $banned_ip_range); if (count($range) === 2) { $range_start = trim($range[0]); $range_end = trim($range[1]); if (wp_multi_ban_check_ip_within_range(wp_multi_ban_get_ip(), $range_start, $range_end)) { wp_multi_ban_print_banned_message(); break; } } } } } ### Function: Banned add_action('init', 'wp_multi_ban_banned', 1); function wp_multi_ban_banned() { $ip = wp_multi_ban_get_ip(); if (empty($ip)) { return; } $banned_ips = get_option('wp_multi_ban_ips', array()); $banned_ips_range = get_option('wp_multi_ban_ips_range', array()); $banned_hosts = get_option('wp_multi_ban_hosts', array()); $banned_referers = get_option('wp_multi_ban_referers', array()); $banned_user_agents = get_option('wp_multi_ban_user_agents', array()); $banned_exclude_ips = get_option('wp_multi_ban_exclude_ips', array()); if (is_array($banned_exclude_ips) && in_array($ip, $banned_exclude_ips)) { return; } if (is_array($banned_ips)) { wp_multi_ban_process_ban($banned_ips, $ip); } if (is_array($banned_ips_range)) { wp_multi_ban_process_ban_ip_range($banned_ips_range); } if (is_array($banned_hosts)) { wp_multi_ban_process_ban($banned_hosts, @gethostbyaddr($ip)); } if (is_array($banned_referers) && !empty($_SERVER['HTTP_REFERER'])) { wp_multi_ban_process_ban($banned_referers, $_SERVER['HTTP_REFERER']); } if (is_array($banned_user_agents) && !empty($_SERVER['HTTP_USER_AGENT'])) { wp_multi_ban_process_ban($banned_user_agents, $_SERVER['HTTP_USER_AGENT']); } } ### Function: Check Whether IP Within A Given IP Range function wp_multi_ban_check_ip_within_range($ip, $range_start, $range_end) { $range_start = ip2long($range_start); $range_end = ip2long($range_end); $ip = ip2long($ip); return ($ip !== false && $range_start !== false && $range_end !== false && $ip >= $range_start && $ip <= $range_end); } ### Function: Wildcard Check function wp_multi_ban_preg_match_wildcard($regex, $subject) { if (empty($regex) || empty($subject)) { return false; } $regex = preg_quote($regex, '#'); $regex = str_replace('\*', '.*', $regex); return preg_match("#^$regex$#i", $subject) === 1; } ### Function: Activate Ban Module function wp_multi_ban_activate() { $default_message = 'Ihr Zugriff auf %SITE_NAME% (%SITE_URL%) wurde gesperrt.' . "\n\n" . 'Details:' . "\n" . '- Ihre IP: %USER_IP%' . "\n" . '- Hostname: %USER_HOSTNAME%' . "\n" . '- Ihre Versuche: %USER_ATTEMPTS_COUNT%' . "\n" . '- Gesamtanzahl Sperrversuche: %TOTAL_ATTEMPTS_COUNT%' . "\n\n" . 'Bitte kontaktieren Sie den Support von %SITE_NAME%, falls Sie Fragen haben.'; add_option('wp_multi_ban_ips', array()); add_option('wp_multi_ban_hosts', array()); add_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); add_option('wp_multi_ban_message', $default_message); add_option('wp_multi_ban_referers', array()); add_option('wp_multi_ban_exclude_ips', array()); add_option('wp_multi_ban_ips_range', array()); add_option('wp_multi_ban_user_agents', array()); add_option('wp_multi_ban_options', array('reverse_proxy' => 0)); } ### Function: Admin Options Page function wp_multi_ban_options_page() { if (!current_user_can('manage_options')) { wp_die('Zugriff verweigert'); } $text = ''; if (!empty($_POST['Submit'])) { check_admin_referer('wp_multi_ban_templates'); $banned_options = array('reverse_proxy' => isset($_POST['banned_option_reverse_proxy']) ? 1 : 0); $banned_ips = array(); $banned_ips_range = array(); $banned_hosts = array(); $banned_referers = array(); $banned_user_agents = array(); $banned_exclude_ips = array(); $admin_ip = wp_multi_ban_get_ip(); $admin_login = trim(wp_get_current_user()->user_login); if (!empty($_POST['banned_ips'])) { foreach (explode("\n", trim($_POST['banned_ips'])) as $banned_ip) { $banned_ip = trim($banned_ip); if ($admin_login === 'admin' && $banned_ip === $admin_ip) { $text .= '
Diese IP \'' . esc_html($banned_ip) . '\' gehört dem Admin und wird nicht gesperrt.
'; } else { $banned_ips[] = esc_html($banned_ip); } } } if (!empty($_POST['banned_ips_range'])) { foreach (explode("\n", trim($_POST['banned_ips_range'])) as $banned_ip_range) { $range = explode('-', trim($banned_ip_range)); if (count($range) === 2 && $admin_login === 'admin' && wp_multi_ban_check_ip_within_range($admin_ip, trim($range[0]), trim($range[1]))) { $text .= '
Die Admin-IP \'' . esc_html($admin_ip) . '\' liegt in diesem Bereich und wird nicht gesperrt.
'; } else { $banned_ips_range[] = esc_html(trim($banned_ip_range)); } } } if (!empty($_POST['banned_hosts'])) { foreach (explode("\n", trim($_POST['banned_hosts'])) as $banned_host) { $banned_hosts[] = esc_html(trim($banned_host)); } } if (!empty($_POST['banned_referers'])) { foreach (explode("\n", trim($_POST['banned_referers'])) as $banned_referer) { $banned_referers[] = esc_html(trim($banned_referer)); } } if (!empty($_POST['banned_user_agents'])) { foreach (explode("\n", trim($_POST['banned_user_agents'])) as $banned_user_agent) { $banned_user_agents[] = esc_html(trim($banned_user_agent)); } } if (!empty($_POST['banned_exclude_ips'])) { foreach (explode("\n", trim($_POST['banned_exclude_ips'])) as $banned_exclude_ip) { $banned_exclude_ips[] = esc_html(trim($banned_exclude_ip)); } } $allowed_tags = wp_kses_allowed_html('post'); $allowed_tags['a'] = array('href' => true, 'title' => true); $banned_message = !empty($_POST['banned_template_message']) ? wp_kses(trim($_POST['banned_template_message']), $allowed_tags) : ''; update_option('wp_multi_ban_options', $banned_options); update_option('wp_multi_ban_ips', $banned_ips); update_option('wp_multi_ban_ips_range', $banned_ips_range); update_option('wp_multi_ban_hosts', $banned_hosts); update_option('wp_multi_ban_referers', $banned_referers); update_option('wp_multi_ban_user_agents', $banned_user_agents); update_option('wp_multi_ban_exclude_ips', $banned_exclude_ips); update_option('wp_multi_ban_message', $banned_message); $text .= '
Einstellungen gespeichert.
'; } if (!empty($_POST['do']) && $_POST['do'] === 'Sperrstatistiken zurücksetzen') { check_admin_referer('wp_multi_ban_stats'); if (!empty($_POST['reset_ban_stats']) && $_POST['reset_ban_stats'] === 'yes') { update_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); $text .= '
Alle Sperrstatistiken zurückgesetzt.
'; } elseif (!empty($_POST['delete_ips'])) { $banned_stats = get_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); foreach ((array)$_POST['delete_ips'] as $delete_ip) { unset($banned_stats['users'][$delete_ip]); } update_option('wp_multi_ban_stats', $banned_stats); $text .= '
Ausgewählte IP-Statistiken zurückgesetzt.
'; } } $banned_ips = get_option('wp_multi_ban_ips', array()); $banned_ips_range = get_option('wp_multi_ban_ips_range', array()); $banned_hosts = get_option('wp_multi_ban_hosts', array()); $banned_referers = get_option('wp_multi_ban_referers', array()); $banned_user_agents = get_option('wp_multi_ban_user_agents', array()); $banned_exclude_ips = get_option('wp_multi_ban_exclude_ips', array()); $banned_stats = get_option('wp_multi_ban_stats', array('users' => array(), 'count' => 0)); $banned_options = get_option('wp_multi_ban_options', array('reverse_proxy' => 0)); $banned_ips_display = implode("\n", $banned_ips); $banned_ips_range_display = implode("\n", $banned_ips_range); $banned_hosts_display = implode("\n", $banned_hosts); $banned_referers_display = implode("\n", $banned_referers); $banned_user_agents_display = implode("\n", $banned_user_agents); $banned_exclude_ips_display = implode("\n", $banned_exclude_ips); ?>

WP Multi Ban Optionen

Ihre Details

Detail Wert
IP
Hostname
User Agent
Seiten-URL
Bitte nicht sich selbst sperren.

Sperrstatistiken

$count) { ?>
IP Versuche Auswählen
Keine Sperrversuche
Gesamtversuche:

Einstellungen

blog_id); wp_multi_ban_activate(); restore_current_blog(); } } else { wp_multi_ban_activate(); } } // Uninstall Hook register_uninstall_hook(__FILE__, 'wp_multi_toolkit_uninstall'); function wp_multi_toolkit_uninstall() { $options = array( 'wp_multi_ban_ips', 'wp_multi_ban_hosts', 'wp_multi_ban_stats', 'wp_multi_ban_message', 'wp_multi_ban_referers', 'wp_multi_ban_exclude_ips', 'wp_multi_ban_ips_range', 'wp_multi_ban_user_agents', 'wp_multi_ban_options' ); if (is_multisite()) { foreach (get_sites() as $site) { switch_to_blog($site->blog_id); foreach ($options as $option) { delete_option($option); } restore_current_blog(); } } else { foreach ($options as $option) { delete_option($option); } } }