523 lines
28 KiB
PHP
523 lines
28 KiB
PHP
<?php
|
|
/**
|
|
* forum-settings.php
|
|
* Admin-Einstellungsseite für WP Business Forum.
|
|
* Wird von wp-business-forum.php per require_once eingebunden.
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) exit;
|
|
|
|
// ── Hilfsfunktion ─────────────────────────────────────────────────────────────
|
|
// Gibt alle Forum-Einstellungen zurück (mit Fallback auf Standardwerte).
|
|
// Verwendung überall im Plugin: wbf_get_settings()['hero_title']
|
|
|
|
if ( ! function_exists('wbf_get_settings') ) {
|
|
function wbf_get_settings() {
|
|
$defaults = [
|
|
// Hero-Bereich
|
|
'hero_title' => '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',
|
|
];
|
|
|
|
$saved = get_option( 'wbf_settings', [] );
|
|
|
|
// Fehlende Keys mit Defaults auffüllen, leere Strings ignorieren
|
|
return array_merge( $defaults, array_filter( (array) $saved, 'strlen' ) );
|
|
}
|
|
}
|
|
|
|
// ── 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'] ?? '' );
|
|
|
|
// 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 );
|
|
echo '<div class="notice notice-success is-dismissible"><p>✅ Einstellungen gespeichert!</p></div>';
|
|
}
|
|
|
|
$s = wbf_get_settings();
|
|
|
|
// Inline-Hilfsfunktion für eine Tabellenzeile
|
|
$row = function( $label, $name, $placeholder, $desc = '' ) use ( $s ) {
|
|
$val = esc_attr( $s[ $name ] ?? '' );
|
|
echo "
|
|
<tr>
|
|
<th scope='row'><label for='wbf_{$name}'>{$label}</label></th>
|
|
<td>
|
|
<input type='text'
|
|
id='wbf_{$name}'
|
|
name='{$name}'
|
|
value='{$val}'
|
|
placeholder='" . esc_attr( $placeholder ) . "'
|
|
class='regular-text'>
|
|
" . ( $desc ? "<p class='description'>{$desc}</p>" : '' ) . "
|
|
</td>
|
|
</tr>";
|
|
};
|
|
|
|
?>
|
|
<div class="wrap">
|
|
<h1>⚙️ Forum-Einstellungen</h1>
|
|
<p style="color:#666;margin-bottom:1.5rem">
|
|
Alle sichtbaren Texte des Forums — kein Code nötig.
|
|
</p>
|
|
|
|
<form method="post">
|
|
<?php wp_nonce_field( 'wbf_settings_nonce' ); ?>
|
|
|
|
<!-- ── Hero-Bereich ───────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
🏠 Hero-Bereich (Startseite)
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<?php $row(
|
|
'Titel', 'hero_title', 'Community Forum',
|
|
'Der große Titel im Banner oben auf der Startseite.'
|
|
); ?>
|
|
<?php $row(
|
|
'Untertitel', 'hero_subtitle',
|
|
'Diskutiere, teile Ideen und bleib immer informiert.',
|
|
'Der kleine Text direkt unter dem Titel.'
|
|
); ?>
|
|
</table>
|
|
|
|
<!-- ── Topbar ─────────────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
🔝 Topbar (Navigationsleiste)
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<?php $row(
|
|
'Forum-Name / Brand', 'topbar_brand', 'Community',
|
|
'Angezeigt als Markenname links in der Navigationsleiste.'
|
|
); ?>
|
|
<?php $row( 'Button „Einloggen"', 'btn_login', 'Einloggen' ); ?>
|
|
<?php $row( 'Button „Registrieren"', 'btn_register', 'Registrieren' ); ?>
|
|
<?php $row( 'Button „Logout"', 'btn_logout', 'Logout' ); ?>
|
|
</table>
|
|
|
|
<!-- ── Statistik-Labels ───────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
📊 Statistik-Labels
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<?php $row( 'Label „Threads"', 'stat_threads', 'Threads' ); ?>
|
|
<?php $row( 'Label „Beiträge"', 'stat_posts', 'Beiträge' ); ?>
|
|
<?php $row( 'Label „Mitglieder"', 'stat_members', 'Mitglieder' ); ?>
|
|
</table>
|
|
|
|
<!-- ── Abschnitt-Überschriften ───────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
📂 Abschnitt-Überschriften
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<?php $row( 'Kategorien-Überschrift', 'section_cats', 'Kategorien' ); ?>
|
|
<?php $row( 'Neue Threads (Sidebar)', 'section_recent', 'Neue Threads' ); ?>
|
|
<?php $row( 'Button „Neuer Thread"', 'btn_new_thread', 'Neuer Thread' ); ?>
|
|
</table>
|
|
|
|
<!-- ── Sidebar ────────────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
👤 Sidebar
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<?php $row(
|
|
'Sidebar-Titel (eingeloggt)', 'sidebar_profile', 'Mein Profil'
|
|
); ?>
|
|
<?php $row(
|
|
'Sidebar-Titel (ausgeloggt)', 'sidebar_login', 'Login / Registrieren'
|
|
); ?>
|
|
</table>
|
|
|
|
<!-- ── Sicherheit ─────────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
🔒 Sicherheit
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="wbf_auto_logout_minutes">Auto-Logout nach Inaktivität</label>
|
|
</th>
|
|
<td>
|
|
<select id="wbf_auto_logout_minutes" name="auto_logout_minutes">
|
|
<?php
|
|
$current_val = $s['auto_logout_minutes'] ?? '30';
|
|
$options = [
|
|
'0' => 'Deaktiviert',
|
|
'5' => '5 Minuten',
|
|
'10' => '10 Minuten',
|
|
'15' => '15 Minuten',
|
|
'30' => '30 Minuten',
|
|
'60' => '1 Stunde',
|
|
'120' => '2 Stunden',
|
|
'480' => '8 Stunden',
|
|
];
|
|
foreach ( $options as $val => $label ):
|
|
?>
|
|
<option value="<?php echo esc_attr($val); ?>"<?php selected($current_val, (string)$val); ?>>
|
|
<?php echo esc_html($label); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<p class="description">
|
|
Nach dieser Zeit ohne Aktivität wird der Nutzer automatisch ausgeloggt und erhält eine Warnung
|
|
(30 Sek. vor dem Logout). Gilt nur für Forum-Benutzer, nicht für WordPress-Admins.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- ── Post-Bearbeitung & Spam-Schutz ──────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
✏️ Beiträge & Spam-Schutz
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row"><label>Post-Bearbeitung begrenzen</label></th>
|
|
<td>
|
|
<select name="post_edit_limit">
|
|
<?php
|
|
$el = $s['post_edit_limit'] ?? '30';
|
|
$opts = ['0'=>'Unbegrenzt','5'=>'5 Min.','10'=>'10 Min.','15'=>'15 Min.','30'=>'30 Min.','60'=>'1 Std.','120'=>'2 Std.','1440'=>'24 Std.'];
|
|
foreach ($opts as $v=>$l): ?>
|
|
<option value="<?php echo $v; ?>"<?php selected($el,$v); ?>><?php echo esc_html($l); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<p class="description">Wie lange können Nutzer ihre eigenen Posts bearbeiten? Moderatoren sind ausgenommen.</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label>Spam-Schutz (Honeypot + Zeitlimit)</label></th>
|
|
<td>
|
|
<select name="spam_min_seconds">
|
|
<?php
|
|
$ss = $s['spam_min_seconds'] ?? '30';
|
|
$sopts = ['0'=>'Deaktiviert','10'=>'10 Sekunden','30'=>'30 Sekunden','60'=>'1 Minute','300'=>'5 Minuten'];
|
|
foreach ($sopts as $v=>$l): ?>
|
|
<option value="<?php echo $v; ?>"<?php selected($ss,(string)$v); ?>><?php echo esc_html($l); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<p class="description">Mindestzeit zwischen Seitenaufruf und Absenden des Registrierungsformulars. Plus verstecktes Honeypot-Feld.</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label>Flood Control (Post-Cooldown)</label></th>
|
|
<td>
|
|
<select name="flood_interval">
|
|
<?php
|
|
$fi = $s['flood_interval'] ?? '30';
|
|
$fopts = ['0'=>'Deaktiviert','10'=>'10 Sekunden','30'=>'30 Sekunden','60'=>'1 Minute','120'=>'2 Minuten','300'=>'5 Minuten'];
|
|
foreach ($fopts as $v=>$l): ?>
|
|
<option value="<?php echo $v; ?>"<?php selected($fi,(string)$v); ?>><?php echo esc_html($l); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<p class="description">Wartezeit zwischen zwei Beiträgen (Thread oder Antwort). Moderatoren sind ausgenommen.</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- ── Wartungsmodus ────────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
🔧 Wartungsmodus
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row"><label>Wartungsmodus</label></th>
|
|
<td>
|
|
<label style="display:flex;align-items:center;gap:8px;cursor:pointer">
|
|
<input type="checkbox" name="maintenance_mode" value="1"
|
|
<?php checked($s['maintenance_mode'] ?? '0', '1'); ?>
|
|
style="width:18px;height:18px;accent-color:#ef4444">
|
|
<span style="font-weight:600;color:#dc2626">Wartungsmodus aktivieren</span>
|
|
</label>
|
|
<p class="description">
|
|
Wenn aktiv sehen alle Besucher die Wartungsseite — außer Moderatoren und Admins.
|
|
</p>
|
|
<?php if (($s['maintenance_mode'] ?? '0') === '1'): ?>
|
|
<div style="margin-top:6px;padding:6px 10px;background:#fef2f2;border:1px solid #fca5a5;border-radius:5px;font-size:.82rem;color:#dc2626">
|
|
⚠️ <strong>Wartungsmodus ist gerade aktiv!</strong> Das Forum ist für normale Besucher nicht erreichbar.
|
|
</div>
|
|
<?php endif; ?>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label>Wartungs-Titel</label></th>
|
|
<td>
|
|
<input type="text" name="maintenance_title"
|
|
value="<?php echo esc_attr($s['maintenance_title'] ?? 'Wartungsarbeiten'); ?>"
|
|
class="regular-text" placeholder="Wartungsarbeiten">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label>Wartungs-Nachricht</label></th>
|
|
<td>
|
|
<textarea name="maintenance_message" rows="3" class="large-text"
|
|
placeholder="Das Forum wird gerade gewartet..."><?php echo esc_textarea($s['maintenance_message'] ?? ''); ?></textarea>
|
|
<p class="description">Wird den Besuchern auf der Wartungsseite angezeigt.</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- ── Registrierung ────────────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
📝 Registrierung
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row"><label>Registrierungsmodus</label></th>
|
|
<td>
|
|
<select name="registration_mode">
|
|
<?php
|
|
$reg_mode = $s['registration_mode'] ?? 'open';
|
|
$modes = ['open'=>'Offen (jeder kann sich registrieren)','invite'=>'Nur Einladung (zeigt Hinweistext)','disabled'=>'Gesperrt (kein Login, kein Register)'];
|
|
foreach ($modes as $val=>$lbl): ?>
|
|
<option value="<?php echo esc_attr($val); ?>"<?php selected($reg_mode,$val); ?>><?php echo esc_html($lbl); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
<p class="description">Steuert ob neue Nutzer sich selbst registrieren können.</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label>Hinweis-Text</label></th>
|
|
<td>
|
|
<input type="text" name="invite_message"
|
|
value="<?php echo esc_attr($s['invite_message'] ?? ''); ?>"
|
|
class="large-text"
|
|
placeholder="Registrierung ist aktuell nur auf Einladung möglich.">
|
|
<p class="description">Wird angezeigt wenn Modus = "Nur Einladung". Kein HTML.</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- ── Forum-Regeln / Nutzungsbedingungen ───────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
📜 Forum-Regeln / Nutzungsbedingungen
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row">Regeln aktivieren</th>
|
|
<td>
|
|
<label>
|
|
<input type="checkbox" name="rules_enabled" value="1"
|
|
<?php checked( $s['rules_enabled'] ?? '1', '1' ); ?>>
|
|
Regelseite im Forum anzeigen (<code>?forum_rules</code>)
|
|
</label>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">Akzeptierung Pflicht</th>
|
|
<td>
|
|
<label>
|
|
<input type="checkbox" name="rules_accept_required" value="1"
|
|
<?php checked( $s['rules_accept_required'] ?? '1', '1' ); ?>>
|
|
Nutzer müssen Regeln bei Registrierung akzeptieren
|
|
</label>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label for="wbf_rules_title">Seiten-Titel</label></th>
|
|
<td>
|
|
<input type="text" id="wbf_rules_title" name="rules_title"
|
|
value="<?php echo esc_attr( $s['rules_title'] ?? 'Forum-Regeln & Nutzungsbedingungen' ); ?>"
|
|
class="large-text" placeholder="Forum-Regeln & Nutzungsbedingungen">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row"><label for="wbf_rules_content">Regeltext</label></th>
|
|
<td>
|
|
<textarea id="wbf_rules_content" name="rules_content"
|
|
rows="16" class="large-text"
|
|
placeholder="Schreibe deine Forum-Regeln hier…"
|
|
style="font-family:monospace;font-size:.85rem"><?php echo esc_textarea( $s['rules_content'] ?? '' ); ?></textarea>
|
|
<p class="description">
|
|
Unterstützt einfaches Markdown-ähnliches Formatting:
|
|
<code>**fett**</code>, Leerzeile = neuer Absatz, Zeilen die mit <code>**1.</code> beginnen werden als Abschnitt-Überschriften dargestellt.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<!-- ── Ignore / Block-System ────────────────────────── -->
|
|
<h2 style="border-bottom:1px solid #ddd;padding-bottom:.4rem;margin-top:1.5rem">
|
|
🚫 Ignore / Block-System
|
|
</h2>
|
|
<table class="form-table" role="presentation">
|
|
<tr>
|
|
<th scope="row"><label>Nicht blockierbare Rollen</label></th>
|
|
<td>
|
|
<?php
|
|
$blocked_roles = array_filter( array_map('trim', explode(',', $s['ignore_blocked_roles'] ?? 'superadmin,admin,moderator')) );
|
|
$all_roles = WBF_Roles::get_sorted();
|
|
foreach ( $all_roles as $key => $role ):
|
|
$is_superadmin = ($key === 'superadmin');
|
|
$is_checked = in_array($key, $blocked_roles, true);
|
|
$rc = esc_attr($role['color']);
|
|
$rb = esc_attr($role['bg_color']);
|
|
?>
|
|
<label style="display:flex;align-items:center;gap:8px;margin-bottom:7px;cursor:<?php echo $is_superadmin?'not-allowed':'pointer'; ?>">
|
|
<input type="checkbox"
|
|
name="ignore_blocked_roles[]"
|
|
value="<?php echo esc_attr($key); ?>"
|
|
<?php checked($is_checked, true); ?>
|
|
<?php echo $is_superadmin ? 'disabled' : ''; ?>
|
|
style="width:16px;height:16px;accent-color:<?php echo $rc; ?>">
|
|
<?php if ($is_superadmin): ?>
|
|
<!-- superadmin immer als hidden mitschicken da disabled nicht übermittelt wird -->
|
|
<input type="hidden" name="ignore_blocked_roles[]" value="superadmin">
|
|
<?php endif; ?>
|
|
<span style="display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:20px;font-size:.78rem;font-weight:700;color:<?php echo $rc; ?>;background:<?php echo $rb; ?>;border:1px solid <?php echo $rc; ?>">
|
|
<i class="<?php echo esc_attr($role['icon'] ?? 'fas fa-user'); ?>"></i>
|
|
<?php echo esc_html($role['label']); ?>
|
|
</span>
|
|
<?php if ($is_superadmin): ?>
|
|
<span style="font-size:.72rem;color:#999">(immer geschützt)</span>
|
|
<?php endif; ?>
|
|
</label>
|
|
<?php endforeach; ?>
|
|
<p class="description" style="margin-top:8px">
|
|
Nutzer mit diesen Rollen können von anderen Mitgliedern <strong>nicht</strong> geblockt oder ignoriert werden.
|
|
Superadmin ist permanent geschützt und kann nicht abgewählt werden.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<?php submit_button(
|
|
'💾 Einstellungen speichern',
|
|
'primary',
|
|
'wbf_save_settings',
|
|
true,
|
|
[ 'style' => 'margin-top:1rem' ]
|
|
); ?>
|
|
</form>
|
|
|
|
<!-- ── Vorschau-Tabelle ──────────────────────────────── -->
|
|
<hr style="margin-top:2.5rem">
|
|
<h3>📋 Aktuelle Werte</h3>
|
|
<table class="widefat striped" style="max-width:700px">
|
|
<thead>
|
|
<tr><th>Schlüssel</th><th>Aktueller Wert</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ( $s as $key => $val ): ?>
|
|
<tr>
|
|
<td><code><?php echo esc_html( $key ); ?></code></td>
|
|
<td><?php echo esc_html( $val ); ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<?php
|
|
}
|
|
} // end function_exists wbf_admin_settings
|