diff --git a/wp-multi.php b/wp-multi.php
new file mode 100644
index 0000000..b8a7800
--- /dev/null
+++ b/wp-multi.php
@@ -0,0 +1,5140 @@
+ true,
+ 'html_images' => true,
+ 'plaintext_urls' => true,
+ 'youtube_videos' => true,
+ 'googlevideo_videos' => true,
+ 'youtube_playlists' => true,
+ 'old_youtube_videos' => true,
+ 'smart_youtube' => true,
+ 'dailymotion_videos' => true,
+ 'vimeo_videos' => true,
+ ]);
+
+ ?>
+
+
+
+
Broken Link Checker
+
+
+
+
Status
+
0 fehlerhafte Links gefunden
+
0 eindeutige Links wurden in 0 Links erkannt
+
Link-Überprüfung: Alle Stunden
+
Vorhandene Links werden regelmäßig erneut kontrolliert. Neue Links werden normalerweise sofort geprüft.
+
+
+
Link-Überprüfung
+
Jetzt auf kaputte Links prüfen
+
+
+
+
Prüfe Links...
+
+
0%
+
+
+
+
+
+
+
E-Mail-Benachrichtigungen
+
+
+
+
+
+
+
+
+ '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 ) ) {
+ // 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() {
+ ?>
+
+
+
+
+
Diese Funktion fügt automatisch Tag zu Beiträgen hinzu, die noch keine haben.
+
+
+
+
Jetzt ausführen
+
+
+
+
+
+
+
+
+
+
+ '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 - Anti Spam
+
+
+
+
+
+
+
+
+
+
+
+
WP Multi - Anti Spam Statistik
+
+
+
+
+
+
+ Statistik
+ Wert
+
+
+
+
+ Blockierte Kommentare
+
+
+
+ Aktivierte Honeypot-Felder
+
+
+
+ Spammer-IP-Adressen
+
+
+
+ Spam-Einreichungen
+
+
+
+
+
+
Spammer-IP-Adressen
+
+
+
+
Keine Spammer-IP-Adressen gefunden.
+
+
+
+
+
+ ';
+ echo ' ';
+ echo '🔄 Neu ';
+ 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 '' . esc_textarea(get_option('wp_multi_blocked_ips')) . ' ';
+}
+
+
+// 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 'Bitte nicht ausfüllen ';
+ 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 'ID IP-Adresse Versuche Letzter Versuch Aktionen ';
+ echo '';
+
+ foreach ($blocked_ips as $ip) {
+ echo '';
+ echo '' . $ip->id . ' ';
+ echo '' . $ip->ip . ' ';
+ echo '' . $ip->attempts . ' ';
+ echo '' . $ip->last_attempt . ' ';
+ echo 'Entfernen ';
+ echo ' ';
+ }
+
+ echo ' ';
+ echo '
';
+
+ // 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 '';
+ 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, 10) . '...'; // Zeigt nur eine Vorschau der Nachricht
+ echo ' ';
+ }
+ 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();
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $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 '';
+ }
+
+ // 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 . '%'
+ ));
+
+ ?>
+
+ 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
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 '-- Shortcode auswählen -- ';
+
+ foreach ($shortcodes as $shortcode) {
+ echo '' . esc_html($shortcode->shortcode_name) . ' ';
+ }
+
+ echo ' ';
+ echo 'Einfügen ';
+ } 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() {
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .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() {
+ ?>
+
+
+ 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
+ ?>
+
+
+ >
+ Discord Benachrichtigung senden
+
+
+ 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 '' . esc_textarea($value) . ' ';
+ 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 '' . esc_textarea($value) . ' ';
+ 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 ' ' . __('Benachrichtigung senden', 'wp-stat-notice') . ' ';
+}
+
+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') . ' ';
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+ 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);
+
+ ?>
+
+
+ $value) { ?>
+ >
+
+
+
+
+
+ $value) { ?>
+ >
+
+
+ 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 '' . __('Titel', 'wp-stat-notice') . ' ' . __('URL', 'wp-stat-notice') . ' ' . __('Aktionen', 'wp-stat-notice') . ' ';
+ echo '';
+ foreach ($custom_pages as $index => $page) {
+ echo '';
+ echo '' . esc_html($page['title']) . ' ';
+ echo '' . esc_html($page['url']) . ' ';
+ echo '';
+ echo '' . __('Bearbeiten', 'wp-stat-notice') . ' | ';
+ echo '' . __('Löschen', 'wp-stat-notice') . ' ';
+ echo ' ';
+ echo ' ';
+ }
+ echo ' ';
+ 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();
+ ?>
+
+ Beitrag melden
+
+
+
+
+ Bericht absenden
+
+
+
+ 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 'Beitrag Datum Grund ';
+
+ foreach ($reports as $report) {
+ $post = get_post($report->post_id);
+ echo '';
+ echo '' . esc_html($post->post_title) . ' ';
+ echo '' . esc_html($report->report_date) . ' ';
+ echo '' . esc_html($report->reason) . ' ';
+ echo ' ';
+ }
+
+ echo '
';
+}
+
+// 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");
+
+ ?>
+
+
+
+
+
+ Beitrag
+ Datum
+ Name
+ Grund
+ Status
+ Aktionen
+
+
+
+ post_id); ?>
+
+ 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 .= '
';
+
+ foreach ($bookmarks as $bookmark) {
+ $bookmark_url = get_post_meta($bookmark->ID, '_bookmark_url', true);
+ $bookmark_id = $bookmark->ID;
+ $bookmark_name = get_the_title($bookmark); // Benutzerdefinierter Name des Lesezeichens
+
+ // Ausgabe des Lesezeichens mit getauschtem Button und Titel
+ $output .= '';
+ // Button kommt nun vor dem Titel
+ $output .= ' ' . __('Lesezeichen Löschen', 'statistik-manager') . ' ';
+ $output .= '' . esc_html($bookmark_name) . ' ';
+ $output .= ' ';
+ }
+
+ $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 .= '' . __('Lesezeichen Löschen', 'statistik-manager') . ' ';
+ $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() {
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Banner-Einstellungen
+
+
+
+
+
+
+
+
+
+
+
+
+
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:
+
+ 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]
.
+ 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.
+
+
+ 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.
+ 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.
+ 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).
+
+
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:
+
+ 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]
.
+ 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.
+ 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.
+
+
Wenn Sie Fragen oder Probleme haben, wenden Sie sich an uns!
+
+
+
+
+
+
+
+
+