%s %s %s %s
%s: %s %s %s %s %s
',
esc_html__('Danke, dass du WP Multi verwendest!', 'wp-multi'),
esc_html__('Dein Feedback hilft uns, das Plugin ständig zu verbessern. Wenn du Fehler entdeckst oder Verbesserungsvorschläge hast, besuche bitte unsere', 'wp-multi'),
'https://git.viper.ipv64.net/M_Viper/wp-multi',
esc_html__('Gitea-Seite', 'wp-multi'),
esc_html__('und teile uns deine Ideen mit!', 'wp-multi'),
esc_html__('Support', 'wp-multi'),
esc_html__('Bei Fragen oder Supportanfragen kannst du uns über', 'wp-multi'),
'https://teams.live.com/l/community/FEAzokphpZTJ2u6OgI',
esc_html__('Microsoft Teams', 'wp-multi'),
esc_html__('oder', 'wp-multi'),
'https://t.me/M_Viper04',
esc_html__('Telegram', 'wp-multi'),
esc_html__('erreichen.', 'wp-multi')
);
}
add_action('admin_notices', 'wp_multi_add_warning_banner');
// Support-Links in der Plugin-Übersicht anzeigen
function wp_multi_plugin_row_meta($links, $file) {
if ($file === plugin_basename(__FILE__)) {
$new_links = array(
'support_teams' => sprintf(
'%s ',
esc_url('https://teams.live.com/l/community/FEAzokphpZTJ2u6OgI'),
esc_html__('Microsoft Teams Support', 'wp-multi')
),
'support_telegram' => sprintf(
'%s ',
esc_url('https://t.me/M_Viper04'),
esc_html__('Telegram Support', 'wp-multi')
),
);
$links = array_merge($links, $new_links);
}
return $links;
}
add_filter('plugin_row_meta', 'wp_multi_plugin_row_meta', 10, 2);
/*
* Index Verzeichnis [alphabetical_index]
*/
// Shortcode zum Erstellen des Indexes
function wp_multi_alphabetical_index($atts) {
// Definiere die Argumente für den Shortcode
$atts = shortcode_atts(array(
'posts_per_page' => 20, // Maximale Beiträge pro Seite
), $atts, 'alphabetical_index');
// Hole alle Beiträge
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'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();
?>
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 );
/*
* Verbessertes Auto-Tag-Plugin mit optimierter Sicherheit, Performance und Benutzerfreundlichkeit
*/
define('WP_MULTI_AUTO_TAGS_OPTION', 'wp_multi_custom_stopwords');
define('WP_MULTI_AUTO_TAGS_QUEUE', 'wp_multi_auto_tags_queue');
define('WP_MULTI_AUTO_TAGS_NONCE', 'wp_multi_auto_tags_nonce');
/**
* Fügt automatische Tags zu einem Beitrag hinzu.
*
* @param int $post_id ID des Beitrags.
*/
function wp_multi_auto_add_tags($post_id) {
if (get_post_type($post_id) !== 'post') {
return;
}
$existing_tags = wp_get_post_tags($post_id, ['fields' => 'names']);
if (!empty($existing_tags)) {
return;
}
$post = get_post($post_id);
if (!$post) {
error_log("WP Multi Auto Tags: Beitrag $post_id nicht gefunden.");
return;
}
$content = strip_tags($post->post_content);
$content = mb_strtolower($content, 'UTF-8');
// Stopwörter laden
$stopwords = wp_multi_get_stopwords();
$words = wp_multi_extract_words($content, $stopwords);
if (empty($words)) {
return;
}
$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, $top_tags, true);
}
}
/**
* Extrahiert relevante Wörter aus dem Inhalt.
*
* @param string $content Der Inhalt des Beitrags.
* @param array $stopwords Liste der Stopwörter.
* @return array Liste der extrahierten Wörter.
*/
function wp_multi_extract_words($content, $stopwords) {
preg_match_all('/\b[a-zäöüß]{4,}\b/u', $content, $matches);
return array_unique(array_diff($matches[0], $stopwords));
}
/**
* Lädt die kombinierten Stopwörter (Standard + benutzerdefiniert).
*
* @return array Liste der Stopwörter.
*/
function wp_multi_get_stopwords() {
$cache_key = 'wp_multi_stopwords';
$stopwords = get_transient($cache_key);
if ($stopwords !== false) {
return $stopwords;
}
$custom_stopwords = get_option(WP_MULTI_AUTO_TAGS_OPTION, '');
$custom_stopwords = array_filter(array_map('trim', explode(',', sanitize_text_field($custom_stopwords))));
$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'
];
$stopwords = array_merge($default_stopwords, $custom_stopwords);
set_transient($cache_key, $stopwords, DAY_IN_SECONDS);
return $stopwords;
}
/**
* Fügt das Admin-Menü für automatische Tags hinzu.
*/
function wp_multi_admin_menu() {
add_submenu_page(
'edit.php',
__('Automatische Tags', 'wp-multi'),
__('Automatische Tags', 'wp-multi'),
'manage_options',
'wp-multi-auto-tags',
'wp_multi_auto_tags_page'
);
}
add_action('admin_menu', 'wp_multi_admin_menu');
/**
* Rendert die Admin-Seite für automatische Tags.
*/
function wp_multi_auto_tags_page() {
if (!current_user_can('manage_options')) {
wp_die(__('Zugriff verweigert.', 'wp-multi'));
}
?>
admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce(WP_MULTI_AUTO_TAGS_NONCE),
'messages' => [
'processing' => __('Wird verarbeitet...', 'wp-multi'),
'run' => __('Jetzt ausführen', 'wp-multi'),
'loading' => __('Lade...', 'wp-multi'),
'no_posts' => __('Keine Beiträge gefunden.', 'wp-multi'),
'success' => __('Automatische Tags erfolgreich hinzugefügt!', 'wp-multi'),
'error' => __('Fehler bei der Verarbeitung.', 'wp-multi'),
'start_error' => __('Fehler beim Starten der Verarbeitung.', 'wp-multi'),
],
]);
?>
function($input) {
$input = sanitize_text_field($input);
return implode(',', array_map('trim', explode(',', $input)));
},
]);
}
add_action('admin_init', 'wp_multi_auto_tags_settings_init');
/**
* Verarbeitet die Initialisierung der Auto-Tag-Verarbeitung via AJAX.
*/
function wp_multi_process_auto_tags() {
check_ajax_referer(WP_MULTI_AUTO_TAGS_NONCE, 'nonce');
$args = [
'post_type' => 'post',
'posts_per_page' => 100,
'fields' => 'ids',
'no_found_rows' => true, // Optimierung
];
$posts = get_posts($args);
if (empty($posts)) {
wp_send_json_success(['total' => 0]);
}
set_transient(WP_MULTI_AUTO_TAGS_QUEUE, $posts, 300);
wp_send_json_success(['total' => count($posts)]);
}
add_action('wp_ajax_wp_multi_process_auto_tags', 'wp_multi_process_auto_tags');
/**
* Verarbeitet einen Batch von Beiträgen für die Auto-Tag-Verarbeitung.
*/
function wp_multi_process_auto_tags_step() {
check_ajax_referer(WP_MULTI_AUTO_TAGS_NONCE, 'nonce');
$queue = get_transient(WP_MULTI_AUTO_TAGS_QUEUE);
$batchSize = isset($_POST['batchSize']) ? absint($_POST['batchSize']) : 10;
$batchSize = max(1, min($batchSize, 50));
if (!$queue || empty($queue)) {
wp_send_json_success(['done' => false]);
}
set_time_limit(30); // Timeout verhindern
$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_success(['done' => true]);
}
add_action('wp_ajax_wp_multi_process_auto_tags_step', 'wp_multi_process_auto_tags_step');
/**
* Fügt Tags automatisch bei neuen oder aktualisierten Beiträgen hinzu.
*
* @param int $post_id ID des Beitrags.
*/
function wp_multi_auto_tag_on_save($post_id) {
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
wp_multi_auto_add_tags($post_id);
}
add_action('save_post', 'wp_multi_auto_tag_on_save', 10, 1);
/*
* 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.
Generieren
Verwenden Sie ein zufälliges Zeichenfolgen für das Honeypot-Feld.
Die Nachricht, die angezeigt wird, wenn ein Honeypot ausgelöst wird.
>
Deaktivieren Sie das Honeypot-Test-Widget im Frontend.
Maximale Anzahl von Links, die in einem Kommentar erlaubt sind.
Schlüsselwörter, die blockiert werden sollen (durch Kommas getrennt).
Blockierte IP-Adressen (jede Adresse in einer neuen Zeile).
prefix . 'blocked_ips';
$user = get_user_by('login', $username);
$max_attempts = 3;
$block_threshold = 5;
$row = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE ip = %s", $ip));
if ($row) {
$wpdb->update(
$table_name,
array(
'attempts' => $row->attempts + 1,
'last_attempt' => current_time('mysql'),
),
array('ip' => $ip),
array('%d', '%s'),
array('%s')
);
$attempts = $row->attempts + 1;
} else {
$wpdb->insert(
$table_name,
array(
'ip' => $ip,
'attempts' => 1,
'last_attempt' => current_time('mysql'),
),
array('%s', '%d', '%s')
);
$attempts = 1;
}
if ($attempts >= $block_threshold) {
$email_sent = (int) get_option('failed_login_email_sent_' . $ip, 0);
if ($email_sent < $max_attempts) {
if ($user) {
wp_mail(
$user->user_email,
__('Deine IP-Adresse wurde gesperrt', 'wp-multi'),
sprintf(
__("Hallo %s,\n\nDeine IP-Adresse wurde aufgrund zu vieler fehlgeschlagener Anmeldeversuche gesperrt. Bitte kontaktiere den Administrator.", 'wp-multi'),
$user->user_login
),
array('Content-Type: text/plain; charset=UTF-8')
);
}
update_option('failed_login_email_sent_' . $ip, $email_sent + 1);
}
wp_die(
__('Deine IP-Adresse wurde aufgrund zu vieler Fehlversuche gesperrt. Bitte versuche es später noch einmal.', 'wp-multi'),
__('Zugriff gesperrt', 'wp-multi'),
array('response' => 403)
);
}
}
// Hook für fehlgeschlagene Anmeldungen
add_action('wp_login_failed', 'wp_multi_log_failed_login', 10, 1);
// Funktion zur Erstellung der Tabelle für blockierte IPs
function wp_multi_create_blocked_ips_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'blocked_ips';
$charset_collate = $wpdb->get_charset_collate();
$version = get_option('wp_multi_blocked_ips_version', '1.0');
if (version_compare($version, '1.1', '<')) {
$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),
KEY ip (ip)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
update_option('wp_multi_blocked_ips_version', '1.1');
}
}
register_activation_hook(__FILE__, 'wp_multi_create_blocked_ips_table');
// Wöchentliche Zusammenfassung
function wp_multi_send_weekly_summary() {
global $wpdb;
$table_name = $wpdb->prefix . 'blocked_ips';
$last_email_time = get_option('wp_multi_last_summary_email', 0);
$current_time = time();
// Prüfen, ob eine Woche vergangen ist (7 Tage = 604800 Sekunden)
if (($current_time - $last_email_time) < 604800) {
return;
}
// Zeitraum für die Zusammenfassung (letzte Woche)
$week_ago = date('Y-m-d H:i:s', strtotime('-7 days'));
$now = date('Y-m-d H:i:s');
// Gesamtzahl der Angriffe
$total_attacks = $wpdb->get_var(
$wpdb->prepare(
"SELECT SUM(attempts) FROM $table_name WHERE last_attempt >= %s",
$week_ago
)
);
$total_attacks = $total_attacks ? $total_attacks : 0;
// Top 10 IPs mit den meisten Angriffen
$top_ips = $wpdb->get_results(
$wpdb->prepare(
"SELECT ip, attempts, last_attempt
FROM $table_name
WHERE last_attempt >= %s
ORDER BY attempts DESC
LIMIT 10",
$week_ago
)
);
// E-Mail-Inhalt
$message = __("Wöchentliche Brute-Force-Zusammenfassung\n\n", 'wp-multi');
$message .= sprintf(__("Zeitraum: %s bis %s\n\n", 'wp-multi'), $week_ago, $now);
$message .= sprintf(__("Gesamtzahl der Angriffe: %d\n\n", 'wp-multi'), $total_attacks);
$message .= __("Top 10 IPs mit den meisten Angriffen:\n", 'wp-multi');
if ($top_ips) {
foreach ($top_ips as $index => $ip) {
$message .= sprintf(
__("%d. IP: %s, Versuche: %d, Letzter Versuch: %s\n", 'wp-multi'),
$index + 1,
$ip->ip,
$ip->attempts,
$ip->last_attempt
);
}
} else {
$message .= __("Keine IPs mit Angriffen in diesem Zeitraum.\n", 'wp-multi');
}
// E-Mail an Admin senden
$admin_email = get_option('admin_email');
wp_mail(
$admin_email,
__('Wöchentliche Brute-Force-Zusammenfassung', 'wp-multi'),
$message,
array('Content-Type: text/plain; charset=UTF-8')
);
// Aktualisiere den Zeitstempel der letzten E-Mail
update_option('wp_multi_last_summary_email', $current_time);
}
// Planen der wöchentlichen Zusammenfassung (jeden Montag um 8:00 Uhr)
function wp_multi_schedule_weekly_summary() {
if (!wp_next_scheduled('wp_multi_weekly_summary_event')) {
wp_schedule_event(strtotime('next Monday 08:00'), 'weekly', 'wp_multi_weekly_summary_event');
}
}
add_action('wp', 'wp_multi_schedule_weekly_summary');
// Hook für die Ausführung der Zusammenfassung
add_action('wp_multi_weekly_summary_event', 'wp_multi_send_weekly_summary');
// Menüpunkt für blockierte IPs
function wp_multi_blocked_ips_menu() {
add_submenu_page(
'wp-multi-security',
__('Blockierte IPs', 'wp-multi'),
__('Blockierte IPs', 'wp-multi'),
'manage_options',
'wp_multi_blocked_ips',
'wp_multi_display_blocked_ips'
);
}
add_action('admin_menu', 'wp_multi_blocked_ips_menu');
// Anzeige der blockierten IPs im Admin-Bereich
function wp_multi_display_blocked_ips() {
global $wpdb;
$table_name = $wpdb->prefix . 'blocked_ips';
$five_days_ago = date('Y-m-d H:i:s', strtotime('-5 days'));
$per_page = 50;
$page = max(1, isset($_GET['paged']) ? intval($_GET['paged']) : 1);
$offset = ($page - 1) * $per_page;
$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
)
);
$total_ips = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE last_attempt >= %s", $five_days_ago));
$total_pages = ceil($total_ips / $per_page);
?>
id); ?>
ip); ?>
attempts); ?>
last_attempt); ?>
1) : ?>
add_query_arg('paged', '%#%'),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => $total_pages,
'current' => $page,
));
?>
query(
$wpdb->prepare(
"DELETE FROM $table_name WHERE attempts < 10 AND last_attempt < %s",
$three_days_ago
)
);
?>
403));
}
global $wpdb;
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
if ($id > 0) {
$table_name = $wpdb->prefix . 'blocked_ips';
$wpdb->delete($table_name, array('id' => $id), array('%d'));
}
wp_safe_redirect(admin_url('admin.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 mit verbesserten Sicherheits-, Performance- und Benutzerfreundlichkeits-Features
*/
define('WP_MULTI_ANALYTICS_TABLE', $wpdb->prefix . 'wp_multi_user_analytics');
/**
* Erstellt die Datenbanktabelle für Benutzer-Analytics.
*/
function wp_multi_create_analytics_table() {
global $wpdb;
$table_name = WP_MULTI_ANALYTICS_TABLE;
$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),
INDEX idx_timestamp (timestamp),
INDEX idx_action (action)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wp_multi_create_analytics_table');
/**
* Verfolgt Benutzerinteraktionen (Kommentare und Beitragsaufrufe).
*
* @param int $user_id Benutzer-ID.
* @param string $action Aktion (z. B. 'view', 'comment').
* @param int $post_id Beitrag-ID (optional).
* @return bool Erfolg der Operation.
*/
function wp_multi_track_user_activity($user_id, $action, $post_id = null) {
global $wpdb;
$table_name = WP_MULTI_ANALYTICS_TABLE;
$user_id = absint($user_id);
$action = sanitize_text_field($action);
$post_id = $post_id ? absint($post_id) : null;
if ($action === 'view' && is_single()) {
$post_id = get_the_ID();
}
if (!$user_id || !$action) {
return false;
}
return $wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'action' => $action,
'post_id' => $post_id,
),
array('%d', '%s', '%d')
);
}
/**
* Verfolgt Kommentar-Aktivitäten.
*
* @param int $comment_id Kommentar-ID.
*/
function wp_multi_comment_activity($comment_id) {
$comment = get_comment($comment_id);
$user_id = absint($comment->user_id);
if ($user_id) {
wp_multi_track_user_activity($user_id, 'comment', $comment->comment_post_ID);
}
}
add_action('comment_post', 'wp_multi_comment_activity');
/**
* Verfolgt Beitragsaufrufe.
*/
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');
/**
* Ruft rohe Analytics-Daten aus der Datenbank ab.
*
* @param string $date_query Datum für die Abfrage.
* @return array Rohe Analytics-Daten.
*/
function wp_multi_fetch_raw_analytics($date_query = 'CURDATE() - INTERVAL 7 DAY') {
global $wpdb;
return $wpdb->get_results(
$wpdb->prepare(
"SELECT DATE(timestamp) AS date, action, post_id, COUNT(*) AS count, user_id, timestamp
FROM " . WP_MULTI_ANALYTICS_TABLE . "
WHERE timestamp >= %s
GROUP BY date, action, post_id, user_id, timestamp
ORDER BY date ASC",
date('Y-m-d H:i:s', strtotime($date_query))
)
);
}
/**
* Verarbeitet rohe Analytics-Daten für Diagramm und Tabelle.
*
* @param array $results Rohe Analytics-Daten.
* @return array Verarbeitete Daten.
*/
function wp_multi_process_analytics_data($results) {
$dates = [];
$comment_counts = [];
$view_counts = [];
foreach ($results as $result) {
$date = $result->date;
if (!in_array($date, $dates)) {
$dates[] = $date;
}
if ($result->action === 'comment') {
$comment_counts[$date] = ($comment_counts[$date] ?? 0) + $result->count;
} elseif ($result->action === 'view') {
$view_counts[$date] = ($view_counts[$date] ?? 0) + $result->count;
}
}
$all_dates = [];
$datasets = ['comments' => [], 'views' => []];
for ($i = 6; $i >= 0; $i--) {
$date = date('Y-m-d', strtotime("-$i day"));
$all_dates[] = $date;
$datasets['comments'][] = $comment_counts[$date] ?? 0;
$datasets['views'][] = $view_counts[$date] ?? 0;
}
return [
'dates' => array_reverse($all_dates),
'datasets' => [
[
'label' => __('Kommentare', 'wp-multi'),
'data' => array_reverse($datasets['comments']),
'borderColor' => 'rgba(75, 192, 192, 1)',
'borderWidth' => 1,
'fill' => false,
],
[
'label' => __('Beitragsaufrufe', 'wp-multi'),
'data' => array_reverse($datasets['views']),
'borderColor' => 'rgba(153, 102, 255, 1)',
'borderWidth' => 1,
'fill' => false,
]
],
'data' => $results
];
}
/**
* Ruft Analytics-Daten mit Caching ab.
*
* @param string $date_query Datum für die Abfrage.
* @return array Analytics-Daten.
*/
function wp_multi_get_analytics_data($date_query = 'CURDATE() - INTERVAL 7 DAY') {
$cache_key = 'wp_multi_analytics_data_' . md5($date_query);
$cached_data = get_transient($cache_key);
if ($cached_data !== false) {
return $cached_data;
}
$results = wp_multi_fetch_raw_analytics($date_query);
$data = wp_multi_process_analytics_data($results);
set_transient($cache_key, $data, HOUR_IN_SECONDS);
return $data;
}
/**
* Zeigt die Benutzer-Analytics-Seite im Admin-Bereich an.
*/
function wp_multi_display_user_analytics() {
global $wpdb;
if (!$wpdb->get_var("SHOW TABLES LIKE '" . WP_MULTI_ANALYTICS_TABLE . "'")) {
echo '' . esc_html__('Die Analytics-Tabelle existiert nicht. Bitte aktiviere das Plugin erneut.', 'wp-multi') . '
';
return;
}
$time_range = isset($_GET['time_range']) ? sanitize_text_field($_GET['time_range']) : '7days';
$date_query = 'CURDATE() - INTERVAL 7 DAY';
if ($time_range === '30days') {
$date_query = 'CURDATE() - INTERVAL 30 DAY';
} elseif ($time_range === 'custom' && isset($_GET['start_date'], $_GET['end_date'])) {
$start_date = sanitize_text_field($_GET['start_date']);
$end_date = sanitize_text_field($_GET['end_date']);
$date_query = "$start_date AND $end_date";
}
$results = wp_multi_get_analytics_data($date_query);
?>
'1',
'email' => '1',
'url' => '1',
'swear' => '1',
'ip' => '1',
'allowed_urls' => '',
'allowed_words' => '', // Neue Option für erlaubte Wörter
'filter_strength' => 'moderate', // Neue Option für Filterstärke
];
foreach ($options as $key => $default) {
add_option(WP_MULTI_FILTER_OPTION_PREFIX . $key, $default);
register_setting('wp_multi_filter_options_group', WP_MULTI_FILTER_OPTION_PREFIX . $key, [
'sanitize_callback' => $key === 'allowed_urls' || $key === 'allowed_words' ? 'sanitize_textarea_field' : 'sanitize_text_field',
]);
}
}
add_action('admin_init', 'wp_multi_register_comment_filter_settings');
/**
* Fügt das Admin-Menü für den Kommentar-Filter hinzu.
*/
function wp_multi_create_menu() {
add_submenu_page(
'users.php',
__('Benutzer sperren', 'wp-multi'),
__('Benutzer sperren', 'wp-multi'),
'manage_options',
'wp-multi-blocked-users',
'wp_multi_blocked_users_page'
);
add_submenu_page(
'edit-comments.php',
__('Kommentar-Filter Einstellungen', 'wp-multi'),
__('Kommentar-Filter', 'wp-multi'),
'manage_options',
'wp-multi-comment-filter-settings',
'wp_multi_comment_filter_settings_page'
);
}
add_action('admin_menu', 'wp_multi_create_menu');
/**
* Rendert die Admin-Seite für Kommentar-Filter-Einstellungen.
*/
function wp_multi_comment_filter_settings_page() {
?>
5]);
if (!is_wp_error($response)) {
$json_content = wp_remote_retrieve_body($response);
$decoded_data = json_decode($json_content, true);
if (json_last_error() === JSON_ERROR_NONE && isset($decoded_data['words']) && is_array($decoded_data['words'])) {
$swear_words = array_map('strtolower', $decoded_data['words']);
set_transient(WP_MULTI_SWEAR_WORDS_CACHE_KEY, $swear_words, DAY_IN_SECONDS);
} else {
error_log('WP Multi Filter: Fehler beim Dekodieren der Schimpfwort-JSON-Datei.');
}
} else {
error_log('WP Multi Filter: Fehler beim Abrufen der Schimpfwort-Liste: ' . $response->get_error_message());
}
// Fallback: Standard-Schimpfwörter, falls die externe Liste nicht verfügbar ist
if (empty($swear_words)) {
$swear_words = ['beispielwort1', 'beispielwort2']; // Ersetze durch echte Fallback-Wörter
}
return $swear_words;
}
/**
* Filtert Schimpfwörter basierend auf der Filterstärke.
*
* @param string $content Kommentarinhalt.
* @param array $swear_words Schimpfwörter.
* @param array $allowed_words Erlaubte Wörter.
* @param string $strength Filterstärke.
* @return string Gefilterter Inhalt.
*/
function wp_multi_filter_swear_words($content, $swear_words, $allowed_words, $strength) {
if (empty($swear_words)) {
return $content;
}
foreach ($swear_words as $word) {
if (in_array(strtolower($word), $allowed_words)) {
continue;
}
$pattern = ($strength === 'loose')
? '/\b' . preg_quote($word, '/') . '\b/iu'
: '/\b' . preg_quote($word, '/') . '[a-z0-9]*\b/iu';
if ($strength === 'moderate') {
$pattern = '/\b' . preg_quote($word, '/') . '\b/iu';
}
$replacement = str_repeat('*', mb_strlen($word));
$content = preg_replace($pattern, $replacement, $content);
}
return $content;
}
/**
* Filtert Kommentarinhalte basierend auf den Einstellungen.
*
* @param string $comment_content Kommentarinhalt.
* @return string Gefilterter Inhalt.
*/
function wp_multi_filter_comment_content($comment_content) {
if (get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'swear') == 1) {
$swear_words = wp_multi_load_swear_words();
$allowed_words = array_map('strtolower', array_map('trim', explode(',', get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'allowed_words', ''))));
$filter_strength = get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'filter_strength', 'moderate');
$comment_content = wp_multi_filter_swear_words($comment_content, $swear_words, $allowed_words, $filter_strength);
}
if (get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'phone') == 1) {
$comment_content = preg_replace('/\b(\+?[0-9]{1,3}[-.\s]?)?(\(?\d{2,4}\)?[-.\s]?\d{2,4}[-.\s]?\d{2,4})\b/i', '**********', $comment_content);
}
if (get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'email') == 1) {
$comment_content = preg_replace('/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/i', '**********', $comment_content);
}
if (get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'url') == 1) {
$allowed_urls = array_map('strtolower', array_map('trim', explode(',', get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'allowed_urls', ''))));
$comment_content = preg_replace_callback(
'/\b((https?:\/\/)?(www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(\/\S*)?\b/i',
function ($matches) use ($allowed_urls) {
$url = strtolower(preg_replace(['/^https?:\/\//', '/^www\./'], '', $matches[0]));
return in_array($url, $allowed_urls) ? $matches[0] : '**************';
},
$comment_content
);
}
if (get_option(WP_MULTI_FILTER_OPTION_PREFIX . 'ip') == 1) {
$comment_content = preg_replace('/\b(?:\d{1,3}\.){3}\d{1,3}\b/', '**********', $comment_content);
}
return $comment_content;
}
add_filter('pre_comment_content', 'wp_multi_filter_comment_content');
/*
* User Kommentar Blocken
*/
// Funktion zum Erstellen der Tabelle für gesperrte Benutzer
function wp_multi_create_blocked_users_table() {
global $wpdb;
$table_name = $wpdb->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');
/*
* 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) {
$guest_author = get_post_meta($post->ID, '_guest_author', true);
?>
ID, '_guest_author', true);
if (!empty($guest_author)) {
$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');
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);
echo !empty($guest_author) ? esc_html($guest_author) : __('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() {
// Sortierparameter aus URL lesen
$orderby = isset($_GET['orderby']) ? sanitize_key($_GET['orderby']) : 'guest_author';
$order = isset($_GET['order']) && in_array(strtoupper($_GET['order']), ['ASC', 'DESC']) ? strtoupper($_GET['order']) : 'ASC';
// Gültige Sortierfelder
$valid_orderby = ['guest_author' => 'pm.meta_value', 'posts' => 'post_count'];
$sql_orderby = isset($valid_orderby[$orderby]) ? $valid_orderby[$orderby] : 'pm.meta_value';
$sql_order = $order;
// Basis-URL für Sortier-Links
$base_url = add_query_arg(['page' => 'guest_author_overview'], admin_url('users.php'));
?>
posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE pm.meta_key = '_guest_author'
AND pm.meta_value != ''
AND p.post_status = 'publish'
GROUP BY pm.meta_value
ORDER BY {$sql_orderby} {$sql_order}
";
$guest_authors = $wpdb->get_results($query);
if ($guest_authors) {
foreach ($guest_authors as $author) {
?>
guest_author); ?>
post_count); ?>
' . __('Keine Gast-Autoren gefunden.', 'wp-multi') . ' ';
}
?>
$page_title,
'post_name' => $page_slug,
'post_content' => '[guest_author_posts]',
'post_status' => 'publish',
'post_type' => 'page',
));
if ($page_id && !is_wp_error($page_id)) {
update_option('wp_multi_guest_author_page_id', $page_id);
}
} else {
update_option('wp_multi_guest_author_page_id', $page->ID);
}
}
add_action('init', 'wp_multi_create_guest_author_page');
// Shortcode für Gastautoren-Liste
function wp_multi_guest_author_shortcode() {
ob_start();
global $wpdb;
// Alle Gastautoren mit Beitragsanzahl abrufen
$query = "
SELECT pm.meta_value AS guest_author, COUNT(*) AS post_count
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE pm.meta_key = '_guest_author'
AND pm.meta_value != ''
AND p.post_status = 'publish'
GROUP BY pm.meta_value
ORDER BY pm.meta_value ASC
";
$guest_authors = $wpdb->get_results($query);
// URL der Gastautoren-Beitragsseite
$guest_author_page_id = get_option('wp_multi_guest_author_page_id');
$guest_author_page_url = $guest_author_page_id ? get_permalink($guest_author_page_id) : '#';
?>
Debug: Kategorie mit Slug "series" wurde nicht gefunden. Bitte überprüfe den Kategorie-Slug.';
}
$args = array(
'post_type' => ['post', 'page', 'dein_custom_post_type'],
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_guest_author',
'value' => $guest_author,
'compare' => '='
)
),
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'series',
'operator' => 'NOT IN'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Beitragsinhalt abrufen und kürzen
$content = get_the_content();
$content = wp_strip_all_tags($content); // HTML-Tags entfernen
$trimmed_content = wp_trim_words($content, 30, '...');
?>
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) { ?>
>
' . __('Keine benutzerdefinierten Seiten gefunden.', 'wp-stat-notice') . '
';
return;
}
foreach ($custom_pages as $page) {
if ($page['slug'] === $current_slug) {
if (isset($page['url']) && filter_var($page['url'], FILTER_VALIDATE_URL)) {
// Externe URL in neuem Fenster öffnen
echo '';
echo '' . esc_html($page['title']) . ' ';
echo '
' . __('Die externe Seite wird in einem neuen Fenster geöffnet.', 'wp-stat-notice') . '
';
} else {
// Interne Seite anzeigen
echo '' . esc_html($page['title']) . ' ';
echo '
' . __('Dies ist eine benutzerdefinierte Seite im Admin-Bereich.', 'wp-stat-notice') . '
';
}
return;
}
}
echo '' . __('Seite nicht gefunden.', 'wp-stat-notice') . '
';
}
// Funktion zum Hinzufügen und Verwalten benutzerdefinierter Seiten
function wp_stat_notice_add_custom_page_form() {
$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'
];
?>
';
} else {
$custom_pages = get_option('wp_stat_notice_custom_pages', []);
$slugs = array_column($custom_pages, 'slug');
if (in_array($slug, $slugs)) {
echo '' . __('Dieser Slug wird bereits verwendet.', 'wp-stat-notice') . '
';
} else {
$custom_pages[] = ['title' => $title, 'url' => $url, 'slug' => $slug, 'icon' => $icon];
update_option('wp_stat_notice_custom_pages', $custom_pages);
echo '' . __('Benutzerdefinierte Seite wurde hinzugefügt!', 'wp-stat-notice') . '
';
}
}
}
// Verwaltung der Seiten
$custom_pages = get_option('wp_stat_notice_custom_pages', []);
if (!empty($custom_pages)) {
echo '' . __('Verwaltung der benutzerdefinierten Seiten', 'wp-stat-notice') . ' ';
echo '';
echo '' . __('Titel', 'wp-stat-notice') . ' ' . __('URL', 'wp-stat-notice') . ' ' . __('Slug', '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 '' . esc_html($page['slug']) . ' ';
echo '' . __('Bearbeiten', 'wp-stat-notice') . ' | ';
echo '' . __('Löschen', 'wp-stat-notice') . ' ';
echo ' ';
}
echo '
';
}
// Bearbeiten
if (isset($_GET['edit']) && isset($custom_pages[$_GET['edit']])) {
$edit_index = (int)$_GET['edit'];
$edit_page = $custom_pages[$edit_index];
echo '' . __('Seite bearbeiten', 'wp-stat-notice') . ' ';
?>
' . __('Titel und Slug sind erforderlich.', 'wp-stat-notice') . '
';
} else {
$custom_pages[$edit_index] = ['title' => $title, 'url' => $url, 'slug' => $slug, 'icon' => $icon];
update_option('wp_stat_notice_custom_pages', $custom_pages);
echo '' . __('Seite erfolgreich bearbeitet!', 'wp-stat-notice') . '
';
}
}
}
// Löschen
if (isset($_GET['delete']) && isset($custom_pages[$_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");
?>
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');
/*
* Verbessertes Gast-Lesezeichen-Plugin mit erhöhter Sicherheit und Benutzerfreundlichkeit
*/
define('STATISTIK_MANAGER_BOOKMARK_POST_TYPE', 'bookmark');
define('STATISTIK_MANAGER_COOKIE_NAME', 'guest_token');
define('STATISTIK_MANAGER_COOKIE_DURATION', 30 * DAY_IN_SECONDS);
define('STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY', 'statistik_manager_bookmarks_');
/**
* Erstellt den benutzerdefinierten Post-Typ für Lesezeichen.
*/
function statistik_manager_create_bookmark_post_type() {
register_post_type(STATISTIK_MANAGER_BOOKMARK_POST_TYPE, [
'labels' => [
'name' => __('Lesezeichen', 'statistik-manager'),
'singular_name' => __('Lesezeichen', 'statistik-manager'),
],
'public' => false,
'show_ui' => false,
'show_in_menu' => false,
'supports' => ['title', 'custom-fields'],
]);
}
add_action('init', 'statistik_manager_create_bookmark_post_type');
/**
* Generiert oder holt den Gast-Token.
*
* @return string Der Gast-Token.
*/
function statistik_manager_get_guest_token() {
$guest_token = isset($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]) ? sanitize_text_field($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]) : null;
if (!$guest_token) {
$guest_token = wp_generate_uuid4();
setcookie(
STATISTIK_MANAGER_COOKIE_NAME,
$guest_token,
time() + STATISTIK_MANAGER_COOKIE_DURATION,
COOKIEPATH,
COOKIE_DOMAIN,
is_ssl(), // Secure
true // HttpOnly
);
}
return $guest_token;
}
/**
* Speichert ein Lesezeichen für einen Gast.
*
* @param int $post_id Post-ID des Lesezeichens.
*/
function statistik_manager_save_bookmark($post_id) {
$guest_token = statistik_manager_get_guest_token();
update_post_meta($post_id, '_guest_token', $guest_token);
}
/**
* Ruft die Lesezeichen eines Gastes ab.
*
* @return array Liste der Lesezeichen.
*/
function statistik_manager_get_guest_bookmarks() {
$guest_token = statistik_manager_get_guest_token();
$cache_key = STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token);
$bookmarks = get_transient($cache_key);
if ($bookmarks !== false) {
return $bookmarks;
}
$args = [
'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE,
'meta_query' => [
[
'key' => '_guest_token',
'value' => $guest_token,
],
],
'posts_per_page' => -1,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
];
$bookmarks_query = new WP_Query($args);
$bookmarks = $bookmarks_query->posts;
set_transient($cache_key, $bookmarks, HOUR_IN_SECONDS);
return $bookmarks;
}
/**
* Löscht ein Lesezeichen via AJAX.
*/
function statistik_manager_delete_bookmark() {
check_ajax_referer('statistik_manager_bookmark_nonce', 'nonce');
if (!isset($_POST['bookmark_id']) || !isset($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME])) {
wp_send_json_error(['message' => __('Ungültige Anfrage.', 'statistik-manager')]);
}
$bookmark_id = absint($_POST['bookmark_id']);
$guest_token = sanitize_text_field($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]);
$stored_token = get_post_meta($bookmark_id, '_guest_token', true);
if ($stored_token !== $guest_token) {
wp_send_json_error(['message' => __('Du kannst nur deine eigenen Lesezeichen löschen.', 'statistik-manager')]);
}
wp_delete_post($bookmark_id, true);
delete_transient(STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token));
wp_send_json_success(['message' => __('Lesezeichen erfolgreich gelöscht.', 'statistik-manager')]);
}
add_action('wp_ajax_delete_bookmark', 'statistik_manager_delete_bookmark');
add_action('wp_ajax_nopriv_delete_bookmark', 'statistik_manager_delete_bookmark');
/**
* Fügt ein Lesezeichen via AJAX hinzu.
*/
function statistik_manager_add_bookmark_ajax() {
check_ajax_referer('statistik_manager_bookmark_nonce', 'nonce');
if (!isset($_POST['bookmark_url']) || !isset($_POST['bookmark_name'])) {
wp_send_json_error(['message' => __('Bitte alle Felder ausfüllen.', 'statistik-manager')]);
}
$bookmark_url = esc_url_raw($_POST['bookmark_url']);
$bookmark_name = sanitize_text_field($_POST['bookmark_name']);
if (empty($bookmark_url) || empty($bookmark_name)) {
wp_send_json_error(['message' => __('Ungültige URL oder Name.', 'statistik-manager')]);
}
// Prüfen, ob die URL bereits existiert
$guest_token = statistik_manager_get_guest_token();
$args = [
'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE,
'meta_query' => [
'relation' => 'AND',
[
'key' => '_guest_token',
'value' => $guest_token,
],
[
'key' => '_bookmark_url',
'value' => $bookmark_url,
],
],
'posts_per_page' => 1,
];
$existing = new WP_Query($args);
if ($existing->have_posts()) {
wp_send_json_error(['message' => __('Diese URL ist bereits ein Lesezeichen.', 'statistik-manager')]);
}
// Neues Lesezeichen erstellen
$post_id = wp_insert_post([
'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE,
'post_title' => $bookmark_name,
'post_status' => 'publish',
'meta_input' => [
'_bookmark_url' => $bookmark_url,
'_guest_token' => $guest_token,
],
]);
if (is_wp_error($post_id)) {
wp_send_json_error(['message' => __('Fehler beim Hinzufügen des Lesezeichens.', 'statistik-manager')]);
}
delete_transient(STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token));
wp_send_json_success([
'message' => __('Lesezeichen erfolgreich hinzugefügt.', 'statistik-manager'),
'html' => '' . esc_html__('Löschen', 'statistik-manager') . ' ' . esc_html($bookmark_name) . ' ',
]);
}
add_action('wp_ajax_add_bookmark', 'statistik_manager_add_bookmark_ajax');
add_action('wp_ajax_nopriv_add_bookmark', 'statistik_manager_add_bookmark_ajax');
/**
* Zeigt die Lesezeichen eines Gastes an.
*
* @return string HTML-Ausgabe der Lesezeichen.
*/
function statistik_manager_display_bookmarks() {
$bookmarks = statistik_manager_get_guest_bookmarks();
ob_start();
?>
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() {
?>
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!