diff --git a/assets/admin.css b/assets/admin.css new file mode 100644 index 0000000..0897d49 --- /dev/null +++ b/assets/admin.css @@ -0,0 +1,594 @@ +/** + * WP Multi Suite - Gemeinsames Admin-Design-System + * + * Alle Regeln sind unter .wpm-admin gescoped, damit keine fremden + * Admin-Seiten beeinflusst werden. Wird nur auf den eigenen Seiten + * geladen (Hook-Registry in wp-multi-toolkit.php). + */ + +.wpm-admin { + --wpm-primary: #0073aa; + --wpm-primary-dark: #005f8a; + --wpm-primary-light: #e8f4fa; + --wpm-success: #2ecc71; + --wpm-success-bg: #e9f7ef; + --wpm-warning: #f39c12; + --wpm-warning-bg: #fef5e7; + --wpm-danger: #e74c3c; + --wpm-danger-bg: #fdecea; + --wpm-info-bg: #e8f4fa; + --wpm-text: #2d3436; + --wpm-text-soft: #4a5568; + --wpm-text-muted: #718096; + --wpm-border: #e2e8f0; + --wpm-bg-soft: #f5f7fa; + --wpm-radius: 12px; + --wpm-radius-sm: 8px; + --wpm-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); + --wpm-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.05); + + max-width: 1200px; + margin: 20px 20px 20px 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; + color: var(--wpm-text); +} + +/* ---------- Marken-Header ---------- */ + +.wpm-admin .wpm-header { + display: flex; + align-items: center; + gap: 20px; + background: linear-gradient(135deg, var(--wpm-primary) 0%, var(--wpm-primary-dark) 100%); + border-radius: var(--wpm-radius); + padding: 22px 28px; + margin-bottom: 24px; + box-shadow: var(--wpm-shadow); + color: #fff; +} + +.wpm-admin .wpm-header__logo { + height: 52px; + width: auto; + flex-shrink: 0; + border-radius: var(--wpm-radius-sm); + background: rgba(255, 255, 255, 0.12); + padding: 6px; +} + +.wpm-admin .wpm-header__text { + min-width: 0; +} + +.wpm-admin .wpm-header__title { + margin: 0; + padding: 0; + font-size: 24px; + font-weight: 600; + line-height: 1.25; + color: #fff; +} + +.wpm-admin .wpm-header__sub { + margin: 4px 0 0; + font-size: 14px; + color: rgba(255, 255, 255, 0.85); +} + +/* ---------- Karten & Grid ---------- */ + +.wpm-admin .wpm-card { + background: #fff; + border-radius: var(--wpm-radius); + box-shadow: var(--wpm-shadow); + padding: 24px; + margin-bottom: 24px; + transition: transform 0.25s ease, box-shadow 0.25s ease; +} + +.wpm-admin .wpm-card:hover { + transform: translateY(-2px); +} + +.wpm-admin .wpm-card__title { + margin: 0 0 16px; + padding: 0 0 12px; + font-size: 18px; + font-weight: 600; + color: var(--wpm-text); + border-bottom: 1px solid var(--wpm-border); +} + +.wpm-admin .wpm-grid { + display: grid; + grid-template-columns: 1fr; + gap: 24px; + margin-bottom: 24px; +} + +.wpm-admin .wpm-grid--2 { + grid-template-columns: 1fr 1fr; +} + +.wpm-admin .wpm-grid--3 { + grid-template-columns: repeat(3, 1fr); +} + +.wpm-admin .wpm-grid > .wpm-card { + margin-bottom: 0; +} + +/* ---------- Formulare ---------- */ + +.wpm-admin .wpm-field { + display: grid; + grid-template-columns: 220px 1fr; + gap: 8px 24px; + align-items: start; + padding: 14px 0; + border-bottom: 1px solid var(--wpm-border); +} + +.wpm-admin .wpm-field:last-of-type { + border-bottom: none; +} + +.wpm-admin .wpm-field__label { + font-weight: 600; + font-size: 14px; + color: var(--wpm-text); + padding-top: 6px; +} + +.wpm-admin .wpm-field__hint { + display: block; + font-size: 12px; + color: var(--wpm-text-muted); + margin-top: 4px; + font-weight: 400; +} + +.wpm-admin .wpm-card input[type="text"], +.wpm-admin .wpm-card input[type="url"], +.wpm-admin .wpm-card input[type="email"], +.wpm-admin .wpm-card input[type="number"], +.wpm-admin .wpm-card input[type="date"], +.wpm-admin .wpm-card select, +.wpm-admin .wpm-card textarea { + width: 100%; + max-width: 640px; + padding: 10px 12px; + border: 1px solid var(--wpm-border); + border-radius: var(--wpm-radius-sm); + font-size: 14px; + line-height: 1.5; + background: #fff; + color: var(--wpm-text); + box-shadow: none; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.wpm-admin .wpm-card input:focus, +.wpm-admin .wpm-card select:focus, +.wpm-admin .wpm-card textarea:focus { + border-color: var(--wpm-primary); + box-shadow: 0 0 0 3px rgba(0, 115, 170, 0.12); + outline: none; +} + +/* Auswahl-Menüs klar als Dropdown erkennbar machen (eigener Pfeil) */ +.wpm-admin .wpm-card select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding-right: 36px; + cursor: pointer; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath fill='%23718096' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 14px center; + background-size: 10px 6px; +} + +.wpm-admin .wpm-card textarea { + resize: vertical; +} + +/* Settings-API-Markup (form-table) innerhalb Karten harmonisieren */ + +.wpm-admin .wpm-card .form-table { + margin-top: 0; + background: transparent; + border-radius: 0; + padding: 0; + box-shadow: none; +} + +.wpm-admin .wpm-card .form-table th { + font-weight: 600; + font-size: 14px; + color: var(--wpm-text); + width: 220px; + padding: 14px 24px 14px 0; +} + +.wpm-admin .wpm-card .form-table td { + padding: 14px 0; +} + +.wpm-admin .wpm-card .form-table tr { + border-bottom: 1px solid var(--wpm-border); +} + +.wpm-admin .wpm-card .description, +.wpm-admin .wpm-card small { + font-size: 12px; + color: var(--wpm-text-muted); + font-style: normal; +} + +/* ---------- Buttons ---------- */ + +.wpm-admin .wpm-btn, +.wpm-admin .button, +.wpm-admin .button-primary, +.wpm-admin .button-secondary { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 9px 18px; + border-radius: var(--wpm-radius-sm); + font-size: 14px; + font-weight: 500; + line-height: 1.4; + text-decoration: none; + cursor: pointer; + border: 1px solid var(--wpm-border); + background: var(--wpm-bg-soft); + color: var(--wpm-text); + transition: all 0.2s ease; + height: auto; + min-height: 0; +} + +.wpm-admin .wpm-btn--primary, +.wpm-admin .button-primary { + background: var(--wpm-primary); + border-color: var(--wpm-primary); + color: #fff; + text-shadow: none; + box-shadow: none; +} + +.wpm-admin .wpm-btn--primary:hover, +.wpm-admin .button-primary:hover { + background: var(--wpm-primary-dark); + border-color: var(--wpm-primary-dark); + color: #fff; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 115, 170, 0.3); +} + +.wpm-admin .wpm-btn:hover, +.wpm-admin .button:hover, +.wpm-admin .button-secondary:hover { + background: var(--wpm-border); + color: var(--wpm-text); + transform: translateY(-1px); +} + +.wpm-admin .wpm-btn--danger { + background: var(--wpm-danger); + border-color: var(--wpm-danger); + color: #fff; +} + +.wpm-admin .wpm-btn--danger:hover { + background: #c0392b; + border-color: #c0392b; + color: #fff; + box-shadow: 0 2px 8px rgba(231, 76, 60, 0.3); +} + +.wpm-admin .wpm-btn--ghost { + background: transparent; + border-color: transparent; + color: var(--wpm-primary); +} + +.wpm-admin .wpm-btn--ghost:hover { + background: var(--wpm-primary-light); + color: var(--wpm-primary-dark); +} + +/* ---------- Tabellen ---------- */ + +.wpm-admin .wpm-table-wrap { + border-radius: var(--wpm-radius-sm); + overflow: hidden; + box-shadow: var(--wpm-shadow-sm); + border: 1px solid var(--wpm-border); +} + +.wpm-admin table.wpm-table { + width: 100%; + border-collapse: collapse; + background: #fff; + border: none; + box-shadow: none; +} + +.wpm-admin table.wpm-table th { + background: var(--wpm-bg-soft); + font-weight: 600; + font-size: 13px; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--wpm-text); + padding: 14px 16px; + text-align: left; + border-bottom: 2px solid var(--wpm-border); +} + +.wpm-admin table.wpm-table td { + padding: 13px 16px; + font-size: 14px; + color: var(--wpm-text-soft); + border-bottom: 1px solid var(--wpm-border); +} + +.wpm-admin table.wpm-table tbody tr:last-child td { + border-bottom: none; +} + +.wpm-admin table.wpm-table tbody tr:nth-child(even) { + background: #fafbfc; +} + +.wpm-admin table.wpm-table tbody tr:hover { + background: var(--wpm-primary-light); +} + +.wpm-admin table.wpm-table th a { + color: var(--wpm-primary); + text-decoration: none; +} + +/* ---------- Notices ---------- */ + +.wpm-admin .wpm-notice { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 16px; + border-radius: var(--wpm-radius-sm); + margin-bottom: 20px; + font-size: 14px; + animation: wpmFadeIn 0.4s ease; +} + +.wpm-admin .wpm-notice--success { + background: var(--wpm-success-bg); + border-left: 4px solid var(--wpm-success); +} + +.wpm-admin .wpm-notice--warning { + background: var(--wpm-warning-bg); + border-left: 4px solid var(--wpm-warning); +} + +.wpm-admin .wpm-notice--error { + background: var(--wpm-danger-bg); + border-left: 4px solid var(--wpm-danger); +} + +.wpm-admin .wpm-notice--info { + background: var(--wpm-info-bg); + border-left: 4px solid var(--wpm-primary); +} + +@keyframes wpmFadeIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ---------- Badges / Status-Pills ---------- */ + +.wpm-admin .wpm-badge { + display: inline-block; + padding: 3px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 600; + line-height: 1.6; + background: var(--wpm-bg-soft); + color: var(--wpm-text-soft); +} + +.wpm-admin .wpm-badge--success { + background: var(--wpm-success-bg); + color: #1e8449; +} + +.wpm-admin .wpm-badge--warning { + background: var(--wpm-warning-bg); + color: #b9770e; +} + +.wpm-admin .wpm-badge--danger { + background: var(--wpm-danger-bg); + color: #b03a2e; +} + +/* ---------- Statistik-Kacheln ---------- */ + +.wpm-admin .wpm-stats { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 16px; + margin-bottom: 24px; +} + +.wpm-admin .wpm-stat-card { + background: #fff; + border-radius: var(--wpm-radius); + box-shadow: var(--wpm-shadow-sm); + border: 1px solid var(--wpm-border); + padding: 20px; + display: flex; + align-items: center; + gap: 14px; +} + +.wpm-admin .wpm-stat-card .dashicons { + font-size: 28px; + width: 28px; + height: 28px; + color: var(--wpm-primary); + flex-shrink: 0; +} + +.wpm-admin .wpm-stat-card__value { + font-size: 26px; + font-weight: 700; + color: var(--wpm-text); + line-height: 1.1; +} + +.wpm-admin .wpm-stat-card__label { + font-size: 12px; + color: var(--wpm-text-muted); + text-transform: uppercase; + letter-spacing: 0.04em; + margin-top: 2px; +} + +/* ---------- Tabs ---------- */ + +.wpm-admin .wpm-tabs { + display: flex; + gap: 4px; + margin-bottom: 24px; + border-bottom: 2px solid var(--wpm-border); +} + +.wpm-admin .wpm-tab { + padding: 10px 20px; + font-size: 14px; + font-weight: 500; + color: var(--wpm-text-soft); + text-decoration: none; + border-radius: var(--wpm-radius-sm) var(--wpm-radius-sm) 0 0; + border-bottom: 2px solid transparent; + margin-bottom: -2px; + transition: all 0.2s; +} + +.wpm-admin .wpm-tab:hover { + background: var(--wpm-bg-soft); + color: var(--wpm-text); +} + +.wpm-admin .wpm-tab--active { + color: var(--wpm-primary); + border-bottom-color: var(--wpm-primary); + font-weight: 600; +} + +/* ---------- Modul-Übersicht (Landing-Page) ---------- */ + +.wpm-admin .wpm-modules { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: 16px; +} + +.wpm-admin .wpm-module { + display: flex; + align-items: flex-start; + gap: 14px; + background: #fff; + border: 1px solid var(--wpm-border); + border-radius: var(--wpm-radius); + padding: 18px; + text-decoration: none; + color: var(--wpm-text); + box-shadow: var(--wpm-shadow-sm); + transition: all 0.2s ease; +} + +.wpm-admin .wpm-module:hover { + transform: translateY(-2px); + box-shadow: var(--wpm-shadow); + border-color: var(--wpm-primary); +} + +.wpm-admin .wpm-module .dashicons { + font-size: 26px; + width: 26px; + height: 26px; + color: var(--wpm-primary); + flex-shrink: 0; + margin-top: 2px; +} + +.wpm-admin .wpm-module__title { + font-size: 15px; + font-weight: 600; + margin: 0 0 4px; + color: var(--wpm-text); +} + +.wpm-admin .wpm-module__desc { + font-size: 12.5px; + color: var(--wpm-text-muted); + margin: 0; + line-height: 1.5; +} + +/* ---------- Footer ---------- */ + +.wpm-admin .wpm-footer { + text-align: center; + font-size: 12px; + color: var(--wpm-text-muted); + padding: 8px 0 20px; +} + +.wpm-admin .wpm-footer a { + color: var(--wpm-primary); + text-decoration: none; +} + +/* ---------- Responsive ---------- */ + +@media (max-width: 1024px) { + .wpm-admin .wpm-grid--2, + .wpm-admin .wpm-grid--3 { + grid-template-columns: 1fr; + } + + .wpm-admin .wpm-field { + grid-template-columns: 1fr; + } +} + +@media (max-width: 768px) { + .wpm-admin { + margin: 10px 10px 10px 0; + } + + .wpm-admin .wpm-header { + flex-direction: column; + text-align: center; + gap: 10px; + padding: 18px; + } + + .wpm-admin .wpm-card { + padding: 16px; + } + + .wpm-admin .wpm-table-wrap { + overflow-x: auto; + } +} diff --git a/wp-multi-toolkit.php b/wp-multi-toolkit.php index 10d552d..2b8b040 100644 --- a/wp-multi-toolkit.php +++ b/wp-multi-toolkit.php @@ -1,3405 +1,3459 @@ -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 (mit SQL-Injection-Schutz) - $create_table_query = $wpdb->get_row($wpdb->prepare('SHOW CREATE TABLE %s', $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) { - 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 (!current_user_can('manage_options')) { - wp_die(__('Du hast nicht die Berechtigung, diese Aktion auszuführen.', 'wp-multi-toolkit')); - } - if (isset($_POST['wpmt_action']) && $_POST['wpmt_action'] === 'delete_backup' && isset($_POST['backup_file']) && check_admin_referer('wpmt_delete_backup_nonce')) { - $backup_file = WPMT_BACKUP_DIR . sanitize_file_name($_POST['backup_file']); - if (file_exists($backup_file)) { - unlink($backup_file); - echo '
' . __('Backup erfolgreich gelöscht!', 'wp-multi-toolkit') . '
' . __('Backup-Datei nicht gefunden.', 'wp-multi-toolkit') . '
' . __('Einstellungen erfolgreich importiert!', 'wp-multi-toolkit') . '
' . __('Ungültige Datei.', 'wp-multi-toolkit') . '
' . __('Konfigurieren Sie automatische Backups und Benachrichtigungen.', 'wp-multi-toolkit') . '
'; - }, - 'wpmt_backup_settings' - ); - - add_settings_field( - 'wpmt_backup_schedule', - __('Backup-Zeitplan', 'wp-multi-toolkit'), - function() { - $schedule = get_option('wpmt_backup_schedule', 'none'); - ?> - - - > - -' . esc_html($backup_path->get_error_message()) . '
'; - } else { - echo '' . __('Datenbank-Backup erfolgreich erstellt!', 'wp-multi-toolkit') . '
Datenbankbereinigung abgeschlossen:
Hier kannst du gezielt Inhalte aus deiner Datenbank löschen oder bereinigen.
- - -' . __('Einstellungen gespeichert!', 'wp-multi-toolkit') . '
-
-
- [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')
- );
- $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-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;
- }
- ?>
- ' . __('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', - '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' - ) - ); - - ?> -🔴 ' . __('Update Server offline', 'wp-multi-toolkit') . '
'; - echo '%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( - '', - 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 '| ' . __('Plugin', 'wp-multi-toolkit') . ' | ' . __('Beschreibung', 'wp-multi-toolkit') . ' | ' . __('Status', 'wp-multi-toolkit') . ' | ' . __('Aktion', 'wp-multi-toolkit') . ' |
|---|---|---|---|
| ' . esc_html($plugins_to_check[$key]['name']) . ' | '; - echo '' . esc_html($plugin['description']) . ' | '; - echo ''; - if ($is_active) { - echo '' . __('Aktiv', 'wp-multi-toolkit') . ''; - } elseif ($is_installed) { - echo '' . __('Inaktiv', 'wp-multi-toolkit') . ''; - } else { - echo '' . __('Nicht installiert', 'wp-multi-toolkit') . ''; - } - echo ' | '; - echo ''; - if ($is_active) { - echo '—'; - } elseif ($is_installed) { - echo '' . __('Aktivieren', 'wp-multi-toolkit') . ''; - } else { - echo '' . __('Herunterladen', 'wp-multi-toolkit') . ''; - } - 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)); - $ip = ''; - - 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 $potential_ip) { - $potential_ip = trim($potential_ip); - if (filter_var($potential_ip, FILTER_VALIDATE_IP)) { - return $potential_ip; - } - } - } - } - } elseif (!empty($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { - $ip = explode(',', $_SERVER['REMOTE_ADDR'])[0]; - return $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 '| Detail | -Wert | -
|---|---|
| IP | -- |
| Hostname | -- |
| User Agent | -- |
| Seiten-URL | -- |
| Bitte nicht sich selbst sperren. | -|
%s
', + esc_url(admin_url('admin.php?page=' . $m[0])), + esc_attr($m[1]), + esc_html($m[2]), + esc_html($m[3]) + ); + } + echo '' . __('Backup erfolgreich gelöscht!', 'wp-multi-toolkit') . '
' . __('Backup-Datei nicht gefunden.', 'wp-multi-toolkit') . '
' . __('Ungültige Datei.', 'wp-multi-toolkit') . '
' . __('Einstellungen erfolgreich importiert!', 'wp-multi-toolkit') . '
' . __('Ungültige Datei.', 'wp-multi-toolkit') . '
' . __('Konfigurieren Sie automatische Backups und Benachrichtigungen.', 'wp-multi-toolkit') . '
'; + }, + 'wpmt_backup_settings' + ); + + add_settings_field( + 'wpmt_backup_schedule', + __('Backup-Zeitplan', 'wp-multi-toolkit'), + function() { + $schedule = get_option('wpmt_backup_schedule', 'none'); + ?> + + + > + +' . esc_html($backup_path->get_error_message()) . '
'; + } else { + echo '' . __('Datenbank-Backup erfolgreich erstellt!', 'wp-multi-toolkit') . '
' . 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' => $ip ? $ip : '', + 'consent_given' => 1, + 'timestamp' => current_time('mysql') + ), + array('%s', '%d', '%s') + ); + } + 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, deren Termin bereits verstrichen ist +function pubMissedPosts() { + 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); + $post_types = array_merge(['post', 'page'], array_values($post_types)); + + $placeholders = implode(',', array_fill(0, count($post_types), '%s')); + $sql = $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_type IN ($placeholders) AND post_status = 'future' AND post_date_gmt < %s", + array_merge($post_types, [$now]) + ); + + $resulto = $wpdb->get_results($sql); + if ($resulto) { + foreach ($resulto as $thisarr) { + wp_publish_post($thisarr->ID); + } + } +} + +// Läuft alle 5 Minuten per WP-Cron statt bei jedem Seitenaufruf (wp_head), um unnötige +// Datenbankabfragen auf jeder Frontend-Anfrage zu vermeiden. +function wpmt_schedule_pub_missed_posts() { + if (!wp_next_scheduled('wpmt_pub_missed_posts_event')) { + wp_schedule_event(time(), 'wpmt_five_minutes', 'wpmt_pub_missed_posts_event'); + } +} +add_action('wp', 'wpmt_schedule_pub_missed_posts'); +add_action('wpmt_pub_missed_posts_event', 'pubMissedPosts'); + +add_filter('cron_schedules', function ($schedules) { + if (!isset($schedules['wpmt_five_minutes'])) { + $schedules['wpmt_five_minutes'] = array( + 'interval' => 5 * MINUTE_IN_SECONDS, + 'display' => __('Alle 5 Minuten', 'wp-multi-toolkit'), + ); + } + return $schedules; +}); + + +/* + * 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 ''; + } + + $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 ''; + } else { + return ''; + } +} + +/** + * Rendert das Support-Ticket-Formular im Admin-Bereich. + */ +function support_ticket_form() { + $result_html = ''; + if (isset($_POST['submit_ticket']) && check_admin_referer('wp_multi_submit_ticket')) { + $plugin_name = sanitize_text_field($_POST['plugin_name']); + $title = sanitize_text_field($_POST['ticket_title']); + $description = sanitize_textarea_field($_POST['ticket_description']); + $label = sanitize_text_field($_POST['ticket_label']); + $result_html = send_support_ticket_to_server($plugin_name, $title, $description, $label); + } + + wpmt_admin_page_open( + __('Support', 'wp-multi-toolkit'), + __('Support-Tickets direkt an den Entwickler senden', 'wp-multi-toolkit') + ); + + if ($result_html) { + // Rückgabe enthält eine .success-message oder .error-message span + $type = strpos($result_html, 'success-message') !== false ? 'success' : 'error'; + wpmt_admin_notice($type, wp_strip_all_tags($result_html)); + } + + wpmt_admin_card_open(__('Neues Ticket', 'wp-multi-toolkit')); + ?> + + display_name ?: __('Freund', 'wp-multi-toolkit'); + + $assistant_responses = apply_filters('wpmt_assistant_responses', array( + 'default' => sprintf( + __('Ups, das habe ich nicht ganz verstanden, %s! 😅 Versuche es mit einer anderen Formulierung oder schau in die Dokumentation. Alternativ kannst du ein Support-Ticket erstellen, und wir helfen dir weiter!', 'wp-multi-toolkit'), + esc_html($user_name), + admin_url('admin.php?page=wpmt_docs'), + admin_url('admin.php?page=wp_multi_support') + ) + )); + + // Stichwörter für Autovervollständigung und Anzeige + $keywords = array_keys($assistant_responses); + unset($keywords[array_search('default', $keywords)]); + $keywords_list = implode(', ', array_map(function($key) { + return ucfirst(str_replace('-', ' ', $key)); + }, $keywords)); + + wpmt_admin_page_open( + __('Virtueller Assistent', 'wp-multi-toolkit'), + __('Fragen zu den WP-Multi-Plugins – Schritt für Schritt erklärt', 'wp-multi-toolkit') + ); + ?> +
+
+
+ [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-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;
+ }
+ ?>
+ ' . __('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', + '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' + ) + ); + + wpmt_admin_page_open( + __('Plugin-Dokumentation', 'wp-multi-toolkit'), + __('Übersicht aller WP Multi Plugins, Versionen und Update-Status', 'wp-multi-toolkit') + ); + + foreach ($wp_multi_plugins as $key => $plugin) { + wpmt_admin_card_open($plugin['name']); + + $is_installed = array_key_exists($plugin['file'], $installed_plugins); + if ($is_installed) { + $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin['file']); + $is_active = is_plugin_active($plugin['file']); + $installed_version = $plugin_data['Version']; + $latest_version = wpmt_get_latest_plugin_version($plugin['repo']); + $update_available = $latest_version && version_compare($latest_version, $installed_version, '>'); + ?> ++ : + +
++ : + + + + +
+:
+ + +:
+ + ++ : + +
+:
+ + $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'); + +// 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 '%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( + '', + 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 '| ' . __('Plugin', 'wp-multi-toolkit') . ' | ' . __('Beschreibung', 'wp-multi-toolkit') . ' | ' . __('Status', 'wp-multi-toolkit') . ' | ' . __('Aktion', 'wp-multi-toolkit') . ' |
|---|---|---|---|
| ' . esc_html($plugins_to_check[$key]['name']) . ' | '; + echo '' . esc_html($plugin['description']) . ' | '; + echo ''; + if ($is_active) { + echo '' . __('Aktiv', 'wp-multi-toolkit') . ''; + } elseif ($is_installed) { + echo '' . __('Inaktiv', 'wp-multi-toolkit') . ''; + } else { + echo '' . __('Nicht installiert', 'wp-multi-toolkit') . ''; + } + echo ' | '; + echo ''; + if ($is_active) { + echo '—'; + } elseif ($is_installed) { + echo '' . __('Aktivieren', 'wp-multi-toolkit') . ''; + } else { + echo '' . __('Herunterladen', 'wp-multi-toolkit') . ''; + } + 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 '| Detail | +Wert | +
|---|---|
| IP | ++ |
| Hostname | ++ |
| User Agent | ++ |
| Seiten-URL | ++ |
| Bitte nicht sich selbst sperren. | +|