'Community Forum', 'hero_subtitle' => 'Diskutiere, teile Ideen und bleib immer informiert.', // Topbar 'topbar_brand' => 'Community', // Statistik-Labels 'stat_threads' => 'Threads', 'stat_posts' => 'Beiträge', 'stat_members' => 'Mitglieder', // Abschnitt-Überschriften 'section_cats' => 'Kategorien', 'section_recent' => 'Neue Threads', // Buttons 'btn_new_thread' => 'Neuer Thread', 'btn_login' => 'Einloggen', 'btn_register' => 'Registrieren', 'btn_logout' => 'Logout', // Sidebar 'sidebar_profile' => 'Mein Profil', 'sidebar_login' => 'Login / Registrieren', // Sicherheit 'auto_logout_minutes' => '30', // Wartungsmodus 'maintenance_mode' => '0', 'maintenance_title' => 'Wartungsarbeiten', 'maintenance_message' => 'Das Forum wird gerade gewartet. Bitte versuche es später erneut.', 'registration_enabled' => '1', 'registration_mode' => 'open', 'post_edit_limit' => '30', 'profile_public_default' => '1', 'spam_min_seconds' => '30', // open | invite | disabled 'flood_interval' => '30', // Flood Control: Sekunden zwischen Posts 'invite_message' => 'Registrierung ist aktuell nur auf Einladung möglich.', // Forum-Regeln / Nutzungsbedingungen 'rules_enabled' => '1', 'rules_accept_required' => '1', 'rules_title' => 'Forum-Regeln & Nutzungsbedingungen', 'rules_content' => "**1. Respektvoller Umgang**\nBehandle alle Mitglieder freundlich und respektvoll. Beleidigungen, Mobbing und Diskriminierung sind nicht toleriert.\n\n**2. Keine Spam-Inhalte**\nWerbung, Spam und irrelevante Links sind verboten.\n\n**3. Keine illegalen Inhalte**\nJegliche Inhalte, die gegen geltendes Recht verstoßen, sind streng verboten.\n\n**4. Themenrelevanz**\nBeiträge sollten zur jeweiligen Kategorie passen.\n\n**5. Urheberrecht**\nVeröffentliche keine Inhalte, an denen du keine Rechte besitzt.\n\n**6. Datenschutz**\nTeile keine persönlichen Daten anderer Personen ohne deren Zustimmung.\n\n**7. Moderations-Entscheidungen**\nEntscheidungen der Moderatoren sind zu respektieren. Bei Fragen wende dich direkt ans Team.\n\nVerstöße können zur Verwarnung oder dauerhaften Sperrung führen.", // Ignore/Block-System: Rollen die nicht geblockt werden können (kommagetrennte Schlüssel) 'ignore_blocked_roles' => 'superadmin,admin,moderator', // Discord-Integration 'discord_bot_token' => '', 'discord_guild_id' => '', 'discord_client_id' => '', 'discord_client_secret' => '', 'discord_role_sync' => '0', // Rollen-Sync aktiviert? 'discord_role_map' => '', // JSON: {"discord_role_id":"forum_role_key"} // Minecraft Bridge 'mc_bridge_enabled' => '0', 'mc_bridge_api_url' => '', 'mc_bridge_api_secret' => '', ]; $saved = get_option( 'wbf_settings', [] ); // Fehlende Keys mit Defaults auffüllen, leere Strings ignorieren // Keine Filterung mehr, damit auch bewusst geleerte Felder gespeichert werden return array_merge( $defaults, (array) $saved ); } } // ── Admin-Seite ─────────────────────────────────────────────────────────────── /** * Gibt ein Array der Rollen-Keys zurück die nicht geblockt/ignoriert werden können. * Superadmin ist immer enthalten — unabhängig von der Einstellung. * * @return string[] z.B. ['superadmin', 'admin', 'moderator'] */ if ( ! function_exists('wbf_get_ignore_blocked_roles') ) { function wbf_get_ignore_blocked_roles() { $raw = wbf_get_settings()['ignore_blocked_roles'] ?? 'superadmin,admin,moderator'; $keys = array_filter( array_map( 'trim', explode( ',', $raw ) ) ); // superadmin immer schützen if ( ! in_array('superadmin', $keys, true) ) { $keys[] = 'superadmin'; } return array_values( $keys ); } } /** * Prüft ob ein User ignoriert/geblockt werden darf. * * @param object $target Forum-User-Objekt * @return bool true = darf ignoriert werden, false = nicht erlaubt */ if ( ! function_exists('wbf_can_be_ignored') ) { function wbf_can_be_ignored( $target ) { if ( ! $target ) return false; $blocked_roles = wbf_get_ignore_blocked_roles(); return ! in_array( $target->role, $blocked_roles, true ); } } if ( ! function_exists('wbf_admin_settings') ) { function wbf_admin_settings() { // Speichern if ( isset( $_POST['wbf_save_settings'] ) && check_admin_referer( 'wbf_settings_nonce' ) ) { $fields = [ 'hero_title', 'hero_subtitle', 'topbar_brand', 'stat_threads', 'stat_posts', 'stat_members', 'section_cats', 'section_recent', 'btn_new_thread', 'btn_login', 'btn_register', 'btn_logout', 'sidebar_profile', 'sidebar_login', 'auto_logout_minutes', 'post_edit_limit', 'spam_min_seconds', 'flood_interval', 'profile_public_default', 'registration_enabled', 'registration_mode', 'invite_message', 'maintenance_mode', 'maintenance_title', 'maintenance_message', 'post_edit_limit', 'profile_public_default', 'spam_min_seconds', 'rules_enabled', 'rules_accept_required', 'rules_title', ]; $settings = []; foreach ( $fields as $key ) { if ( in_array( $key, ['maintenance_message', 'rules_content'] ) ) { $settings[$key] = sanitize_textarea_field($_POST[$key] ?? ''); } else { $settings[ $key ] = sanitize_text_field( $_POST[ $key ] ?? '' ); } } // rules_content separat (nicht in $fields, da textarea mit eigener Behandlung) $settings['rules_content'] = sanitize_textarea_field( $_POST['rules_content'] ?? '' ); // Discord-Einstellungen gesondert speichern (sensitiv — niemals in wbf_settings öffentlich) $discord_fields = ['discord_bot_token', 'discord_guild_id', 'discord_client_id', 'discord_client_secret']; foreach ( $discord_fields as $df ) { $settings[$df] = sanitize_text_field( $_POST[$df] ?? '' ); } $settings['discord_role_sync'] = isset($_POST['discord_role_sync']) && $_POST['discord_role_sync'] === '1' ? '1' : '0'; // Discord-Rollen-Map: Array von discord_role_id => forum_role_key $role_map = []; $dc_ids = array_map('sanitize_text_field', (array)($_POST['discord_role_id'] ?? [])); $fr_keys = array_map('sanitize_key', (array)($_POST['discord_forum_role'] ?? [])); $valid_roles = array_keys(WBF_Roles::get_all()); foreach ( $dc_ids as $i => $dc_id ) { $dc_id = trim($dc_id); $fr_key = $fr_keys[$i] ?? ''; if ( $dc_id !== '' && in_array($fr_key, $valid_roles, true) ) { $role_map[$dc_id] = $fr_key; } } $settings['discord_role_map'] = json_encode($role_map); // ── Minecraft Bridge ────────────────────────────────────────────────── $settings['mc_bridge_api_url'] = esc_url_raw( trim( $_POST['mc_bridge_api_url'] ?? '' ) ); $settings['mc_bridge_api_secret'] = sanitize_text_field( $_POST['mc_bridge_api_secret'] ?? '' ); // Checkbox-Felder explizit als '0' speichern wenn nicht angehakt, // damit array_filter(...,'strlen') sie nicht wegwirft und der Default '1' greift. $checkbox_fields = ['maintenance_mode', 'rules_enabled', 'rules_accept_required', 'mc_bridge_enabled']; foreach ( $checkbox_fields as $cb ) { $settings[$cb] = isset($_POST[$cb]) && $_POST[$cb] === '1' ? '1' : '0'; } // ignore_blocked_roles: kommagetrennte Liste der gewählten Rollen-Keys $all_role_keys = array_keys( WBF_Roles::get_all() ); $checked_roles = array_intersect( array_map( 'sanitize_key', (array)( $_POST['ignore_blocked_roles'] ?? [] ) ), $all_role_keys ); // superadmin ist immer blockiert — kann nicht entfernt werden if ( ! in_array('superadmin', $checked_roles, true) ) { $checked_roles[] = 'superadmin'; } $settings['ignore_blocked_roles'] = implode( ',', $checked_roles ); update_option( 'wbf_settings', $settings ); // Superadmin WP-User-ID separat speichern (außerhalb von wbf_settings) $sa_wp_id = (int) ( $_POST['superadmin_wp_id'] ?? 1 ); if ( $sa_wp_id < 1 ) $sa_wp_id = 1; update_option( 'wbf_superadmin_wp_id', $sa_wp_id ); echo '
✅ Einstellungen gespeichert!
{$desc}
" : '' ) . "Alle sichtbaren Texte des Forums — kein Code nötig.