Update from Git Manager GUI

This commit is contained in:
2026-03-21 18:47:43 +01:00
parent ea9b5e4758
commit 28e574d04c
2 changed files with 2276 additions and 364 deletions

File diff suppressed because one or more lines are too long

View File

@@ -36,6 +36,22 @@ if ( ! function_exists('wbf_get_settings') ) {
'sidebar_login' => 'Login / Registrieren', 'sidebar_login' => 'Login / Registrieren',
// Sicherheit // Sicherheit
'auto_logout_minutes' => '30', '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.",
]; ];
$saved = get_option( 'wbf_settings', [] ); $saved = get_option( 'wbf_settings', [] );
@@ -60,13 +76,25 @@ function wbf_admin_settings() {
'section_cats', 'section_recent', 'section_cats', 'section_recent',
'btn_new_thread', 'btn_login', 'btn_register', 'btn_logout', 'btn_new_thread', 'btn_login', 'btn_register', 'btn_logout',
'sidebar_profile', 'sidebar_login', 'sidebar_profile', 'sidebar_login',
'auto_logout_minutes', '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 = []; $settings = [];
foreach ( $fields as $key ) { 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 ] ?? '' ); $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'] ?? '' );
update_option( 'wbf_settings', $settings ); update_option( 'wbf_settings', $settings );
echo '<div class="notice notice-success is-dismissible"><p>✅ Einstellungen gespeichert!</p></div>'; echo '<div class="notice notice-success is-dismissible"><p>✅ Einstellungen gespeichert!</p></div>';
@@ -203,6 +231,176 @@ function wbf_admin_settings() {
</tr> </tr>
</table> </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>
<?php submit_button( <?php submit_button(
'💾 Einstellungen speichern', '💾 Einstellungen speichern',
'primary', 'primary',