From aa6ce3d6b393720e2e8abebdda8a22de6639a4bd Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 6 Mar 2025 21:37:25 +0000 Subject: [PATCH] Dateien nach "/" hochladen --- wp-multi.php | 5140 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5140 insertions(+) create mode 100644 wp-multi.php diff --git a/wp-multi.php b/wp-multi.php new file mode 100644 index 0000000..b8a7800 --- /dev/null +++ b/wp-multi.php @@ -0,0 +1,5140 @@ + true, + 'html_images' => true, + 'plaintext_urls' => true, + 'youtube_videos' => true, + 'googlevideo_videos' => true, + 'youtube_playlists' => true, + 'old_youtube_videos' => true, + 'smart_youtube' => true, + 'dailymotion_videos' => true, + 'vimeo_videos' => true, + ]); + + ?> +
+ + +
+

Status

+ + +

Link-Überprüfung: Alle Stunden

+

Vorhandene Links werden regelmäßig erneut kontrolliert. Neue Links werden normalerweise sofort geprüft.

+
+ +

Link-Überprüfung

+ + + + + + + +
+ +

E-Mail-Benachrichtigungen

+
+ + + + +

+ + +

+ + +

+ + + +

+ +

Link-Typen zur Überprüfung

+
+ Wählen Sie die Link-Typen, die Sie überprüfen möchten: + +
+
+
+
+
+
+
+
+
+
+ +
+
+

Link-Einstellungen

+ +

+ +
+ +
+ + + + + + 'any', 'posts_per_page' => -1]); + + // Holen Sie sich die vom Benutzer ausgewählten Linktypen + $checked_link_types = get_option('wp_multi_broken_link_checked_types', [ + 'html_links' => true, + 'html_images' => true, + 'plaintext_urls' => true, + 'youtube_videos' => true, + 'googlevideo_videos' => true, + 'youtube_playlists' => true, + 'old_youtube_videos' => true, + 'smart_youtube' => true, + 'dailymotion_videos' => true, + 'vimeo_videos' => true, + ]); + + $broken_links = []; + $all_links = []; + $total_links = 0; + + // Definiere die Regex-Pattern für die verschiedenen Linktypen + $patterns = [ + 'html_links' => '/ '/]*src=["\'](https?:\/\/[^\s]+)["\']/', // Bilder-Links + 'plaintext_urls' => '/https?:\/\/[^\s]+/', // Klartext-URLs + 'youtube_videos' => '/https:\/\/www\.youtube\.com\/watch\?v=([a-zA-Z0-9_-]+)/', // YouTube Videos + 'googlevideo_videos' => '/https:\/\/video\.google\.com\/videoplay\?docid=([a-zA-Z0-9_-]+)/', // Google Video + 'youtube_playlists' => '/https:\/\/www\.youtube\.com\/playlist\?list=([a-zA-Z0-9_-]+)/', // YouTube Playlists + 'old_youtube_videos' => '/https:\/\/youtube\.com\/v\/([a-zA-Z0-9_-]+)/', // Alter YouTube Code + 'smart_youtube' => '/httpv:\/\/(?:www\.)?youtube\.com\/(?:watch\?v=|v\/)([a-zA-Z0-9_-]+)/', // Smart YouTube + 'dailymotion_videos' => '/https:\/\/www\.dailymotion\.com\/video\/([a-zA-Z0-9_-]+)/', // DailyMotion Videos + 'vimeo_videos' => '/https:\/\/vimeo\.com\/([0-9]+)/', // Vimeo Videos + ]; + + // Schleife durch die Beiträge und Links sammeln + foreach ($posts as $post) { + preg_match_all('/https?:\/\/[^\s]+/', $post->post_content, $matches); + $all_links = array_merge($all_links, $matches[0]); + } + + $total_links = count($all_links); + $broken_links_count = 0; + + // Filtere Links nach den vom Benutzer ausgewählten Typen + $filtered_links = []; + foreach ($checked_link_types as $type => $checked) { + if ($checked && isset($patterns[$type])) { + $filtered_links = array_merge($filtered_links, preg_grep($patterns[$type], $all_links)); + } + } + + // Überprüfe nur die gefilterten Links + foreach ($filtered_links as $link) { + $response = wp_remote_get($link, ['timeout' => 10]); // Timeout auf 10 Sekunden gesetzt + + if (is_wp_error($response) || wp_remote_retrieve_response_code($response) == 404) { + $broken_links[] = $link; + $broken_links_count++; + } + } + + wp_send_json([ + 'broken_links' => array_unique($broken_links), + 'total_links' => $total_links, + 'broken_links_count' => $broken_links_count, + ]); +} + +// Optionen für den Broken Link Checker registrieren +function wp_multi_broken_link_settings_init() { + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_email_notifications'); + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_send_admin_email'); + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_send_author_email'); + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_notification_email'); + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_check_interval'); + register_setting('wp_multi_broken_link_settings', 'wp_multi_broken_link_checked_types'); +} +add_action('admin_init', 'wp_multi_broken_link_settings_init'); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* +* Login deaktivieren +*/ + + +// Checkbox zum Benutzerprofil hinzufügen +function wp_multi_add_disable_login_checkbox($user) { + ?> +

Login deaktivieren

+ + + + + +
+ ID, 'disable_login', true), 1 ); ?> /> + Markiere diese Option, um den Login des Benutzers zu deaktivieren. +
+ ID, 'disable_login', true ) ) { + // Fehlermeldung anzeigen, wenn der Login deaktiviert ist + wp_die( 'Dein Login wurde deaktiviert. Bitte kontaktiere den Administrator.' ); + } +} + +// Der Filter wird bei jedem Login-Versuch angewendet +add_action( 'wp_login', 'wp_multi_block_login_if_disabled', 10, 2 ); + + +/* +* Auto Tag +*/ + + +// Automatische Tags zu Beiträgen hinzufügen +function wp_multi_auto_add_tags($post_id) { + if (get_post_type($post_id) !== 'post' || wp_is_post_revision($post_id)) return; + + $existing_tags = wp_get_post_tags($post_id, ['fields' => 'names']); + if (!empty($existing_tags)) return; + + $post = get_post($post_id); + $content = strip_tags($post->post_content); + $content = strtolower($content); + + // Stopwörter aus der Admin-Eingabe holen + $custom_stopwords = get_option('wp_multi_custom_stopwords', ''); + $custom_stopwords = array_map('trim', explode(',', $custom_stopwords)); // In ein Array umwandeln + + // Standard-Stopwörter + $default_stopwords = ['und', 'oder', 'ein', 'eine', 'der', 'die', 'das', 'in', 'mit', 'auf', 'zu', 'von', + 'für', 'ist', 'es', 'im', 'an', 'am', 'bei', 'auch', 'aber', 'so', 'dass', 'kann', + 'wenn', 'wie', 'wir', 'man', 'nur', 'nicht', 'mehr', 'als', 'sein', 'wurde', 'werden', + 'hat', 'haben', 'schon', 'doch', 'denn', 'diese', 'dieser', 'dieses', 'nach', 'sehr', 'Allgemein']; + + // Alle Stopwörter (standard und benutzerdefiniert) + $stopwords = array_merge($default_stopwords, $custom_stopwords); + + preg_match_all('/\b[a-zäöüß]{4,}\b/u', $content, $matches); + $words = array_unique(array_diff($matches[0], $stopwords)); + + $word_counts = array_count_values($words); + arsort($word_counts); + + $top_tags = array_slice(array_keys($word_counts), 0, 5); + if (!empty($top_tags)) { + wp_set_post_tags($post_id, implode(',', $top_tags), true); + } +} + +// Menüeintrag für Automatische Tags +function wp_multi_admin_menu() { + add_submenu_page( + 'edit.php', + 'Automatische Tags', + 'Automatische Tags', + 'manage_options', + 'wp-multi-auto-tags', + 'wp_multi_auto_tags_page' + ); +} +add_action('admin_menu', 'wp_multi_admin_menu'); + +// Menüseite mit Banner & schöner Progress Bar +function wp_multi_auto_tags_page() { + ?> +
+ +
+ M_Viper Logo +

Automatische Tags

+
+ +

Diese Funktion fügt automatisch Tag zu Beiträgen hinzu, die noch keine haben.

+ +
+ +

+
+ +
+ Trenne die Wörter durch Kommas, z. B. "wird, auch, aber". +

+

+
+ + + +
+
0%
+
+ +

+
+ + + + + + 'post', 'posts_per_page' => -1, 'fields' => 'ids']; + $posts = get_posts($args); + + set_transient('wp_multi_auto_tags_queue', $posts, 300); + + wp_send_json(['total' => count($posts)]); +} + +add_action('wp_ajax_wp_multi_process_auto_tags_step', 'wp_multi_process_auto_tags_step'); +function wp_multi_process_auto_tags_step() { + $queue = get_transient('wp_multi_auto_tags_queue'); + $batchSize = isset($_POST['batchSize']) ? intval($_POST['batchSize']) : 10; + + if (!$queue || empty($queue)) { + wp_send_json(['done' => false]); + } + + $posts_to_process = array_splice($queue, 0, $batchSize); + + foreach ($posts_to_process as $post_id) { + wp_multi_auto_add_tags($post_id); + } + + set_transient('wp_multi_auto_tags_queue', $queue, 300); + + wp_send_json(['done' => true]); +} + + +/* +* Admin - Panel Banner +*/ + + +// Admin-Banner als Notice mit Blauem Hintergrund (#0073aa) +function wp_multi_add_warning_banner() { + echo ' +
+

Danke, dass du WP Multi verwendest! Dein Feedback hilft uns, das Plugin ständig zu verbessern. Wenn du Fehler entdeckst oder Verbesserungsvorschläge hast, besuche bitte unsere Gitea-Seite und teile uns deine Ideen mit!

+
'; +} +add_action('admin_notices', 'wp_multi_add_warning_banner'); + + +/* +* Anti Spam Honey +*/ + + +// Standardwerte setzen +function wp_multi_set_default_options() { + add_option('wp_multi_honeypot_field', 'iwlxja5187'); + add_option('wp_multi_honeypot_error', 'Spamming or your Javascript is disabled !!'); + add_option('wp_multi_honeypot_widget', 0); + add_option('wp_multi_max_links', 3); + add_option('wp_multi_blocked_keywords', 'viagra,casino,bitcoin'); + add_option('wp_multi_blocked_ips', ''); + add_option('wp_multi_blocked_comments', 0); // Zähler für blockierte Kommentare + add_option('wp_multi_honeypot_hits', 0); // Zähler für Honeypot-Aktivierungen + add_option('wp_multi_spammer_ips', []); // Liste der blockierten Spammer-IP-Adressen + add_option('wp_multi_spam_submissions', []); // Liste der Spam-Einreichungen +} +register_activation_hook(__FILE__, 'wp_multi_set_default_options'); + +// Menüpunkt "Sicherheit" und Statistik hinzufügen +function wp_multi_add_security_menu() { + add_menu_page( + 'Sicherheit', + 'Sicherheit', + 'manage_options', + 'wp-multi-security', + 'wp_multi_security_settings_page', + 'dashicons-shield', + 80 + ); + add_submenu_page( + 'wp-multi-security', + 'WP Multi Statistik', + 'WP Multi Statistik', + 'manage_options', + 'wp-multi-statistics', + 'wp_multi_statistics_page' + ); +} +add_action('admin_menu', 'wp_multi_add_security_menu'); + +// Einstellungsseite mit CSS & JS für Generator +function wp_multi_security_settings_page() { + ?> +
+
+ WP Multi Logo +

WP Multi - Anti Spam

+
+
+ +
+
+ + + +
+
+ WP Multi Logo +

WP Multi - Anti Spam Statistik

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
StatistikWert
Blockierte Kommentare
Aktivierte Honeypot-Felder
Spammer-IP-Adressen
Spam-Einreichungen
+ +

Spammer-IP-Adressen

+ +
    + +
  • + +
+ +

Keine Spammer-IP-Adressen gefunden.

+ +
+
+ + + '; + echo ''; + echo ''; + echo ''; +} + +function wp_multi_honeypot_error_callback() { + echo ''; +} + +function wp_multi_honeypot_widget_callback() { + $checked = get_option('wp_multi_honeypot_widget') ? 'checked' : ''; + echo ' Deaktivieren'; +} + +function wp_multi_max_links_callback() { + echo ''; +} + +function wp_multi_blocked_keywords_callback() { + echo ''; +} + +function wp_multi_blocked_ips_callback() { + echo ''; +} + + +// Prüfen, ob das Kommentar ein Spam ist +function wp_multi_is_spam($commentdata) { + $honeypot_field = get_option('wp_multi_honeypot_field'); + if (!empty($commentdata['comment_' . $honeypot_field])) { + wp_multi_log_spam_submission($commentdata['comment_author_IP']); + wp_die(get_option('wp_multi_honeypot_error')); + } + + // Weitere Anti-Spam-Checks hier (Keywords, Links etc.) + return $commentdata; +} +add_filter('preprocess_comment', 'wp_multi_is_spam'); + +// Spam-Einreichung protokollieren +function wp_multi_log_spam_submission($ip_address) { + $spam_submissions = get_option('wp_multi_spam_submissions', []); + $spam_submissions[] = ['ip' => $ip_address, 'time' => current_time('mysql')]; + update_option('wp_multi_spam_submissions', $spam_submissions); + + // Spam IPs blockieren + $spammer_ips = get_option('wp_multi_spammer_ips', []); + if (!in_array($ip_address, $spammer_ips)) { + $spammer_ips[] = $ip_address; + update_option('wp_multi_spammer_ips', $spammer_ips); + } + + // Zähler für blockierte Kommentare erhöhen + $blocked_comments = get_option('wp_multi_blocked_comments', 0); + update_option('wp_multi_blocked_comments', ++$blocked_comments); +} + +// HappyForms-Integration: Honeypot-Feld hinzufügen +function wp_multi_happyforms_add_honeypot($form) { + $honeypot_field = get_option('wp_multi_honeypot_field'); + echo '
'; + echo ''; + echo ''; + echo '
'; +} +add_action('happyforms_part_input_after', 'wp_multi_happyforms_add_honeypot'); + +// HappyForms: Spam-Erkennung +function wp_multi_happyforms_check_honeypot($submission) { + $honeypot_field = get_option('wp_multi_honeypot_field'); + + if (!empty($_POST[$honeypot_field])) { + wp_multi_log_spam_submission($_SERVER['REMOTE_ADDR']); + wp_die(get_option('wp_multi_honeypot_error')); + } + + return $submission; +} +add_filter('happyforms_validate_submission', 'wp_multi_happyforms_check_honeypot'); + + +/* +* Schutz vor Brute-Force-Angriffen +*/ + + +// Funktion zur Erfassung der echten IP-Adresse des Benutzers +function get_user_ip() { + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + return $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + return $_SERVER['REMOTE_ADDR']; + } +} + +// Funktion zur Verfolgung von fehlgeschlagenen Anmeldeversuchen +function wp_multi_log_failed_login($username) { + global $wpdb; + + // Holen der IP-Adresse + $ip = get_user_ip(); + $table_name = $wpdb->prefix . 'blocked_ips'; // Tabelle für blockierte IPs + $user = get_user_by('login', $username); // Benutzerinformationen basierend auf dem Anmeldenamen + + // Überprüfen, ob die IP bereits in der Tabelle existiert + $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE ip = %s", $ip)); + + if ($row) { + // Wenn die IP existiert, erhöhen wir die Anzahl der fehlgeschlagenen Versuche + $wpdb->update( + $table_name, + array('attempts' => $row->attempts + 1, 'last_attempt' => current_time('mysql')), + array('ip' => $ip) + ); + } else { + // Wenn die IP nicht existiert, fügen wir sie hinzu + $wpdb->insert( + $table_name, + array('ip' => $ip, 'attempts' => 1, 'last_attempt' => current_time('mysql')) // Die `last_attempt` sollte ebenfalls beim Einfügen gesetzt werden + ); + } + + // Zähler für E-Mails und Versuche (maximal 3 E-Mails) + $max_attempts = 3; + + // Wenn die Anzahl der Versuche größer oder gleich 5 ist, blockiere die IP und sende E-Mails + if ($row && $row->attempts >= 5) { + // Prüfen, ob bereits mehr als 3 E-Mails versendet wurden + $email_sent = get_option('failed_login_email_sent_' . $ip, 0); + + if ($email_sent < $max_attempts) { + // E-Mail an den betroffenen Benutzer senden (falls der Benutzer existiert) + if ($user) { + wp_mail( + $user->user_email, + 'Deine IP-Adresse wurde gesperrt', + 'Hallo ' . $user->user_login . ',\n\nDeine IP-Adresse wurde aufgrund zu vieler fehlgeschlagener Anmeldeversuche gesperrt. Bitte kontaktiere den Administrator, falls du Unterstützung benötigst.', + array('Content-Type: text/plain; charset=UTF-8') + ); + // Zähler erhöhen + update_option('failed_login_email_sent_' . $ip, $email_sent + 1); + } + + // E-Mail an den Administrator senden + $admin_email = get_option('admin_email'); + wp_mail( + $admin_email, + 'Brute-Force-Angriff erkannt', + 'Es wurde ein Brute-Force-Angriff auf deine WordPress-Seite erkannt. Die IP-Adresse ' . $ip . ' wurde nach mehreren fehlgeschlagenen Anmeldeversuchen blockiert.', + array('Content-Type: text/plain; charset=UTF-8') + ); + // Zähler erhöhen + update_option('failed_login_email_sent_' . $ip, $email_sent + 1); + } + + // Benutzer sperren und eine Fehlermeldung anzeigen + wp_die("Deine IP-Adresse wurde aufgrund zu vieler Fehlversuche gesperrt. Bitte versuche es später noch einmal."); + } +} + +// Funktion zur Überwachung von Benutzeranmeldungen +function wp_multi_failed_login_hook($username) { + wp_multi_log_failed_login($username); +} + +// Hook zum Abfangen fehlgeschlagener Anmeldungen +add_action('wp_login_failed', 'wp_multi_failed_login_hook'); + +// Funktion zur Erstellung der Tabelle für blockierte IPs (Einmal bei der Installation ausführen) +function wp_multi_create_blocked_ips_table() { + global $wpdb; + + $table_name = $wpdb->prefix . 'blocked_ips'; // Tabelle für blockierte IPs + $charset_collate = $wpdb->get_charset_collate(); + + // SQL-Anweisung zur Erstellung der Tabelle + $sql = "CREATE TABLE $table_name ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + ip varchar(45) NOT NULL, + attempts int NOT NULL DEFAULT 0, + last_attempt datetime NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); // Tabellen erstellen oder aktualisieren +} + +// Diese Funktion wird beim Aktivieren des Plugins aufgerufen +register_activation_hook(__FILE__, 'wp_multi_create_blocked_ips_table'); + +function wp_multi_blocked_ips_menu() { + add_submenu_page( + 'wp-multi-security', // Übergeordnetes Menü: "Sicherheit" + 'Blockierte IPs', // Titel der Seite + 'Blockierte IPs', // Menüname + 'manage_options', // Berechtigung (nur Administratoren) + 'wp_multi_blocked_ips', // Slug + 'wp_multi_display_blocked_ips' // Callback-Funktion + ); +} +add_action('admin_menu', 'wp_multi_blocked_ips_menu'); + +// Callback-Funktion für die Anzeige der blockierten IPs +function wp_multi_display_blocked_ips() { + global $wpdb; + + // Tabelle für blockierte IPs + $table_name = $wpdb->prefix . 'blocked_ips'; + + // Berechnen des Datums vor 5 Tagen + $five_days_ago = date('Y-m-d H:i:s', strtotime('-5 days')); + + // Berechnung der Pagination + $per_page = 50; + $page = isset($_GET['paged']) ? intval($_GET['paged']) : 1; + $offset = ($page - 1) * $per_page; + + // Hole alle blockierten IPs aus der Datenbank, die innerhalb der letzten 5 Tage liegen + $blocked_ips = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $table_name WHERE last_attempt >= %s ORDER BY last_attempt DESC LIMIT %d OFFSET %d", + $five_days_ago, + $per_page, + $offset + ) + ); + + // Wenn keine blockierten IPs vorhanden sind + if (empty($blocked_ips)) { + echo '

Keine blockierten IPs gefunden

'; + return; + } + + // HTML-Tabelle zur Anzeige der blockierten IPs + echo '

Blockierte IPs (letzte 5 Tage)

'; + echo ''; + echo ''; + echo ''; + + foreach ($blocked_ips as $ip) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo ''; + echo '
IDIP-AdresseVersucheLetzter VersuchAktionen
' . $ip->id . '' . $ip->ip . '' . $ip->attempts . '' . $ip->last_attempt . 'Entfernen
'; + + // Berechne die Gesamtzahl der blockierten IPs + $total_ips = $wpdb->get_var("SELECT COUNT(*) FROM $table_name WHERE last_attempt >= '$five_days_ago'"); + + // Pagination + $total_pages = ceil($total_ips / $per_page); + if ($total_pages > 1) { + echo '
'; + for ($i = 1; $i <= $total_pages; $i++) { + $class = ($i == $page) ? ' class="current"' : ''; + echo '' . $i . ' '; + } + echo '
'; + } + + // Automatische Löschung von IPs mit weniger als 10 Versuchen, die älter als 3 Tage sind + $three_days_ago = date('Y-m-d H:i:s', strtotime('-3 days')); + $wpdb->query( + $wpdb->prepare( + "DELETE FROM $table_name WHERE attempts < 10 AND last_attempt < %s", + $three_days_ago + ) + ); +} + +// Funktion zum Entfernen einer blockierten IP +function wp_multi_remove_blocked_ip() { + if (!current_user_can('manage_options')) { + wp_die('Du hast nicht die erforderlichen Berechtigungen, um diese Aktion durchzuführen.'); + } + + global $wpdb; + + // Hole die IP-ID aus der URL + $id = isset($_GET['id']) ? intval($_GET['id']) : 0; + + if ($id > 0) { + // Lösche die blockierte IP aus der Datenbank + $table_name = $wpdb->prefix . 'blocked_ips'; + $wpdb->delete($table_name, array('id' => $id)); + } + + // Weiterleitung zurück zur Admin-Seite der blockierten IPs + wp_redirect(admin_url('users.php?page=wp_multi_blocked_ips')); + exit; +} +add_action('admin_post_remove_blocked_ip', 'wp_multi_remove_blocked_ip'); + + +/* +* Admin - Pinnwand +*/ + +// Funktion zum Erstellen der Datenbanktabelle für Nachrichten +function wp_multi_create_message_board_table() { + global $wpdb; + + $table_name = $wpdb->prefix . 'message_board'; // Tabelle für Nachrichten + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $table_name ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + message text NOT NULL, + user_id bigint(20) NOT NULL, + created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); +} +register_activation_hook(__FILE__, 'wp_multi_create_message_board_table'); + +// Funktion zum Anzeigen der Nachrichten im Adminbereich +function wp_multi_add_message_board() { + if (!current_user_can('administrator')) { + return; + } + + ?> + + +
+

Pinwand

+ +

Neue Nachricht erstellen

+
+

+ +
+ + prefix . 'message_board'; + $messages = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC"); + + if ($messages) { + echo '
'; + foreach ($messages as $message) { + $user_info = get_userdata($message->user_id); + echo '
'; + echo '' . esc_html($user_info->user_login) . ' (' . date('d-m-Y H:i:s', strtotime($message->created_at)) . ')'; + echo '

' . wp_trim_words($message->message, 20) . '...

'; // Zeige nur eine Vorschau + echo '
'; + } + echo '
'; + } else { + echo '

Keine Nachrichten vorhanden.

'; + } + ?> + +
+ +
+
+ +
+ + +
+
+ + + prefix . 'message_board'; + $wpdb->insert( + $table_name, + array( + 'message' => $new_message, + 'user_id' => $user_id + ) + ); + echo '

Nachricht wurde erfolgreich erstellt.

'; + echo ""; // Seite neu laden + } +} + +// Menüeintrag im Adminbereich hinzufügen +function wp_multi_add_message_board_menu() { + add_menu_page( + 'Pinwand', // Seitentitel + 'Pinwand', // Menüeintrag + 'manage_options', // Berechtigung + 'message-board', // Slug + 'wp_multi_add_message_board', // Callback + 'dashicons-bell', // Icon + 6 // Position im Menü + ); +} +add_action('admin_menu', 'wp_multi_add_message_board_menu'); + +// Funktion zum Abrufen der vollständigen Nachricht +function wp_multi_get_message() { + if (isset($_POST['message_id'])) { + global $wpdb; + $table_name = $wpdb->prefix . 'message_board'; + $message_id = intval($_POST['message_id']); + $message = $wpdb->get_row("SELECT * FROM $table_name WHERE id = $message_id"); + + if ($message) { + // Datum im gewünschten Format (DD-MM-JJJJ HH:MM:SS) + $formatted_date = date('d-m-Y H:i:s', strtotime($message->created_at)); + + echo json_encode([ + 'created_at' => $formatted_date, + 'message' => nl2br(esc_textarea($message->message)), + 'user' => get_userdata($message->user_id)->user_login + ]); + } + } + wp_die(); +} + +add_action('wp_ajax_wp_multi_get_message', 'wp_multi_get_message'); + +// Funktion zum Löschen einer Nachricht +function wp_multi_delete_message() { + if (isset($_POST['message_id'])) { + global $wpdb; + $table_name = $wpdb->prefix . 'message_board'; + $message_id = intval($_POST['message_id']); + $wpdb->delete($table_name, array('id' => $message_id)); + + echo 'success'; + } + wp_die(); +} +add_action('wp_ajax_wp_multi_delete_message', 'wp_multi_delete_message'); + +// Funktion zum Deaktivieren der Pinwand bei der Deinstallation +function wp_multi_delete_message_board_table() { + global $wpdb; + $table_name = $wpdb->prefix . 'message_board'; + $wpdb->query("DROP TABLE IF EXISTS $table_name"); +} +register_deactivation_hook(__FILE__, 'wp_multi_delete_message_board_table'); + +// Funktion, um das Dashboard-Widget zu registrieren +function wp_multi_dashboard_widget() { + wp_add_dashboard_widget( + 'wp_multi_pinwand_widget', // Widget-ID + 'Pinwand Übersicht', // Widget-Titel + 'wp_multi_dashboard_widget_content' // Callback-Funktion + ); +} +add_action('wp_dashboard_setup', 'wp_multi_dashboard_widget'); + +// Callback-Funktion, die den Inhalt des Widgets erstellt +function wp_multi_dashboard_widget_content() { + global $wpdb; + $table_name = $wpdb->prefix . 'message_board'; + $messages = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC LIMIT 5"); // Zeige die neuesten 5 Nachrichten an + + if ($messages) { + echo ''; + } else { + echo '

Keine neuen Nachrichten.

'; + } +} + + +/* +* Benutzer-Analytics +*/ + +// Funktion zur Erstellung der Datenbanktabelle für Benutzer-Analytics +function wp_multi_create_analytics_table() { + global $wpdb; + $table_name = $wpdb->prefix . 'wp_multi_user_analytics'; + + // Überprü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 mediumint(9) NOT NULL AUTO_INCREMENT, + user_id bigint(20) NOT NULL, + action varchar(255) NOT NULL, + post_id bigint(20) DEFAULT NULL, + timestamp datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (id) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); + } +} +register_activation_hook(__FILE__, 'wp_multi_create_analytics_table'); + +// Funktion zur Verfolgung von Benutzerinteraktionen (Kommentare und Beitragsaufrufe) +function wp_multi_track_user_activity($user_id, $action, $post_id = null) { + global $wpdb; + $table_name = $wpdb->prefix . 'wp_multi_user_analytics'; + + // Wenn die Aktion ein 'view' ist, stelle sicher, dass wir die post_id korrekt setzen + if ($action == 'view' && is_single()) { + $post_id = get_the_ID(); + } + + // Benutzerinteraktionen in die Datenbank speichern + $wpdb->insert( + $table_name, + array( + 'user_id' => $user_id, + 'action' => $action, + 'post_id' => $post_id, + ) + ); +} + +// Kommentar-Verfolgung +function wp_multi_comment_activity($comment_id) { + $comment = get_comment($comment_id); + $user_id = $comment->user_id; + wp_multi_track_user_activity($user_id, 'comment', $comment->comment_post_ID); +} +add_action('comment_post', 'wp_multi_comment_activity'); + +// Beitragsaufruf-Verfolgung +function wp_multi_post_view_activity() { + if (is_single() && is_user_logged_in()) { + $user_id = get_current_user_id(); + $post_id = get_the_ID(); + wp_multi_track_user_activity($user_id, 'view', $post_id); + } +} +add_action('wp_head', 'wp_multi_post_view_activity'); + +// Funktion zur Anzeige der Benutzer-Analytics im Admin-Bereich +function wp_multi_display_user_analytics() { + global $wpdb; + $table_name = $wpdb->prefix . 'wp_multi_user_analytics'; + + // Abfrage, um die Benutzerinteraktionen zu holen + $results = wp_multi_get_analytics_data(); + + ?> +
+
+ Logo +

+
+ + + + + + + + + + + + + + + + + + + $row) : ?> + + + + + + + + + + + + + + +
user_id); ?>action); ?> + post_id) { + $post_title = get_the_title($row->post_id); + echo esc_html($post_title ? $post_title : 'Kein Titel verfügbar'); + } else { + echo 'Kein Beitrag'; + } + ?> + post_id); ?>timestamp); ?>
+
+ prefix . 'wp_multi_user_analytics'; + + // Die letzten 7 Tage abrufen + $results = $wpdb->get_results(" + SELECT DATE(timestamp) AS date, action, post_id, COUNT(*) AS count, user_id, timestamp + FROM $table_name + WHERE timestamp >= CURDATE() - INTERVAL 7 DAY + GROUP BY date, action, post_id, user_id, timestamp + ORDER BY date ASC + "); + + // Daten für das Diagramm und die Tabelle organisieren + $dates = array(); + $comment_counts = array(); + $view_counts = array(); + $post_titles = array(); + + foreach ($results as $result) { + $dates[] = $result->date; + if ($result->action == 'comment') { + $comment_counts[$result->date] = $result->count; + } elseif ($result->action == 'view') { + $view_counts[$result->date] = $result->count; + } + + // Hinzufügen der Post-Titel für die Anzeige + if (!empty($result->post_id)) { + $post_titles[$result->post_id] = get_the_title($result->post_id); + } + } + + // Sicherstellen, dass alle Daten für die letzten 7 Tage vorhanden sind + $unique_dates = array_unique($dates); + $all_dates = array(); + $datasets = array( + 'comments' => [], + 'views' => [] + ); + + for ($i = 6; $i >= 0; $i--) { + $date = date('Y-m-d', strtotime("-$i day")); + $all_dates[] = $date; + $datasets['comments'][] = isset($comment_counts[$date]) ? $comment_counts[$date] : 0; + $datasets['views'][] = isset($view_counts[$date]) ? $view_counts[$date] : 0; + } + + // Rückgabe der Daten für das Diagramm und die Tabelle + return [ + 'dates' => array_reverse($all_dates), + 'datasets' => [ + [ + 'label' => 'Kommentare', + 'data' => array_reverse($datasets['comments']), + 'borderColor' => 'rgba(75, 192, 192, 1)', + 'borderWidth' => 1, + 'fill' => false, + ], + [ + 'label' => 'Beitragsaufrufe', + 'data' => array_reverse($datasets['views']), + 'borderColor' => 'rgba(153, 102, 255, 1)', + 'borderWidth' => 1, + 'fill' => false, + ] + ], + 'data' => $results + ]; +} + +// Hinzufügen der Analytics-Seite unter "Benutzer" im Admin-Menü +function wp_multi_add_analytics_page() { + add_submenu_page( + 'users.php', // Die übergeordnete Seite (Benutzer) + __('Benutzer Analytics', 'wp-multi'), // Titel der Seite + __('Benutzer Analytics', 'wp-multi'), // Text im Menü + 'manage_options', // Berechtigungen + 'wp_multi_analytics', // Menü-Slug + 'wp_multi_display_user_analytics' // Die Funktion, die die Seite anzeigt + ); +} +add_action('admin_menu', 'wp_multi_add_analytics_page'); + + +/* +* User Daten Filtern (URL, Mail-Adresse usw...) +*/ + + +// Admin-Einstellungen registrieren +function wp_multi_register_comment_filter_settings() { + add_option('wp_multi_filter_phone', '1'); + add_option('wp_multi_filter_email', '1'); + add_option('wp_multi_filter_url', '1'); + add_option('wp_multi_filter_swear', '1'); + add_option('wp_multi_filter_ip', '1'); // Neue Option für IP-Filterung + + register_setting('wp_multi_filter_options_group', 'wp_multi_filter_phone'); + register_setting('wp_multi_filter_options_group', 'wp_multi_filter_email'); + register_setting('wp_multi_filter_options_group', 'wp_multi_filter_url'); + register_setting('wp_multi_filter_options_group', 'wp_multi_filter_swear'); + register_setting('wp_multi_filter_options_group', 'wp_multi_filter_ip'); // Neue Option für IP-Filterung +} +add_action('admin_init', 'wp_multi_register_comment_filter_settings'); + + + + // Admin-Menü & Untermenü hinzufügen + function wp_multi_create_menu() { + // 'Benutzer sperren' Menü als Untermenü im Benutzer-Menü hinzufügen + add_submenu_page( + 'users.php', // 'Benutzer' Menü + 'Benutzer sperren', + 'Benutzer sperren', + 'manage_options', + 'wp-multi-blocked-users', + 'wp_multi_blocked_users_page' + ); + + // Kommentar-Filter unter Kommentare verschieben + add_submenu_page( + 'edit-comments.php', // 'Kommentare' Menü + 'Kommentar-Filter Einstellungen', + 'Kommentar-Filter', + 'manage_options', + 'wp-multi-comment-filter-settings', + 'wp_multi_comment_filter_settings_page' + ); + } + add_action('admin_menu', 'wp_multi_create_menu'); + + + + +// Admin-Seite für Kommentar-Filter +function wp_multi_comment_filter_settings_page() { + ?> +
+ +
+ +
+ +

Kommentar-Filter Einstellungen

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
>
>
>
>
>
+ +
+
+ + + prefix . 'blocked_users'; + + $charset_collate = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $table_name ( + id mediumint(9) NOT NULL AUTO_INCREMENT, + username varchar(100) DEFAULT '' NOT NULL, + email varchar(100) DEFAULT '' NOT NULL, + ip_address varchar(45) DEFAULT '' NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + dbDelta( $sql ); +} + +function wp_multi_activate() { + wp_multi_create_blocked_users_table(); +} + +register_activation_hook( __FILE__, 'wp_multi_activate' ); + +// Funktion zum Sperren von Benutzernamen, E-Mail-Adressen und IP-Adressen +function wp_multi_block_user($username = '', $email = '', $ip_address = '') { + global $wpdb; + + // Sicherstellen, dass mindestens eines der Felder ausgefüllt wurde + if (empty($username) && empty($email) && empty($ip_address)) { + return; + } + + // Eintrag in die Datenbank einfügen + $wpdb->insert( + $wpdb->prefix . 'blocked_users', + [ + 'username' => $username, + 'email' => $email, + 'ip_address' => $ip_address + ] + ); +} + +// Funktion zum Löschen eines gesperrten Benutzers +function wp_multi_delete_blocked_user($id) { + global $wpdb; + $wpdb->delete($wpdb->prefix . 'blocked_users', ['id' => $id]); +} + +// Admin-Seite für die Verwaltung der gesperrten Benutzer +function wp_multi_blocked_users_page() { + global $wpdb; + + // Benutzer sperren + if (isset($_POST['block_username']) || isset($_POST['block_email']) || isset($_POST['block_ip'])) { + $username = sanitize_text_field($_POST['block_username']); + $email = sanitize_email($_POST['block_email']); + $ip_address = sanitize_text_field($_POST['block_ip']); + + wp_multi_block_user($username, $email, $ip_address); + echo '

Benutzer wurde gesperrt!

'; + } + + // Suche + $search_query = ''; + if (isset($_GET['search'])) { + $search_query = sanitize_text_field($_GET['search']); + } + + // Abfrage der gesperrten Benutzer + $blocked_users = $wpdb->get_results($wpdb->prepare( + "SELECT * FROM {$wpdb->prefix}blocked_users WHERE username LIKE %s OR email LIKE %s OR ip_address LIKE %s", + '%' . $search_query . '%', '%' . $search_query . '%', '%' . $search_query . '%' + )); + + ?> +
+

Benutzer sperren

+ +
+

Benutzernamen sperren

+ +

E-Mail-Adresse sperren

+ +

IP-Adresse sperren

+ +

+ +
+ +

Gesperrte Benutzer

+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
BenutzernameE-Mail-AdresseIP-AdresseAktionen
username); ?>email); ?>ip_address); ?> + Löschen +
Keine gesperrten Benutzer gefunden.
+
+ 0) { + wp_multi_delete_blocked_user($user_id); + // Redirect zur Admin-Seite nach dem Löschen + wp_redirect(admin_url('admin.php?page=wp-multi-blocked-users')); + exit; + } +} + +// Kommentar auf gesperrte Benutzer überprüfen +function wp_multi_check_blocked_user($commentdata) { + global $wpdb; + + $username = isset($commentdata['comment_author']) ? $commentdata['comment_author'] : ''; + $email = isset($commentdata['comment_author_email']) ? $commentdata['comment_author_email'] : ''; + $ip_address = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; + + $blocked_user = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM {$wpdb->prefix}blocked_users WHERE username = %s OR email = %s OR ip_address = %s", + $username, $email, $ip_address + )); + + if ($blocked_user) { + wp_die('Ihr Kommentar konnte nicht abgesendet werden, da Sie gesperrt sind. Bitte wenden Sie sich an den Support.'); + } + + return $commentdata; +} +add_filter('preprocess_comment', 'wp_multi_check_blocked_user'); + + +/* +* custom shortcodes +*/ + + +// Funktion, um die Datenbanktabelle für Shortcodes zu erstellen +function wp_multi_create_shortcodes_table() { + global $wpdb; + + $table_name = $wpdb->prefix . 'wp_multi_shortcodes'; // Name der Tabelle mit Präfix + $charset_collate = $wpdb->get_charset_collate(); + + // SQL-Abfrage zum Erstellen der Tabelle + $sql = "CREATE TABLE $table_name ( + id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + shortcode_name varchar(255) NOT NULL, + shortcode_content text NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY shortcode_name (shortcode_name) + ) $charset_collate;"; + + // Datenbank abfragen und ausführen + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + dbDelta( $sql ); +} +register_activation_hook( __FILE__, 'wp_multi_create_shortcodes_table' ); + +// Menü zum Verwalten von Shortcodes im Admin-Bereich hinzufügen +function wp_multi_add_shortcode_menu() { + add_menu_page( + 'Custom Shortcodes', // Seitentitel + 'Custom Shortcodes', // Menü-Titel + 'manage_options', // Berechtigungen + 'wp_multi_shortcodes', // Menü-Slug + 'wp_multi_shortcode_page', // Callback-Funktion zum Anzeigen der Seite + 'dashicons-editor-code', // Symbol + 6 // Position im Menü + ); +} +add_action('admin_menu', 'wp_multi_add_shortcode_menu'); + +// Callback-Funktion für das Shortcode-Verwaltungs-Interface +function wp_multi_shortcode_page() { + global $wpdb; + + $message = ''; // Variable für benutzerdefinierte Nachrichten + + // Verarbeite das Speichern von Shortcodes + if (isset($_POST['wp_multi_shortcode_name']) && isset($_POST['wp_multi_shortcode_content'])) { + // Hole die übermittelten Shortcodes + $name = sanitize_text_field($_POST['wp_multi_shortcode_name']); + $content = sanitize_textarea_field($_POST['wp_multi_shortcode_content']); + + // Prüfen, ob der Shortcode bereits existiert + $existing_shortcode = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wp_multi_shortcodes WHERE shortcode_name = %s", $name)); + + if ($existing_shortcode) { + // Aktualisiere den Shortcode, falls er bereits existiert + $wpdb->update( + $wpdb->prefix . 'wp_multi_shortcodes', + ['shortcode_content' => $content], + ['shortcode_name' => $name] + ); + $message = 'Shortcode wurde aktualisiert!'; + } else { + // Andernfalls einen neuen Shortcode einfügen + $wpdb->insert( + $wpdb->prefix . 'wp_multi_shortcodes', + [ + 'shortcode_name' => $name, + 'shortcode_content' => $content + ] + ); + $message = 'Shortcode wurde hinzugefügt!'; + } + } + + // Shortcode löschen + if (isset($_GET['delete_shortcode']) && !empty($_GET['delete_shortcode'])) { + $delete_id = intval($_GET['delete_shortcode']); + $wpdb->delete( + $wpdb->prefix . 'wp_multi_shortcodes', + ['id' => $delete_id] + ); + $message = 'Shortcode wurde gelöscht!'; + } + + // Holen der gespeicherten Shortcodes aus der Datenbank + $custom_shortcodes = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wp_multi_shortcodes"); + + // HTML für die Seite + ?> +
+

+ + +
+
+ +

Custom Shortcodes verwalten

+
+
+ + + +
+

+
+ + +
+ + + + + + + + + +
+ +
+ +

Verfügbare Shortcodes

+ +
+ + + +get_results("SELECT * FROM {$wpdb->prefix}wp_multi_shortcodes"); + + // Wenn keine benutzerdefinierten Shortcodes vorhanden sind, abbrechen + if (empty($custom_shortcodes)) { + return; + } + + // Definiere die Shortcodes in WordPress + foreach ($custom_shortcodes as $shortcode) { + add_shortcode($shortcode->shortcode_name, function() use ($shortcode) { + return $shortcode->shortcode_content; + }); + } +} +add_action('init', 'wp_multi_register_custom_shortcodes'); + +// Inhalt der Meta-Box anzeigen +function wp_multi_render_shortcode_meta_box($post) { + global $wpdb; + + // Alle gespeicherten Shortcodes aus der Datenbank holen + $shortcodes = $wpdb->get_results("SELECT shortcode_name FROM {$wpdb->prefix}wp_multi_shortcodes"); + + if (!empty($shortcodes)) { + echo ''; + echo ''; + } else { + echo '

Keine Shortcodes vorhanden.

'; + } +} + + // JavaScript für Meta-Box einbinden +function wp_multi_enqueue_admin_scripts($hook) { + if ('post.php' === $hook || 'post-new.php' === $hook) { + wp_enqueue_script('wp-multi-shortcode', plugin_dir_url(__FILE__) . 'js/editor-shortcode.js', array('jquery'), null, true); + } +} +add_action('admin_enqueue_scripts', 'wp_multi_enqueue_admin_scripts'); + +// Funktion zum Registrieren des TinyMCE Plugins +function wp_multi_add_shortcode_button() { + add_filter('mce_external_plugins', 'wp_multi_register_tinymce_plugin'); + add_filter('mce_buttons', 'wp_multi_add_tinymce_button'); +} +add_action('admin_head', 'wp_multi_add_shortcode_button'); + +// Plugin für TinyMCE registrieren (angepasster Pfad zum JS-File) +function wp_multi_register_tinymce_plugin($plugins) { + $plugins['wp_multi_shortcodes'] = plugin_dir_url(__FILE__) . 'js/tinymce-shortcodes.js'; + return $plugins; +} + +// Button zur TinyMCE Toolbar hinzufügen +function wp_multi_add_tinymce_button($buttons) { + array_push($buttons, 'wp_multi_shortcodes'); + return $buttons; +} + +// Shortcodes aus der Datenbank für das JavaScript bereitstellen +function wp_multi_localize_shortcodes() { + global $wpdb; + $shortcodes = $wpdb->get_results("SELECT shortcode_name FROM {$wpdb->prefix}wp_multi_shortcodes", ARRAY_A); + + // Shortcodes als JSON an das JS-File übergeben + wp_enqueue_script('wp-multi-tinymce', plugin_dir_url(__FILE__) . 'js/tinymce-shortcodes.js', array('jquery'), null, true); + wp_localize_script('wp-multi-tinymce', 'wpMultiShortcodes', $shortcodes); +} +add_action('admin_enqueue_scripts', 'wp_multi_localize_shortcodes'); + + +/* +* Update Admin-Dashboard widget +*/ + + +// Widget zum Admin-Dashboard hinzufügen +function wp_multi_update_dashboard_widget() { + wp_add_dashboard_widget( + 'wp_multi_update_widget', // Widget-ID + 'Verfügbare Updates für WP Multi', // Widget-Titel + 'wp_multi_update_dashboard_widget_content' // Callback-Funktion + ); +} +add_action('wp_dashboard_setup', 'wp_multi_update_dashboard_widget'); + +// Callback-Funktion für das Widget +function wp_multi_update_dashboard_widget_content() { + // Gitea API-URL und Token + $api_url = 'https://git.viper.ipv64.net/api/v1/repos/M_Viper/wp-multi/releases'; + $api_token = 'aad0e1d1ea382921591a144f115c1d55febb50b3'; + + // Die Version des Plugins aus den Metadaten der Plugin-Datei holen + $plugin_data = get_plugin_data( __FILE__ ); + $installed_version = $plugin_data['Version']; // Die installierte Version aus den Plugin-Metadaten + + // Gitea API-Anfrage für die neuesten Releases + $response = wp_remote_get($api_url, array( + 'headers' => array( + 'Authorization' => 'token ' . $api_token + ) + )); + + if (is_wp_error($response)) { + echo 'Fehler beim Abrufen der Versionsinformationen von Gitea.'; + return; + } + + // API-Antwort verarbeiten + $body = wp_remote_retrieve_body($response); + $data = json_decode($body, true); + + if (!empty($data) && isset($data[0]['tag_name'])) { + $latest_version = $data[0]['tag_name']; // Neuste Version von Gitea + + // Vergleiche die installierte Version mit der neuesten Version + if (version_compare($installed_version, $latest_version, '>=')) { + // Wenn die installierte Version gleich oder neuer ist als die Version in Gitea + echo '

Ihre Version ist aktuell. Version ' . $installed_version . ' ist die neueste Version.

'; + } else { + // Wenn die installierte Version älter ist als die Version in Gitea + echo '

Es ist eine neue Version von WP Multi verfügbar! Version ' . $latest_version . ' ist jetzt verfügbar.

'; + echo '

Aktuell installierte Version: ' . $installed_version . '

'; + echo '

Neue Version auf Gitea: ' . $latest_version . '

'; + echo '

Update herunterladen

'; + } + } else { + echo 'Fehler beim Abrufen der neuesten Version von Gitea.'; + } +} + + +/* +* Notify Seite Discord & Telegram +*/ + + +// Übergeordnetes Menü "Notify" erstellen +function wp_multi_menu() { + // Menüpunkt für "Notify" + add_menu_page( + 'Notify', + 'Notify', + 'manage_options', + 'wp-multi-notify', + 'wp_multi_notify_page', + 'dashicons-bell', + 100 + ); + + // Untermenüpunkt für DC-Notify + add_submenu_page( + 'wp-multi-notify', + 'DC-Notify Einstellungen', + 'DC-Notify', + 'manage_options', + 'wp-multi', + 'wp_multi_settings_page' + ); + + // Untermenüpunkt für TG-Notify + add_submenu_page( + 'wp-multi-notify', + 'TG-Notify Einstellungen', + 'TG-Notify', + 'manage_options', + 'tg-notify', + 'tg_notify_page' + ); +} +add_action('admin_menu', 'wp_multi_menu'); + +// Callback-Funktion für die Hauptseite Notify +function wp_multi_notify_page() { + ?> +
+

+ + +
+ M_Viper Logo +
+ +
+

+

+ +

+

+
    +
  1. +
  2. +
  3. +
+ +

+

+
    +
  1. +
  2. +
  3. +
+
+
+ +
+

+ +
+ M_Viper Logo +
+

+

+
    +
  1. +
  2. +
  3. +
+
+ +
+

+ +
+ M_Viper Logo +
+

+

+
    +
  1. +
  2. +
  3. +
+
+ + .wp-multi-admin-page { + background-color: #f9f9f9; + padding: 20px; + border-radius: 8px; + } + + .wp-multi-banner { + background-color: #0073aa; /* Blaues Banner */ + padding: 10px; + text-align: center; + margin-bottom: 20px; + } + + .wp-multi-logo-image { + width: 200px; + height: auto; + display: inline-block; + } + + .wp-multi-settings-header h2 { + color: #333; + font-size: 24px; + margin-bottom: 10px; + } + + .wp-multi-settings-header ol { + margin-left: 20px; + } + + .wp-multi-settings-header ol li { + margin-bottom: 8px; + } + + '; +} +add_action('admin_head', 'wp_multi_admin_styles'); + +// Einstellungsseite für Discord Webhook +function wp_multi_settings_page() { + ?> +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Discord Webhook URL + +

Geben Sie die Webhook-URL für Discord ein, um Benachrichtigungen zu senden.

+
Bot Name + +

Geben Sie den Namen des Bots ein, der in Discord angezeigt werden soll.

+
Discord Nachricht (Vorlage) + +

Passen Sie die Nachricht an, die an Discord gesendet wird. Verwenden Sie Platzhalter wie {post_title}, {post_author}, und {post_url}.

+
Discord Benutzerrollen ID (für Ping) + +

Geben Sie die ID der Discord-Benutzerrolle ein, die gepingt werden soll (z. B. @everyone).

+
Discord Avatar-URL + +

Geben Sie die URL des Avatar-Bildes ein, das in den Discord-Nachrichten angezeigt werden soll.

+
Footer Text (Custom Text 2) + +

Geben Sie den benutzerdefinierten Text ein, der am Ende der Nachricht angezeigt wird (z. B. "Powered by WP Multi"). Sie können auch Platzhalter wie {post_title}, {post_author} und {post_url} verwenden.

+
+ +
+
+ + post_author)); + + // Textvorschau (die ersten 5 Zeilen des Beitrags) + $content = get_post_field('post_content', $ID); + $excerpt = wp_trim_words($content, 60, '...'); + + // Benutzerrolle anpingen (optional) + $role_id = get_option('wp_multi_discord_role_id'); + $mention_role = (!empty($role_id) && is_numeric($role_id)) ? "<@&" . esc_attr($role_id) . ">" : ''; + + // Footer Text (Custom Text 2) aus den Optionen + $footer_text = get_option('wp_multi_discord_footer_text'); + $footer = !empty($footer_text) ? str_replace( + ['{post_title}', '{post_author}', '{post_url}'], + [$post_title, $post_author, $post_url], + $footer_text + ) : ''; + + // Nachrichtenvorlage zusammenstellen + $message_template = get_option('wp_multi_discord_message_template', 'Beitrag "{post_title}" von {post_author} | Link: {post_url}'); + $message = str_replace( + ['{post_title}', '{post_author}', '{post_url}'], + [$post_title, $post_author, $post_url], + $message_template + ); + + // Nachricht aufbauen + $message .= "\n\n" . __('') . "\n" . $excerpt; + + // Fügt eine zusätzliche Zeile Abstand ein, bevor der Footer-Text erscheint + $message .= "\n\n" . $footer; + + // Discord Webhook Daten vorbereiten + $data = json_encode([ + 'username' => $bot_name, + 'avatar_url' => $avatar_url, + 'content' => $mention_role . "\n" . $message + ]); + + // Nachricht an Discord senden + $response = wp_remote_post($webhook_url, [ + 'method' => 'POST', + 'body' => $data, + 'headers' => [ + 'Content-Type' => 'application/json' + ] + ]); + + // Prüfen, ob die Nachricht erfolgreich gesendet wurde + if (!is_wp_error($response)) { + // Erhöhe den Discord-Nachrichtenzähler + wp_multi_increment_discord_message_count(); + } +} + +// Funktion zum Erhöhen des Discord-Nachrichtenzählers +function wp_multi_increment_discord_message_count() { + $current_count = get_option('wp_multi_discord_message_count', 0); + update_option('wp_multi_discord_message_count', $current_count + 1); +} + +add_action('publish_post', 'wp_multi_send_discord_notification', 10, 2); + + + +// Funktion, um die Checkbox in der Sidebar des Beitrag Editors hinzuzufügen +function wp_multi_add_checkbox_to_sidebar() { + global $post; + + // Nonce-Feld für Sicherheitsüberprüfung + wp_nonce_field('wp_multi_checkbox_nonce', 'wp_multi_checkbox_nonce_field'); + + // Immer aktivieren (setze den Wert der Checkbox immer auf '1') + $value = '1'; + + // Checkbox im Sidebar Bereich (Veröffentlichen) anzeigen + ?> +
+ +
+ json_encode($message), + 'headers' => ['Content-Type' => 'application/json'], + 'method' => 'POST' +]); + +if (is_wp_error($response)) { + $error_message = $response->get_error_message(); + error_log('Discord Webhook Fehler: ' . $error_message); +} else { + error_log('Webhook gesendet: ' . print_r($response, true)); +} + + +/* +* Telegram Notify +*/ + + +// Admin-Seiten Callback +function tg_notify_page() { + ?> +
+

+
+ +
+
+ + '; +} +function tg_notify_bot_token_callback() { + $value = get_option('tg_notify_bot_token', ''); + echo ''; +} +function tg_notify_chat_ids_callback() { + $value = get_option('tg_notify_chat_ids', ''); + echo ''; + echo '

Kanal ohne Thema: -1001234567890

'; + echo '

Kanal mit Thema: -1001234567890_123

'; +} +function tg_notify_custom_message_callback() { + $value = get_option('tg_notify_custom_message', ''); + echo ''; + echo '

Verfügbare Variablen: {title}, {author}, {link}

'; +} + +// Checkbox beim Beitrag hinzufügen +function tg_notify_add_meta_box() { + add_meta_box( + 'tg_notify_meta_box', + __('Telegram Benachrichtigung', 'wp-stat-notice'), + 'tg_notify_meta_box_callback', + 'post', + 'side', + 'high' + ); +} +add_action('add_meta_boxes', 'tg_notify_add_meta_box'); + +function tg_notify_meta_box_callback($post) { + $value = get_post_meta($post->ID, '_tg_notify_send', true); + + // Standardmäßig auf 1 setzen, wenn der Beitrag neu ist + if (empty($value) && get_post_status($post->ID) !== 'publish') { + $value = 1; + } + + wp_nonce_field('tg_notify_meta_box', 'tg_notify_meta_box_nonce'); + echo ''; +} + +function tg_notify_save_post($post_id) { + // Sicherheitsprüfungen + if (!isset($_POST['tg_notify_meta_box_nonce']) || !wp_verify_nonce($_POST['tg_notify_meta_box_nonce'], 'tg_notify_meta_box')) return; + if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; + if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) return; + if (!current_user_can('edit_post', $post_id)) return; + + // Prüfen, ob der Beitrag wirklich veröffentlicht wurde + if (get_post_status($post_id) !== 'publish') return; + + // Prüfen, ob die Nachricht bereits gesendet wurde + $already_sent = get_post_meta($post_id, '_tg_notify_sent', true); + if ($already_sent) return; + + $send_notification = isset($_POST['tg_notify_send']) ? 1 : 0; + update_post_meta($post_id, '_tg_notify_send', $send_notification); + + if ($send_notification) { + tg_notify_send_telegram_message($post_id); + update_post_meta($post_id, '_tg_notify_sent', 1); + } +} + + +add_action('save_post', 'tg_notify_save_post'); + +function tg_notify_send_telegram_message($post_id) { + $bot_token = get_option('tg_notify_bot_token'); + $chat_ids = explode("\n", get_option('tg_notify_chat_ids')); + $message_template = get_option('tg_notify_custom_message'); + + $post = get_post($post_id); + // Überprüfen, ob der Beitrag von einem Gast-Author stammt + $author_name = get_the_author_meta('display_name', $post->post_author); + if (empty($author_name)) { + // Falls kein Name vorhanden ist (Gast-Author), den Gast-Namen verwenden oder einen Platzhalter setzen + $author_name = 'Gast-Author'; + } + + // Nachricht formatieren + $message = str_replace( + ['{title}', '{author}', '{link}'], + [$post->post_title, $author_name, get_permalink($post_id)], + $message_template + ); + + foreach ($chat_ids as $chat_id) { + $chat_id = trim($chat_id); + if (!empty($chat_id)) { + // Überprüfen, ob die ID das Thema enthält (Format: -1001234567890_123) + if (strpos($chat_id, '_') !== false) { + // Kanal-ID und Themen-ID trennen + list($channel_id, $topic_id) = explode('_', $chat_id); + $chat_id = $channel_id; + + // Telegram API-Anfrage senden + $url = "https://api.telegram.org/bot$bot_token/sendMessage"; + $args = [ + 'body' => json_encode([ + 'chat_id' => $chat_id, + 'text' => $message, + 'parse_mode' => 'HTML', + 'reply_to_message_id' => $topic_id + ]), + 'headers' => ['Content-Type' => 'application/json'], + 'method' => 'POST', + ]; + + // API-Request senden und Fehlerprotokollierung + $response = wp_remote_post($url, $args); + if (is_wp_error($response)) { + $error_message = $response->get_error_message(); + error_log("Telegram Fehler: $error_message"); + } else { + // Erhöhe den Telegram-Nachrichtenzähler + tg_notify_increment_telegram_message_count(); + error_log('Telegram Antwort: ' . print_r($response, true)); + } + } else { + // Normaler Kanal ohne Thema + $url = "https://api.telegram.org/bot$bot_token/sendMessage"; + $args = [ + 'body' => json_encode([ + 'chat_id' => $chat_id, + 'text' => $message, + 'parse_mode' => 'HTML' + ]), + 'headers' => ['Content-Type' => 'application/json'], + 'method' => 'POST', + ]; + + // API-Request senden und Fehlerprotokollierung + $response = wp_remote_post($url, $args); + if (is_wp_error($response)) { + $error_message = $response->get_error_message(); + error_log("Telegram Fehler: $error_message"); + } else { + // Erhöhe den Telegram-Nachrichtenzähler + tg_notify_increment_telegram_message_count(); + error_log('Telegram Antwort: ' . print_r($response, true)); + } + } + } + } +} + +function tg_notify_increment_telegram_message_count() { + $current_count = get_option('wp_multi_telegram_message_count', 0); + update_option('wp_multi_telegram_message_count', $current_count + 1); +} + + +/* +* Admin-Dashboard Nachrichten sende Zähler +*/ + + +// Admin Dashboard Widget für Telegram und Discord Nachrichten Zähler +function wp_multi_add_dashboard_widgets() { + wp_add_dashboard_widget( + 'wp_multi_dashboard_widget', + 'Telegram & Discord Nachrichten Zähler', + 'wp_multi_display_dashboard_widget' + ); +} +add_action('wp_dashboard_setup', 'wp_multi_add_dashboard_widgets'); + +// Callback-Funktion, die den Inhalt des Widgets anzeigt +function wp_multi_display_dashboard_widget() { + // Telegram-Nachrichtenzähler + $telegram_message_count = get_option('wp_multi_telegram_message_count', 0); + // Discord-Nachrichtenzähler + $discord_message_count = get_option('wp_multi_discord_message_count', 0); + + // Ausgabe der Zähler + echo '

Telegram Nachrichten gesendet: ' . esc_html($telegram_message_count) . '

'; + echo '

Discord Nachrichten gesendet: ' . esc_html($discord_message_count) . '

'; +} + + +/* +* Gast Autoren +*/ + + +// Gast-Autor Eingabefeld in der Sidebar im Admin-Bereich hinzufügen +function wp_multi_add_guest_author_field() { + add_meta_box( + 'guest_author_meta_box', + __('Gast-Autor', 'wp-multi'), + 'wp_multi_guest_author_field', + ['post', 'page', 'dein_custom_post_type'], + 'side', + 'high' + ); +} +add_action('add_meta_boxes', 'wp_multi_add_guest_author_field'); + +// Callback-Funktion, die das Eingabefeld anzeigt +function wp_multi_guest_author_field($post) { + // Die Metadaten des Beitrags laden (ob ein Gast-Autor gesetzt ist) + $guest_author = get_post_meta($post->ID, '_guest_author', true); + ?> + + + ID, '_guest_author', true); + if (!empty($guest_author)) { + // Ersetze den Standard-Autor mit dem Gast-Autor + $author_name = $guest_author; + } + } + } + return $author_name; +} +add_filter('the_author', 'wp_multi_display_guest_author'); + +// Anzeige des Gast-Autors in der Beitragsübersicht (Backend) +function wp_multi_add_guest_author_column($columns) { + if (isset($columns['author'])) { + $columns['guest_author'] = __('Gast-Autor', 'wp-multi'); + } + return $columns; +} +add_filter('manage_posts_columns', 'wp_multi_add_guest_author_column'); + +// Inhalt der Gast-Autor-Spalte +function wp_multi_display_guest_author_column($column_name, $post_id) { + if ($column_name == 'guest_author') { + $guest_author = get_post_meta($post_id, '_guest_author', true); + if (!empty($guest_author)) { + echo esc_html($guest_author); + } else { + echo __('Kein Gast-Autor', 'wp-multi'); + } + } +} +add_action('manage_posts_custom_column', 'wp_multi_display_guest_author_column', 10, 2); + +// Admin-Menü für die Gast-Autor-Übersicht unter Benutzer hinzufügen +function wp_multi_add_guest_author_page() { + add_submenu_page( + 'users.php', + __('Gast-Autor Übersicht', 'wp-multi'), + __('Gast-Autoren', 'wp-multi'), + 'manage_options', + 'guest_author_overview', + 'wp_multi_guest_author_overview_page' + ); +} +add_action('admin_menu', 'wp_multi_add_guest_author_page'); + + +// Callback-Funktion für die Gast-Autor-Übersicht +function wp_multi_guest_author_overview_page() { + ?> +
+

+ + + + + + + + + get_results("SELECT DISTINCT pm.meta_value AS guest_author + FROM {$wpdb->posts} p + LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id + WHERE pm.meta_key = '_guest_author' AND p.post_status = 'publish' + ORDER BY guest_author ASC"); + + // Alle Gast-Autoren anzeigen + if ($guest_authors) { + foreach ($guest_authors as $author) { + // Anzahl der Beiträge für den Gast-Autor zählen + $author_posts = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) + FROM {$wpdb->posts} p + LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id + WHERE pm.meta_key = '_guest_author' + AND pm.meta_value = %s + AND p.post_status = 'publish'", $author->guest_author)); + ?> + + + + + '; + } + ?> + +
guest_author); ?>
' . __('Keine Gast-Autoren gefunden.', 'wp-multi') . '
+
+ + + +
+
+ + +
+
+ +

Custom Text verwalten

+
+
+ + + + + + + + + + + + + + + + +
+ /> +

+
+ +

+
+ +

+
+ +
+
+ + + ID, 'guest_author', true); + $author_name = !empty($guest_author_name) ? $guest_author_name : get_the_author(); + + // Holen der benutzerdefinierten Texte aus den Einstellungen + $custom_texts = get_option('wp_multi_custom_texts', ''); + $second_custom_texts = get_option('wp_multi_second_custom_text', ''); + + // Sicherstellen, dass wir eine Liste von Texten haben + $custom_texts_array = array_filter(array_map('trim', explode("\n", $custom_texts))); + $second_custom_texts_array = array_filter(array_map('trim', explode("\n", $second_custom_texts))); + + // Die aktuelle Auswahl des Custom Texts aus den Post-Metadaten + $selected_custom_text = get_post_meta($post->ID, '_custom_text_choice', true); + $selected_second_custom_text = get_post_meta($post->ID, '_second_custom_text_choice', true); + + // Falls keine Texte verfügbar sind, abbrechen + if (empty($custom_texts_array) && empty($second_custom_texts_array)) { + return $content; + } + + // Die Ausgabe-Box erstellen + $output = '
'; + + // Anzeige des Autors und des zweiten benutzerdefinierten Texts in einer Zeile + $output .= '

' . __('Autor:', 'wp-multi') . ' ' . esc_html($author_name); + + if ($selected_second_custom_text !== '' && isset($second_custom_texts_array[$selected_second_custom_text])) { + $output .= ' | ' . esc_html($second_custom_texts_array[$selected_second_custom_text]); // Trennzeichen " | " + } + + $output .= '

'; + + // Anzeige des ersten benutzerdefinierten Texts (unterer Bereich) + if ($selected_custom_text !== '' && isset($custom_texts_array[$selected_custom_text])) { + $output .= '

' . esc_html($custom_texts_array[$selected_custom_text]) . '

'; + } + + $output .= '
'; + + return $content . $output; + } + return $content; +} +add_filter('the_content', 'wp_multi_custom_text_display'); + +// Funktion zum Hinzufügen der Meta-Box für beide Custom Texts +function wp_multi_add_custom_text_fields($post) { + // Holen der benutzerdefinierten Texte aus den Einstellungen + $custom_texts = get_option('wp_multi_custom_texts'); + $custom_texts_array = explode("\n", $custom_texts); + + // Holen des zweiten benutzerdefinierten Textes aus den Einstellungen + $second_custom_text = get_option('wp_multi_second_custom_text'); + $second_custom_text_array = explode("\n", $second_custom_text); + + // Die aktuelle Auswahl des Custom Texts + $selected_custom_text = get_post_meta($post->ID, '_custom_text_choice', true); + $selected_second_custom_text = get_post_meta($post->ID, '_second_custom_text_choice', true); + + ?> + + + + + + window.open("' . esc_url($page['url']) . '", "_blank");'; + } + // Interne Seite anzeigen + else if (isset($page['slug'])) { + echo '

' . esc_html($page['title']) . '

'; + echo '

' . __('Dies ist eine benutzerdefinierte Seite im Admin-Bereich.', 'wp-stat-notice') . '

'; + } + break; + } + } + } +} + +// Funktion zum Hinzufügen neuer benutzerdefinierter Seiten über ein Admin-Formular +function wp_stat_notice_add_custom_page_form() { + // Alle Dashicons laden + $dashicons = [ + 'dashicons-admin-links', + 'dashicons-admin-site', + 'dashicons-admin-home', + 'dashicons-admin-plugins', + 'dashicons-admin-users', + 'dashicons-analytics', + 'dashicons-archive', + 'dashicons-book', + 'dashicons-calendar', + 'dashicons-camera', + 'dashicons-cart', + 'dashicons-cloud', + 'dashicons-clipboard', + 'dashicons-clock', + 'dashicons-cloud-upload', + 'dashicons-email', + 'dashicons-heart', + 'dashicons-laptop', + 'dashicons-lock', + 'dashicons-phone', + 'dashicons-rss', + 'dashicons-search', + 'dashicons-settings', + 'dashicons-share', + 'dashicons-tag', + 'dashicons-thumbs-up', + 'dashicons-welcome-learn-more', + 'dashicons-welcome-write-blog' + ]; + + ?> +
+

+ +
+ + + + + + + + + + + + + + + + + +
+ +
+
+
+ +

+ +

+
+ + $title, + 'url' => $url, + 'slug' => $slug, + 'icon' => $icon, + ]; + + // Option speichern + update_option('wp_stat_notice_custom_pages', $custom_pages); + + // Menü neu hinzufügen + wp_stat_notice_add_custom_pages(); + + // Bestätigung + echo '

' . __('Benutzerdefinierte Seite wurde hinzugefügt!', 'wp-stat-notice') . '

'; + } + + // Verwaltung der benutzerdefinierten Seiten + $custom_pages = get_option('wp_stat_notice_custom_pages', []); + if ($custom_pages) { + echo '

' . __('Verwaltung der benutzerdefinierten Seiten', 'wp-stat-notice') . '

'; + echo ''; + echo ''; + echo ''; + foreach ($custom_pages as $index => $page) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo ''; + echo '
' . __('Titel', 'wp-stat-notice') . '' . __('URL', 'wp-stat-notice') . '' . __('Aktionen', 'wp-stat-notice') . '
' . esc_html($page['title']) . '' . esc_html($page['url']) . ''; + echo '' . __('Bearbeiten', 'wp-stat-notice') . ' | '; + echo '' . __('Löschen', 'wp-stat-notice') . ''; + echo '
'; + } + + // Bearbeiten und Löschen von Seiten + if (isset($_GET['edit'])) { + $edit_index = (int) $_GET['edit']; + $edit_page = $custom_pages[$edit_index]; + + // Formular zum Bearbeiten der Seite + echo '

' . __('Seite bearbeiten', 'wp-stat-notice') . '

'; + ?> +
+ + + + + + + + + + + + + + + + + +
+ +

+ +

+
+ +

' . __('Seite erfolgreich bearbeitet!', 'wp-stat-notice') . '

'; + } + } + + // Löschen der Seite + if (isset($_GET['delete'])) { + $delete_index = (int) $_GET['delete']; + unset($custom_pages[$delete_index]); + $custom_pages = array_values($custom_pages); + update_option('wp_stat_notice_custom_pages', $custom_pages); + + echo '

' . __('Seite wurde gelöscht.', 'wp-stat-notice') . '

'; + } + ?> + + + + prefix . 'reported_posts'; + $charset_collate = $wpdb->get_charset_collate(); + + // SQL für die Tabelle + $sql = "CREATE TABLE IF NOT EXISTS $table_name ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + post_id BIGINT(20) NOT NULL, + report_date DATETIME DEFAULT CURRENT_TIMESTAMP, + reason TEXT NOT NULL, + name VARCHAR(255) NOT NULL, + status VARCHAR(20) DEFAULT 'reported', + user_id BIGINT(20) UNSIGNED DEFAULT NULL, + PRIMARY KEY (id), + KEY post_id (post_id), + KEY user_id (user_id) + ) $charset_collate;"; + + // Zuerst prüfen, ob die Spalte `name` vorhanden ist + $columns = $wpdb->get_results("SHOW COLUMNS FROM $table_name"); + + $column_names = array_map(function($column) { + return $column->Field; + }, $columns); + + // Wenn die Spalte 'name' nicht vorhanden ist, wird sie hinzugefügt + if (!in_array('name', $column_names)) { + $wpdb->query("ALTER TABLE $table_name ADD COLUMN `name` VARCHAR(255) NOT NULL"); + } + + // Tabelle erstellen oder aktualisieren + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); +} + +register_activation_hook(__FILE__, 'wp_stat_notice_create_reported_posts_table'); + + +// Shortcode für den "Beitrag melden"-Button +function wp_stat_notice_report_button($atts) { + global $post; + if (!is_user_logged_in()) return ''; + + $atts = shortcode_atts(array('post_id' => $post->ID), $atts, 'report_button'); + $nonce = wp_create_nonce('report_post_nonce'); + + // Report-Button & Eingabefelder für Name und Grund + ob_start(); + ?> + + + + + prefix . 'reported_posts'; + + // Abfrage, um die letzten 10 gemeldeten Beiträge zu holen + $reports = $wpdb->get_results( + "SELECT * FROM $table_name ORDER BY report_date DESC LIMIT 10" + ); + + if (empty($reports)) { + echo '

Es gibt keine gemeldeten Beiträge.

'; + return; + } + + // Tabelle mit den letzten 10 gemeldeten Beiträgen anzeigen + echo ''; + echo ''; + + foreach ($reports as $report) { + $post = get_post($report->post_id); + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + echo '
BeitragDatumGrund
' . esc_html($post->post_title) . '' . esc_html($report->report_date) . '' . esc_html($report->reason) . '
'; +} + +// AJAX-Handler zum Senden eines Reports +function wp_stat_notice_handle_report() { + check_ajax_referer('report_post_nonce', 'nonce'); + + if (!isset($_POST['post_id'], $_POST['reason'], $_POST['name']) || !is_user_logged_in()) { + wp_send_json_error(array('message' => 'Ungültige Anfrage.')); + return; + } + + global $wpdb; + $table_name = $wpdb->prefix . 'reported_posts'; + + $post_id = intval($_POST['post_id']); + $reason = sanitize_textarea_field($_POST['reason']); + $name = sanitize_text_field($_POST['name']); + $user_id = get_current_user_id(); + + // Versuche den Eintrag in die Datenbank zu schreiben + $result = $wpdb->insert( + $table_name, + array( + 'post_id' => $post_id, + 'reason' => $reason, + 'name' => $name, + 'status' => 'reported', + 'user_id' => $user_id + ), + array('%d', '%s', '%s', '%s', '%d') + ); + + if ($result === false) { + error_log("Datenbankfehler: " . $wpdb->last_error); // WP Debug Log + wp_send_json_error(array('message' => 'Datenbankfehler: ' . $wpdb->last_error)); + } else { + wp_send_json_success(array('message' => 'Bericht erfolgreich gesendet.')); + } +} +add_action('wp_ajax_report_post', 'wp_stat_notice_handle_report'); + + +// JavaScript in den Footer einfügen +function wp_stat_notice_inline_js() { + ?> + + + prefix . 'reported_posts'; + $reports = $wpdb->get_results("SELECT * FROM $table_name ORDER BY report_date DESC"); + + ?> +
+

+ + + + + + + + + + + + + post_id); ?> + + + + + + + + + + +
BeitragDatumNameGrundStatusAktionen
post_title); ?>report_date); ?>name); ?>reason); ?>status); ?> + Report Löschen | + Unpublish | + Beitrag Löschen +
+
+ delete($wpdb->prefix . 'reported_posts', array('id' => intval($_GET['delete_report']))); + } elseif (isset($_GET['unpublish_report'])) { + $wpdb->update($wpdb->prefix . 'reported_posts', array('status' => 'unpublished'), array('id' => intval($_GET['unpublish_report']))); + } elseif (isset($_GET['delete_post'])) { + wp_delete_post(intval($_GET['delete_post']), true); + } +} +add_action('admin_init', 'wp_stat_notice_handle_report_actions'); + +// Menüpunkt im Admin-Bereich hinzufügen +function wp_stat_notice_add_reported_posts_menu() { + add_menu_page( + 'Gemeldete Beiträge', + 'Gemeldete Beiträge', + 'manage_options', + 'reported-posts', + 'wp_stat_notice_reported_posts_page', + 'dashicons-warning', + 25 + ); +} +add_action('admin_menu', 'wp_stat_notice_add_reported_posts_menu'); + + +/* +* Gast Lesezeichen +*/ + + +// Funktion zum Erstellen des benutzerdefinierten Post-Typs für Lesezeichen +function statistik_manager_create_bookmark_post_type() { + register_post_type('bookmark', + array( + 'labels' => array( + 'name' => __('Lesezeichen', 'statistik-manager'), + 'singular_name' => __('Lesezeichen', 'statistik-manager') + ), + 'public' => false, // Privat, nur für Backend + 'show_ui' => false, // Nicht im Backend anzeigen + 'show_in_menu' => false, // Nicht im Menü anzeigen + 'supports' => array('title', 'custom-fields') + ) + ); +} +add_action('init', 'statistik_manager_create_bookmark_post_type'); + +// Funktion zum Speichern eines Lesezeichens für Gäste +function statistik_manager_save_bookmark($post_id) { + if (isset($_COOKIE['guest_token'])) { + update_post_meta($post_id, '_guest_token', $_COOKIE['guest_token']); + } +} + +// Funktion zum Abrufen der Lesezeichen eines Gastes +function statistik_manager_get_guest_bookmarks() { + $guest_token = isset($_COOKIE['guest_token']) ? $_COOKIE['guest_token'] : null; + + if (!$guest_token) { + // Wenn der Gast noch kein Token hat, erstellen und speichern + $guest_token = wp_generate_uuid4(); // Ein zufälliger UUID-Token + setcookie('guest_token', $guest_token, time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN); // Cookie für 30 Tage setzen + } + + // Abfrage der Lesezeichen für den aktuellen Gast + $args = array( + 'post_type' => 'bookmark', + 'meta_key' => '_guest_token', + 'meta_value' => $guest_token, + 'posts_per_page' => -1, + 'post_status' => 'publish' + ); + $bookmarks_query = new WP_Query($args); + + return $bookmarks_query->posts; +} + +// Funktion zum Löschen eines Lesezeichens (nur für den aktuellen Gast) +function statistik_manager_delete_bookmark() { + if (isset($_POST['bookmark_id']) && isset($_COOKIE['guest_token'])) { + $bookmark_id = intval($_POST['bookmark_id']); + $guest_token = $_COOKIE['guest_token']; + + // Überprüfen, ob das Lesezeichen diesem Gast gehört + $stored_token = get_post_meta($bookmark_id, '_guest_token', true); + if ($stored_token === $guest_token) { + wp_delete_post($bookmark_id, true); + echo 'Lesezeichen erfolgreich gelöscht!'; + } else { + echo 'Du kannst nur deine eigenen Lesezeichen löschen!'; + } + } + wp_die(); // Beende die Anfrage +} +add_action('wp_ajax_delete_bookmark', 'statistik_manager_delete_bookmark'); +add_action('wp_ajax_nopriv_delete_bookmark', 'statistik_manager_delete_bookmark'); + +// Funktion zum Anzeigen der Lesezeichen mit Löschen-Option +function statistik_manager_display_bookmarks() { + $bookmarks = statistik_manager_get_guest_bookmarks(); + + if (!empty($bookmarks)) { + $output = '
'; + $output .= '

' . __('Gespeicherte Lesezeichen', 'statistik-manager') . '

'; + $output .= ''; + $output .= '
'; + return $output; + } else { + return '

' . __('Keine Lesezeichen gefunden.', 'statistik-manager') . '

'; + } +} + +// Funktion zum Hinzufügen eines Lesezeichens via AJAX +function statistik_manager_add_bookmark_ajax() { + if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['bookmark_url']) && isset($_POST['bookmark_name'])) { + $bookmark_url = sanitize_text_field($_POST['bookmark_url']); + $bookmark_name = sanitize_text_field($_POST['bookmark_name']); // Name des Lesezeichens + + // Neues Lesezeichen erstellen + $post_id = wp_insert_post(array( + 'post_type' => 'bookmark', + 'post_title' => $bookmark_name, // Benutzerdefinierter Name für das Lesezeichen + 'post_status' => 'publish', + 'meta_input' => array( + '_bookmark_url' => $bookmark_url + ) + )); + + // Speichern des Gast-Token + if (isset($_COOKIE['guest_token'])) { + update_post_meta($post_id, '_guest_token', $_COOKIE['guest_token']); + } + + // Rückgabe des neuen Lesezeichens als HTML + $bookmark_html = '
  • '; + $bookmark_html .= ''; + $bookmark_html .= '' . esc_html($bookmark_name) . ''; + $bookmark_html .= '
  • '; + + echo $bookmark_html; + } + + wp_die(); // Beende die Anfrage +} +add_action('wp_ajax_add_bookmark', 'statistik_manager_add_bookmark_ajax'); +add_action('wp_ajax_nopriv_add_bookmark', 'statistik_manager_add_bookmark_ajax'); + +// JavaScript zum Hinzufügen des Lesezeichens ohne Seitenaktualisierung +function statistik_manager_add_bookmark_script() { + ?> + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    + + + publish; + + // Kommentare + $comments_count = wp_count_comments()->total_comments; + + // Kategorien + $selected_categories = get_option('statistik_manager_selected_categories', []); + $categories_count = 0; + + if (!empty($selected_categories)) { + $categories_count = count($selected_categories); + } else { + // Alle Kategorien zählen, wenn keine ausgewählt wurden + $categories_count = wp_count_terms('category'); + } + + // Serien (angenommen, Serien sind benutzerdefinierte Taxonomie) + $series_count = wp_count_terms('series'); // 'series' ist die benutzerdefinierte Taxonomie + + // Eröffnungsdatum + $opening_date = get_option('statistik_manager_opening_date', ''); + + return [ + 'posts_count' => $posts_count, + 'comments_count' => $comments_count, + 'categories_count' => $categories_count, + 'series_count' => $series_count, + 'opening_date' => $opening_date + ]; +} + + // Banner-Funktion + function statistik_manager_display_banner($position) { + if (!get_option('statistik_manager_banner_enabled', 1)) { + return; + } + + $banner_text = get_option('statistik_manager_banner_text', 'Willkommen auf unserer Webseite!'); + $banner_color = get_option('statistik_manager_banner_color', '#0073aa'); + $banner_position = get_option('statistik_manager_banner_position', 'top'); + $font_size = get_option('statistik_manager_banner_font_size', 'medium'); + $banner_icon = get_option('statistik_manager_banner_icon', 'fas fa-info-circle'); // Standard-Icon + $show_icon = get_option('statistik_manager_show_icon', 1); // Option zur Aktivierung des Icons + + // Schriftgröße je nach Auswahl setzen + switch ($font_size) { + case 'small': + $font_size_css = '14px'; + break; + case 'medium': + $font_size_css = '18px'; + break; + case 'large': + $font_size_css = '24px'; + break; + default: + $font_size_css = '18px'; + } + + if ($banner_position !== $position) { + return; + } + + // Standard-Styles für das Banner + $style = "background-color: " . esc_attr($banner_color) . "; + color: #fff; + text-align: center; + padding: 10px; + width: 100%; + height: 50px; /* Feste Höhe */ + line-height: 30px; /* Zentrierte Schrift */ + z-index: 9999; + position: fixed; + top: 0; + left: 0;"; + + $text_style = "font-size: " . esc_attr($font_size_css) . ";"; + $icon_style = "font-size: 24px; margin-right: 8px;"; // Feste Größe für Icon + + echo '
    '; + + // Icon nur anzeigen, wenn gewünscht + if ($show_icon && !empty($banner_icon)) { + echo ''; + } + + echo '' . esc_html($banner_text) . ''; + echo '
    '; + } + + // Funktion für das Banner im Header (nach ) + function statistik_manager_display_banner_header() { + add_action('wp_body_open', function() { + statistik_manager_display_banner('top'); + }); + } + + // Falls `wp_body_open` nicht unterstützt wird, als Fallback `wp_footer` nutzen + function statistik_manager_display_banner_header_fallback() { + add_action('wp_footer', function() { + statistik_manager_display_banner('top'); + }, 5); + } + + // Funktion für das Banner im Footer + function statistik_manager_display_banner_footer() { + add_action('wp_footer', function() { + statistik_manager_display_banner('bottom'); + }, 10); + } + + // Banner laden (Header mit Fallback) + if (function_exists('wp_body_open')) { + statistik_manager_display_banner_header(); + } else { + statistik_manager_display_banner_header_fallback(); + } + + // Fix: Admin-Leiste (Wenn Admin angemeldet ist, Banner nach unten verschieben) + function statistik_manager_admin_bar_fix() { + if (is_admin_bar_showing()) { + echo ''; + } else { + echo ''; + } + } + add_action('wp_head', 'statistik_manager_admin_bar_fix'); + +// Shortcode für die Anzeige der Statistiken +function statistik_manager_shortcode() { + $statistics = statistik_manager_get_statistics(); + $webseitenname = get_bloginfo('name'); + + $output = '
    '; + $output .= '

    Statistikübersicht

    '; + $output .= '
    '; + + if (get_option('statistik_manager_show_posts')) { + $output .= '
    '; + $output .= '

    Beiträge:
    ' . $statistics['posts_count'] . '

    '; + } + if (get_option('statistik_manager_show_comments')) { + $output .= '
    '; + $output .= '

    Kommentare:
    ' . $statistics['comments_count'] . '

    '; + } + if (get_option('statistik_manager_show_categories')) { + $output .= '
    '; + $output .= '

    Kategorien:
    ' . $statistics['categories_count'] . '

    '; + } + if (get_option('statistik_manager_show_series')) { + $output .= '
    '; + $output .= '

    Serien:
    ' . $statistics['series_count'] . '

    '; + } + $output .= '
    '; + + // Eröffnungsdatum anzeigen, wenn gesetzt + if (!empty($statistics['opening_date'])) { + $formatted_date = date('d.m.Y', strtotime($statistics['opening_date'])); + $output .= '
    '; + $output .= ''; + $output .= '

    ' . sprintf(__('%s wurde am %s eröffnet.', 'statistik-manager'), esc_html($webseitenname), esc_html($formatted_date)) . '

    '; + $output .= '
    '; + } + + $output .= '
    '; + return $output; +} + +add_shortcode('statistik_manager', 'statistik_manager_shortcode'); + +// Admin-Panel CSS einbinden, nur auf der Plugin-Seite +function statistik_manager_enqueue_admin_styles($hook) { + if ($hook === 'toplevel_page_statistik_manager') { + wp_enqueue_style('statistik-manager-admin-style', plugins_url('css/admin-style.css', __FILE__)); + } +} +add_action('admin_enqueue_scripts', 'statistik_manager_enqueue_admin_styles'); + +// Frontend CSS nur einbinden, wenn der Shortcode verwendet wird +function statistik_manager_enqueue_frontend_styles() { + if (has_shortcode(get_post()->post_content, 'statistik_manager')) { + wp_enqueue_style('statistik-manager-frontend-style', plugins_url('css/style.css', __FILE__)); + } +} +add_action('wp_enqueue_scripts', 'statistik_manager_enqueue_frontend_styles'); + +function statistik_manager_menu() { + add_menu_page( + 'WP Stat & Notice', // Ändern Sie den Seitentitel + 'WP Stat & Notice', // Ändern Sie die Menübezeichnung + 'manage_options', // Berechtigungen + 'statistik_manager', // Menü-Slug + 'statistik_manager_options_page', // Callback-Funktion + 'dashicons-chart-pie' // Dashicon-Icon + ); +} +add_action('admin_menu', 'statistik_manager_menu'); + +// Funktion für die Plugin-Optionen-Seite +function statistik_manager_options_page() { + ?> +
    +

    + + + +
    +
    +
    + +

    + + + + + +
    + /> +
    + /> +
    + /> +
    + /> + +
    + +

    + + + + + +
    + 'category', + 'orderby' => 'name', + 'order' => 'ASC', + 'hide_empty' => false, + )); + + if (!empty($categories) && !is_wp_error($categories)) : + $selected_categories = get_option('statistik_manager_selected_categories', []); + ?> + + +
    + +

    + + + + + +
    + +
    + +

    Banner-Einstellungen

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Banner anzeigen + /> + +
    Banner Text
    Banner Farbe
    Banner Position + +
    Icon auswählen + +
    Icon anzeigen + /> + +
    Schriftgröße + +
    + + +
    +
    + + +
    + + + +
    +

    Kurzanleitung für den Statistik Manager

    +

    Verwenden Sie den Statistik Manager, um eine benutzerdefinierte Statistik Box auf Ihrer Website anzuzeigen und wichtige Statistiken zu verfolgen. Hier ist eine kurze Anleitung:

    +
      +
    1. Fügen Sie den Shortcode ein: Um die Statistik Box anzuzeigen, fügen Sie den folgenden Shortcode an der gewünschten Stelle in Ihrem Beitrag oder Ihrer Seite ein: [statistik_manager].
    2. +
    3. Statistiken anzeigen: Die Statistik Box zeigt automatisch verschiedene Statistiken an. Sie können folgende Statistiken anzeigen lassen: +
        +
      • Beiträge: Zeigt die Gesamtzahl der veröffentlichten Beiträge auf Ihrer Webseite.
      • +
      • Kommentare: Zeigt die Gesamtzahl der eingegangenen Kommentare auf Ihren Beiträgen.
      • +
      • Kategorien: Zeigt die Anzahl der erstellten Kategorien auf Ihrer Webseite.
      • +
      • Serien: Zeigt die Gesamtzahl der Serien, falls Ihre Seite Serieninhalte enthält.
      • +
      +
    4. +
    5. Auswahl der zu zählenden Kategorien: In den Plugin-Einstellungen können Sie auswählen, welche Kategorien in die Statistik einbezogen werden sollen, z. B. Kommentare, Beiträge oder benutzerdefinierte Kategorien.
    6. +
    7. Eröffnungsdatum der Webseite: Das Eröffnungsdatum Ihrer Website wird automatisch in der Statistik Box angezeigt, damit Besucher sehen können, wie lange Ihre Seite bereits online ist.
    8. +
    9. Banner hinzufügen: Sie können in den Plugin-Einstellungen auch ein Banner für die Statistik Box hinzufügen, das individuell angepasst werden kann (z. B. als Werbung oder für besondere Hinweise).
    10. +
    +

    Die Statistik Box wird an der Stelle angezeigt, an der der Shortcode eingefügt wurde. Alle Statistiken und Inhalte können jederzeit über die Plugin-Einstellungen angepasst werden.

    +

    Bei Fragen oder Problemen können Sie sich jederzeit an uns wenden!

    + +

    Kurzanleitung zur Lesezeichen-Verwaltung

    +

    Zusätzlich zur Anzeige von Statistiken können Sie auch eine benutzerdefinierte Liste von Lesezeichen für Ihre Gäste verwalten. Hier sind die wichtigen Schritte:

    +
      +
    1. Fügen Sie den Shortcode für Lesezeichen ein: Um die Lesezeichen-Liste anzuzeigen, fügen Sie den folgenden Shortcode an der gewünschten Stelle in Ihrem Beitrag oder Ihrer Seite ein: [display_bookmarks].
    2. +
    3. Lesezeichen hinzufügen: Besucher können Lesezeichen zu Ihren Seiten hinzufügen. Diese erscheinen automatisch in der Liste der gespeicherten Lesezeichen. Um ein Lesezeichen hinzuzufügen, müssen sie den Shortcode [add_bookmark] verwenden, der ein Formular zum Speichern eines Lesezeichens anzeigt.
    4. +
    5. Lesezeichen löschen: Sie können Lesezeichen jederzeit löschen, indem Sie auf den „Lesezeichen Löschen“-Button neben dem jeweiligen Eintrag klicken. Nur der Besitzer des Lesezeichens kann es löschen.
    6. +
    +

    Wenn Sie Fragen oder Probleme haben, wenden Sie sich an uns!

    +
    + + + + + +
    +
    +