';
wpmt_admin_card_close();
wpmt_admin_page_close();
}
/*
* DB Backup
*/
// Konstanten für wiederkehrende Pfade
define('WPMT_BACKUP_DIR', wp_upload_dir()['basedir'] . '/wpmt_backups/');
define('WPMT_BACKUP_URL', wp_upload_dir()['baseurl'] . '/wpmt_backups/');
/**
* Erstellt ein Backup der WordPress-Datenbank und speichert es als SQL-Datei.
*
* @return string|WP_Error Der Pfad zur Backup-Datei oder ein WP_Error-Objekt bei Fehlern.
*/
function wpmt_create_database_backup() {
global $wpdb;
// Dateinamen für das Backup definieren
$backup_filename = 'wp-database-backup-' . date('Y-m-d_H-i-s') . '.sql';
$backup_file_path = WPMT_BACKUP_DIR . $backup_filename;
// Sicherstellen, dass der Backup-Ordner existiert und beschreibbar ist
if (!is_writable(wp_upload_dir()['basedir'])) {
return new WP_Error('backup_error', __('Upload-Verzeichnis ist nicht beschreibbar.', 'wp-multi-toolkit'));
}
if (!file_exists(WPMT_BACKUP_DIR)) {
if (!wp_mkdir_p(WPMT_BACKUP_DIR)) {
return new WP_Error('backup_error', __('Backup-Ordner konnte nicht erstellt werden.', 'wp-multi-toolkit'));
}
}
// Hole alle Tabellen der Datenbank
$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
if (empty($tables)) {
return new WP_Error('backup_error', __('Keine Tabellen in der Datenbank gefunden.', 'wp-multi-toolkit'));
}
// Öffne die Backup-Datei
$backup_file = fopen($backup_file_path, 'w');
if (!$backup_file) {
return new WP_Error('backup_error', __('Backup-Datei konnte nicht geöffnet werden.', 'wp-multi-toolkit'));
}
// 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. Der Name stammt aus SHOW TABLES (vertrauenswürdig)
// und wird mit Backticks maskiert - prepare('%s') würde ihn fälschlich in
// einfache Anführungszeichen setzen, was ungültiges SQL ergibt und dazu
// führte, dass Backups keine CREATE-TABLE-Anweisungen enthielten.
$create_table_query = $wpdb->get_row('SHOW CREATE TABLE `' . str_replace('`', '', $table_name) . '`', ARRAY_N);
if ($create_table_query) {
fwrite($backup_file, $create_table_query[1] . ";\n\n");
}
// Daten der Tabelle in Batches holen (Performance-Optimierung)
$offset = 0;
$batch_size = 1000;
while ($rows = $wpdb->get_results($wpdb->prepare("SELECT * FROM `$table_name` LIMIT %d, %d", $offset, $batch_size), ARRAY_A)) {
foreach ($rows as $row) {
$columns = array_map(function ($col) use ($wpdb) {
// NULL-Werte müssen als SQL-Schlüsselwort NULL geschrieben werden,
// sonst würde beim Wiederherstellen ein Leerstring gespeichert.
if ($col === null) {
return 'NULL';
}
return $wpdb->prepare('%s', $col);
}, array_values($row));
$columns_str = implode(", ", $columns);
fwrite($backup_file, "INSERT INTO `$table_name` VALUES ($columns_str);\n");
}
$offset += $batch_size;
}
fwrite($backup_file, "\n\n");
}
// Datei schließen
fclose($backup_file);
return $backup_file_path;
}
/**
* Löscht ein Backup aus dem Backup-Verzeichnis.
*/
function wpmt_delete_backup() {
if (isset($_POST['wpmt_action']) && $_POST['wpmt_action'] === 'delete_backup' && isset($_POST['backup_file']) && check_admin_referer('wpmt_delete_backup_nonce')) {
if (!current_user_can('manage_options')) {
wp_die(__('Du hast nicht die erforderlichen Berechtigungen.', 'wp-multi-toolkit'));
}
$backup_file = WPMT_BACKUP_DIR . sanitize_file_name($_POST['backup_file']);
if (file_exists($backup_file)) {
unlink($backup_file);
echo '
';
wp_send_json_success(array('response' => $formatted_response));
}
add_action('wp_ajax_wpmt_assistant_query', 'wpmt_assistant_query');
/**
* AJAX-Handler für Feedback
*/
function wpmt_assistant_feedback() {
check_ajax_referer('wpmt_assistant_nonce', 'nonce');
$message = isset($_POST['message']) ? wp_kses_post($_POST['message']) : '';
$rating = isset($_POST['rating']) ? sanitize_text_field($_POST['rating']) : '';
$feedback_log = get_option('wpmt_assistant_feedback', array());
$feedback_log[] = array(
'message' => $message,
'rating' => $rating,
'timestamp' => current_time('mysql')
);
// Auf die letzten 200 Einträge begrenzen, damit die Option nicht unbegrenzt wächst
if (count($feedback_log) > 200) {
$feedback_log = array_slice($feedback_log, -200);
}
update_option('wpmt_assistant_feedback', $feedback_log);
wp_send_json_success();
}
add_action('wp_ajax_wpmt_assistant_feedback', 'wpmt_assistant_feedback');
// Die Assistenten-Seite wird zentral in wpmt_register_admin_menus() registriert.
/**
* Antworten vordefinieren
*/
add_filter('wpmt_assistant_responses', function($responses) {
$current_user = wp_get_current_user();
$user_name = $current_user->display_name ?: __('Freund', 'wp-multi-toolkit');
// WP Multi
$responses['statistik'] = sprintf(
__('Hey %s, willst du die Statistiken deiner Website im Blick haben? 📊 Füge den Shortcode [statistik_manager] in einen Beitrag oder eine Seite ein, um sie anzuzeigen. Oder gehe zu WP Stat & Notice, um Details wie Beitragsanzahl, Kommentare oder Kategorien zu sehen. Tipp: Aktiviere Benachrichtigungen für wichtige Updates! Bereit, deine Daten zu checken? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['telegram'] = sprintf(
__('Telegram-Benachrichtigungen einrichten, %s? Super einfach! 🔔 Gehe zu Notify > TG-Notify, erstelle einen Bot über BotFather und folge den Schritten, um ihn zu konfigurieren. Neue Beiträge oder Kommentare landen direkt in deinem Chat. Jetzt einrichten. Tipp: Teste den Bot mit einer Probemitteilung! Alles klar? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=tg-notify')
);
$responses['discord'] = sprintf(
__('Discord-Benachrichtigungen für deine Community, %s? 😄 Gehe zu Notify > DC-Notify, erstelle einen Webhook in deinem Discord-Server und füge ihn in den Einstellungen ein. Neue Beiträge werden automatisch gepostet. Los geht’s! Tipp: Nutze einen separaten Kanal für Benachrichtigungen! Bereit? 🌟', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wp-multi-dc-notify')
);
$responses['admin links'] = sprintf(
__('Eigene Admin-Links hinzufügen, %s? Perfekt für schnellen Zugriff! 🔧 Gehe zu Werkzeuge > Admin-Link hinzufügen, gib Namen und URL ein (z. B. für externe Tools) und speichere. Deine Links erscheinen im Admin-Menü. Tipp: Gruppiere Links für bessere Übersicht! Alles organisiert? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['gast-autor'] = sprintf(
__('Gastautoren auf deiner Seite, %s? 😊 Gehe zu Benutzer > Gastautor (Übersicht), füge Autoren hinzu und weise ihnen Beiträge zu. Ihre Namen erscheinen automatisch im Frontend. Tipp: Füge eine kurze Bio hinzu, um sie vorzustellen! Einfach, oder? ✨', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['beitrag report'] = sprintf(
__('Probleme mit Beiträgen, %s? 🧹 Unter Gemeldete Beiträge kannst du unangemessene Inhalte prüfen, bearbeiten oder löschen. So bleibt deine Seite sauber! Brauchst du Hilfe? Erstelle ein Support-Ticket. Alles unter Kontrolle? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wp_multi_support')
);
$responses['textbox'] = sprintf(
__('Eine Textbox am Beitragsende, %s? Ideal für Hinweise oder Werbung! ✨ Gehe zu WP Multi > Textbox, füge deinen Text ein und passe das Design an. Die Box erscheint automatisch unter Beiträgen. Tipp: Nutze auffällige Farben für mehr Aufmerksamkeit! Bereit? 😄', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['banner'] = sprintf(
__('Ein schickes Banner, %s? 🎨 Gehe zu WP Stat & Notice, lade ein Bild hoch und wähle Header oder Footer. Perfekt, um Neuigkeiten zu präsentieren! Tipp: Verwende Bilder mit hohem Kontrast für bessere Sichtbarkeit. Los geht’s! 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['inhaltsverzeichnis'] = sprintf(
__('Ein Inhaltsverzeichnis für deine Beiträge, %s? 🚀 Nutze den Shortcode [alphabetical_index], um alle Beiträge übersichtlich aufzulisten. Ideal für Blogs mit vielen Inhalten! Tipp: Kombiniere es mit Kategoriefiltern für mehr Struktur. Alles klar? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['lesezeichen'] = sprintf(
__('Lesezeichen für deine Besucher, %s? 😎 Mit [add_bookmark] können Nutzer Beiträge speichern, und [display_bookmarks] zeigt ihre Liste. Alles per Cookie – keine Datenbank nötig! Tipp: Füge die Shortcodes in eine Sidebar für schnellen Zugriff! Cool, oder? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['custom shortcode'] = sprintf(
__('Eigene Shortcodes erstellen, %s? Super flexibel! 😉 Gehe zu WP Multi > Shortcodes, lege deinen Shortcode an und füge ihn im Editor ein. Ideal für wiederkehrende Inhalte! Tipp: Dokumentiere deine Shortcodes für spätere Änderungen. Bereit zum Codieren? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['kommentar sperren'] = sprintf(
__('Bestimmte Nutzer blockieren, %s? 🛡️ Gehe zu Benutzer sperren, gib Benutzername, IP oder E-Mail ein und speichere. So bleibt die Kommentarspalte sauber! Tipp: Überprüfe die Sperrliste regelmäßig, um sie aktuell zu halten. Alles sicher? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['filter'] = sprintf(
__('Kommentare filtern, %s? 😊 Gehe zu Kommentare > Kommentar Filter und verbiete URLs, Schimpfwörter oder Telefonnummern. Verstöße werden mit * ersetzt. Tipp: Teste die Filter mit einem Probekommentar, um sicherzugehen! Deine Community wird’s lieben! 🌟', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['analytics'] = sprintf(
__('Datenanalyse für deine Beiträge, %s? 📊 Unter Benutzer > Benutzer Analytics siehst du Views, Kommentare, Top-Beiträge und mehr. Perfekt, um Inhalte zu optimieren! Tipp: Exportiere die Daten für langfristige Analysen. Bereit, ein Profi zu werden? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['pinwand'] = sprintf(
__('Nachrichten für dein Team, %s? 📌 Unter Pinnwand kannst du Notizen für Admins oder Redakteure hinterlegen. Erstelle, bearbeite oder lösche sie jederzeit. Tipp: Nutze die Pinnwand für wichtige To-Dos! Alles organisiert? 😄', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['brute force'] = sprintf(
__('Sicherheit zuerst, %s! 🛡️ Der Brute-Force-Schutz protokolliert Fehlversuche und sperrt nach 5 Versuchen. Einstellungen findest du unter Sicherheit. Tipp: Aktiviere Benachrichtigungen, um verdächtige Aktivitäten zu überwachen! Alles sicher? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['anti spam'] = sprintf(
__('Spam loswerden, %s? 😒 Aktiviere den Anti-Spam-Schutz unter Sicherheit, um Bots zu blockieren. Spam-Kommentare werden automatisch gefiltert. Tipp: Kombiniere es mit Kommentarfiltern für doppelten Schutz! Bereit? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['auto tag'] = sprintf(
__('Automatische Tags, %s? ⏳ Gehe zu Beiträge > Automatische Tags, füge fehlende Tags hinzu oder verbiete Wörter. Spart Zeit! Tipp: Überprüfe die Tags regelmäßig, um sie an deine Inhalte anzupassen. Alles klar? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['login deaktivieren'] = sprintf(
__('Logins deaktivieren, %s? 🔒 Gehe zu Benutzer > Alle Benutzer, wähle einen Benutzer und schalte den Login ab. Ideal für temporäre Sperren. Tipp: Notiere dir, wen du deaktiviert hast! Alles unter Kontrolle? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['text copy'] = sprintf(
__('Inhalte schützen, %s? 🛡️ Aktiviere die Rechtsklick-Sperre unter WP Multi-Einstellungen, um Texte vor Kopieren zu sichern. Perfekt für Blogs! Tipp: Füge einen Hinweis hinzu, warum Kopieren deaktiviert ist. Bereit? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['trash mail'] = sprintf(
__('Kein Bock auf Spam-Mails, %s? 😊 Wir blockieren Trash-Mails in Kommentaren automatisch. Die Liste wird vom Entwickler gepflegt – du musst nichts tun! Tipp: Aktiviere Anti-Spam für extra Schutz! Alles sauber? 🌟', 'wp-multi-toolkit'),
esc_html($user_name)
);
// WP Multi Comment Notifications
$responses['kommentar benachrichtigung'] = sprintf(
__('Immer über neue Kommentare informiert, %s? 🔔 Gehe zu Kommentare > Kommentar Benachrichtigung und richte E-Mail, Telegram oder Discord ein. Tipp: Filtere Benachrichtigungen, um nur wichtige zu erhalten! Nie wieder etwas verpassen! 😄', 'wp-multi-toolkit'),
esc_html($user_name)
);
// WP Multi Kategorie
$responses['kategorien ausblenden'] = sprintf(
__('Kategorien ausblenden, %s? 🗂️ Gehe zu Beiträge > Kategorie Filter und wähle, was im Frontend nicht angezeigt werden soll. Ideal für eine saubere Seite! Tipp: Teste Änderungen in der Vorschau! Alles organisiert? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
// WP Multi Search
$responses['suchfunktion'] = sprintf(
__('Eine starke Suche, %s? 🔍 Füge WP Multi Search über Shortcode, Widget oder Menü hinzu. Einstellungen findest du unter Einstellung > WP-Multi Search. Tipp: Aktiviere Autovervollständigung für bessere Ergebnisse! Bereit, alles zu finden? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
// WP Multi Team-Card
$responses['teamcard'] = sprintf(
__('Dein Team präsentieren, %s? 🌟 Mit WP Multi Team-Card erstellst du professionelle Teamkarten mit Namen, Funktionen und Bildern. Nutze [teamcards] im Frontend. Jetzt ausprobieren und dein Team ins Rampenlicht stellen! 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=teamcard_management')
);
$responses['teammitglied hinzufügen'] = sprintf(
__('Ein neues Teammitglied, %s? 😄 Gehe zu Team-Cards, gib Name, Funktion, Zuständigkeit und Bild ein und klicke auf Hinzufügen. Tipp: Wähle hochauflösende Bilder für beste Darstellung! Bereit fürs Update? ✨', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard shortcode'] = sprintf(
__('Teamkarten anzeigen, %s? 🚀 Nutze [teamcards] für alle Mitglieder oder [teamcards kategorie="slug"] für eine Kategorie. Füge den Shortcode in Beiträge ein. Tipp: Teste verschiedene Layouts! Alles klar? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard kategorie'] = sprintf(
__('Kategorien für Teamkarten, %s? 🗂️ Erstelle sie unter Beiträge > Kategorien und weise sie Mitgliedern zu. Zeige sie mit [teamcards kategorie="slug"]. Tipp: Sortiere Teams nach Abteilungen! Alles organisiert? 😎', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard bild'] = sprintf(
__('Ein Bild für ein Teammitglied, %s? 😊 In Team-Cards klickst du auf Bild auswählen und lädst ein Foto hoch. Es erscheint in der Teamkarte. Tipp: Nutze quadratische Bilder für einheitliches Design! Bereit? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard löschen'] = sprintf(
__('Ein Teammitglied entfernen, %s? 🗑️ Gehe zu Team-Cards, finde das Mitglied und klicke auf Löschen. Tipp: Sichere Daten vor dem Löschen! Schnell erledigt? 😄', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard reihenfolge'] = sprintf(
__('Reihenfolge der Teamkarten ändern, %s? 😎 In Team-Cards verschiebst du Mitglieder per Drag-and-Drop. Tipp: Speichere nach dem Sortieren, um Änderungen zu sichern! Alles sortiert? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['teamcard deinstallation'] = sprintf(
__('Team-Card deinstallieren, %s? ⚠️ Achtung: Alle Teammitglieder und Bilder werden gelöscht. Sichere Daten mit einem Backup! Mehr Infos: Mehr Infos. Alles klar? 😊', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper/wp-multi-teamcard'
);
$responses['teamcard updates'] = sprintf(
__('Updates für Team-Card, %s? 🚀 Schau auf git.viper.ipv64.net für die neueste Version. Updates werden auch im Admin-Bereich angezeigt. Tipp: Lies die Changelogs für neue Features! Bleib up to date! 😎', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper/wp-multi-teamcard'
);
// WP Multi Toolkit
$responses['update management'] = sprintf(
__('Updates im Griff, %s? 🌟 Im Dashboard-Widget Verfügbare Updates für WP Multi Toolkit siehst du den Status aller Plugins. Lade neue Versionen herunter und installiere sie. Jetzt prüfen. Tipp: Sichere deine Seite vor Updates! Bereit? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('index.php')
);
$responses['support issues'] = sprintf(
__('Hilfe nötig, %s? 😊 Erstelle ein Support-Ticket unter WP-Multi Support. Beschreibe dein Problem genau, und wir melden uns schnell! Ticket erstellen. Tipp: Screenshots helfen uns, schneller zu reagieren! Bereit? 🌟', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wp_multi_support')
);
$responses['dokumentation'] = sprintf(
__('Alles über WP Multi erfahren, %s? 📚 Die Dokumentation findest du unter WP-Multi Support > Dokumentation. Dort gibt’s Anleitungen und FAQs. Dokumentation ansehen. Tipp: Nutze die Suche in der Doku! Bereit? 😄', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['virtueller assistent'] = sprintf(
__('Das bin ich, %s! 😄 Dein virtueller Assistent für alle WP Multi Fragen. Stelle mir deine Fragen unter WP-Multi Support > Virtueller Assistent. Tipp: Frag nach spezifischen Features, ich kenne sie alle! Wie kann ich dir helfen? 🚀', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['toolbar'] = sprintf(
__('Die Schnellstart-Toolbar, %s? 🚀 Unten rechts findest du Support, Updates, Dokumentation und mich – alles in einem Klick! Tipp: Halte die Toolbar aktiviert für schnellen Zugriff! Praktisch, oder? 😊', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['wp multi plugins'] = sprintf(
__('Neugierig auf WP Multi Plugins, %s? 🌟 Hier die Übersicht:
WP Multi Toolkit: Zentrale für alle Plugins.
WP Multi: Viele Funktionen.
WP Multi Comment Notifications: Kommentar-Benachrichtigungen.
WP Multi Search: Smarte Suche.
WP Multi Kategorie: Kategoriefilter.
WP Multi Team-Cards: Teamkarten.
Mehr in der Dokumentation! 😎', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
// Allgemeine Fragen und Antworten
$responses['was sind wp multi plugins'] = sprintf(
__('WP Multi Plugins, %s? 🚀 Eine Sammlung cooler Tools für deine Website! Von Statistiken über Sicherheit bis Benachrichtigungen – alles dabei. Schau unter wp multi plugins oder auf git.viper.ipv64.net. Bereit, deine Seite zu boosten? 😄', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper'
);
$responses['wie installiere ich ein plugin'] = sprintf(
__('Ein Plugin installieren, %s? 😊 Gehe zu Plugins > Neu hinzufügen, lade die Datei von git.viper.ipv64.net hoch und aktiviere es. Oder per FTP in /wp-content/plugins/. Tipp: Lies die Doku für Details! Los geht’s! 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper'
);
$responses['wo finde ich updates'] = sprintf(
__('Updates, %s? 🌟 Im Dashboard-Widget Verfügbare Updates für WP Multi Toolkit oder auf git.viper.ipv64.net. Lade die neue Version hoch! Tipp: Sichere deine Seite vor Updates! Bleib frisch! 😎', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper'
);
$responses['wie erstelle ich ein support ticket'] = sprintf(
__('Ein Support-Ticket, %s? 😊 Gehe zu WP-Multi Support, wähle das Plugin, gib Titel und Beschreibung ein und sende es ab. Jetzt erstellen. Tipp: Füge Screenshots hinzu! Wir helfen schnell! 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wp_multi_support')
);
$responses['welche voraussetzungen gibt es'] = sprintf(
__('Voraussetzungen, %s? 📋 Mindestens WordPress 6.7.2 und PHP 7.4. Für Telegram/Discord brauchst du API-Keys. Details in der Dokumentation. Tipp: Prüfe deine Server-Einstellungen! Bereit? 😄', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['sind die plugins kostenlos'] = sprintf(
__('Kostenlos, %s? 😄 Ja, alle WP Multi Plugins sind gratis auf git.viper.ipv64.net! Tipp: Spende dem Entwickler einen Kaffee, wenn sie dir gefallen! Bereit? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper'
);
$responses['wie deaktiviere ich ein plugin'] = sprintf(
__('Plugin deaktivieren, %s? 😎 Gehe zu Plugins > Installierte Plugins, klicke auf Deaktivieren oder Löschen. Tipp: Deaktiviere vor Updates, um Konflikte zu vermeiden! Alles klar? 🌟', 'wp-multi-toolkit'),
esc_html($user_name)
);
$responses['wo finde ich die dokumentation'] = sprintf(
__('Dokumentation, %s? 📚 Unter WP-Multi Support > Dokumentation findest du Anleitungen und FAQs. Jetzt ansehen. Tipp: Nutze die Suche in der Doku! Bereit? 😊', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['wer entwickelt die plugins'] = sprintf(
__('Wer entwickelt sie, %s? 😊 M_Viper, ein WordPress-Fan! Besuche m-viper.de oder git.viper.ipv64.net. Tipp: Folge M_Viper für News! Cool, oder? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
'https://m-viper.de',
'https://git.viper.ipv64.net/M_Viper'
);
$responses['kann ich eigene funktionen hinzufügen'] = sprintf(
__('Eigene Funktionen, %s? 🌟 Die Plugins sind Open Source! Schau den Code auf git.viper.ipv64.net an. Ideen? Erstelle ein Ticket mit Verbesserung! Tipp: Teste in einer Staging-Umgebung! Bereit? 😎', 'wp-multi-toolkit'),
esc_html($user_name),
'https://git.viper.ipv64.net/M_Viper'
);
// Neue allgemeine Antworten
$responses['wie richte ich wp multi ein'] = sprintf(
__('WP Multi einrichten, %s? 🚀 Nach der Installation gehe zu WP-Multi Support und aktiviere die Plugins. Folge der Anleitung in der Dokumentation. Tipp: Prüfe, ob deine WordPress-Version aktuell ist! Bereit? 😄', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['was ist wordpress'] = sprintf(
__('WordPress, %s? 📝 Ein kostenloses CMS für Websites, Blogs oder Shops – ohne Programmierkenntnisse! WP Multi Plugins machen es noch besser. Mehr in der Dokumentation. Neugierig? 😊', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['wie sichere ich meine website'] = sprintf(
__('Website sichern, %s? 🛡️ Nutze WP Multi Features wie Brute-Force-Schutz und Anti-Spam unter Sicherheit. Erstelle Backups (z. B. mit UpdraftPlus) und aktiviere die Rechtsklick-Sperre. Mehr in der Dokumentation. Alles sicher? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['wie verbessere ich die performance'] = sprintf(
__('Performance boosten, %s? ⚡ Nutze WP Multi Search für schnelle Suchen und Caching-Plugins wie WP Super Cache. Optimiere Bilder und prüfe Ladezeiten unter Benutzer > Benutzer Analytics. Mehr in der Dokumentation. Bereit für Speed? 😎', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs')
);
$responses['wie kontaktiere ich den support'] = sprintf(
__('Support kontaktieren, %s? 😊 Erstelle ein Ticket unter WP-Multi Support (Ticket erstellen) oder besuche m-viper.de. Tipp: Beschreibe dein Problem genau! Bereit? 🌟', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wp_multi_support'),
'https://m-viper.de'
);
$responses['welche plugins sind kompatibel'] = sprintf(
__('Kompatible Plugins, %s? 🌟 WP Multi Plugins passen zu den meisten WordPress-Plugins, wenn sie die Standards einhalten. Teste in einer Staging-Umgebung. Probleme? Schau in die Dokumentation oder erstelle ein Support-Ticket! Alles klar? 😄', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs'),
admin_url('admin.php?page=wp_multi_support')
);
$responses['wie teste ich ein plugin'] = sprintf(
__('Plugin testen, %s? 😊 Installiere es in einer Staging-Umgebung oder lokal. Aktiviere es, teste Funktionen und prüfe Kompatibilität. Probleme? Schau in die Dokumentation oder kontaktiere den Support. Tipp: Deaktiviere andere Plugins, um Konflikte zu finden! Bereit? 🚀', 'wp-multi-toolkit'),
esc_html($user_name),
admin_url('admin.php?page=wpmt_docs'),
admin_url('admin.php?page=wp_multi_support')
);
return $responses;
});
/**
* Sicherstellen, dass jQuery geladen wird
*/
function wpmt_enqueue_scripts() {
wp_enqueue_script('jquery');
}
add_action('admin_enqueue_scripts', 'wpmt_enqueue_scripts');
/*
* Schnellzugriff-Menü (Floating Toolbar)
*/
function wpmt_add_floating_toolbar() {
if (!current_user_can('manage_options') || !is_admin()) {
return;
}
?>
',
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(
'
';
}
// 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');
wp_clear_scheduled_hook('wpmt_pub_missed_posts_event');
}
// Hinweis: register_uninstall_hook() erlaubt pro Plugin-Datei nur EINEN registrierten
// Callback (ein zweiter Aufruf würde den ersten überschreiben). Deshalb wird
// wpmt_uninstall() aus wp_multi_toolkit_uninstall() heraus aufgerufen statt hier
// separat registriert.
/*
* Ban Funktion
*/
// Der Ban-System-Menüpunkt wird zentral in wpmt_register_admin_menus() registriert.
// 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');
}
check_ajax_referer('wp_multi_ban_preview');
$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, true)) {
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();
if (!empty($_POST['banned_ips'])) {
foreach (explode("\n", trim($_POST['banned_ips'])) as $banned_ip) {
$banned_ip = trim($banned_ip);
// Schützt die IP des aktuell handelnden Admins vor versehentlichem Aussperren -
// unabhängig vom Benutzernamen (vorher nur für den Benutzernamen "admin" wirksam).
if ($banned_ip === $admin_ip) {
$text .= '
Diese IP \'' . esc_html($banned_ip) . '\' ist deine eigene und wird nicht gesperrt.