From fbf63a1efca9bb7cfcfb649b4c7454e0dd57908d Mon Sep 17 00:00:00 2001 From: M_Viper Date: Sat, 8 Mar 2025 13:16:33 +0000 Subject: [PATCH] wp-multi.php aktualisiert --- wp-multi.php | 10098 ++++++++++++++++++++++++------------------------- 1 file changed, 4959 insertions(+), 5139 deletions(-) diff --git a/wp-multi.php b/wp-multi.php index b8a7800..680e554 100644 --- a/wp-multi.php +++ b/wp-multi.php @@ -1,5140 +1,4960 @@ - 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!

    -
    - - - - - -
    -
    - 20, // Maximale Beiträge pro Seite + ), $atts, 'alphabetical_index'); + + // Hole alle Beiträge + $args = array( + 'post_type' => 'post', + 'posts_per_page' => -1, // Alle Beiträge (wir filtern später nach Buchstabenbereich) + 'orderby' => 'title', + 'order' => 'ASC', + ); + + $posts = get_posts($args); + + // Beiträge nach Anfangsbuchstaben gruppieren + $alphabet = range('A', 'Z'); + $posts_by_letter = array(); + + foreach ($posts as $post) { + $first_letter = strtoupper(substr($post->post_title, 0, 1)); + if (in_array($first_letter, $alphabet)) { + $posts_by_letter[$first_letter][] = $post; + } + } + + // Holen des aktuellen Buchstabens aus der URL + $letter = isset($_GET['letter']) ? strtoupper($_GET['letter']) : ''; // Der Buchstabe aus der URL + + // Bestimme, welche Beiträge angezeigt werden + $posts_in_letter = []; + if ($letter && isset($posts_by_letter[$letter])) { + $posts_in_letter = $posts_by_letter[$letter]; + } + + // Teile die Beiträge in zwei Hälften für die Boxen + $halfway = ceil(count($posts_in_letter) / 2); // Rundet die Hälfte auf + $first_half = array_slice($posts_in_letter, 0, $halfway); // Erste Hälfte der Beiträge + $second_half = array_slice($posts_in_letter, $halfway); // Zweite Hälfte der Beiträge + + // Ausgabe + ob_start(); + ?> + +
    + + + + + +
    +

    Beiträge für:

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

    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.

    + +
    +
    + + + 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

    +
      + ' . esc_html($shortcode->shortcode_name) . ': ' . esc_html($shortcode->shortcode_content) . ' + Löschen'; + } + } else { + echo '
    • Keine benutzerdefinierten Shortcodes gefunden.
    • '; + } + ?> +
    +
    + + + +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 = '9a8bfc571ec98af17bdfadf9e8495c6c330d8c7d'; + + // 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!

    +
    + + + + + +
    +
    +