5 Commits
1.1 ... 1.3

Author SHA1 Message Date
848d7df8ab wp-rules.php aktualisiert 2026-02-11 19:33:44 +00:00
63264d46af wp-rules.php aktualisiert 2026-01-06 17:58:44 +00:00
58e3d965a0 style.css aktualisiert 2026-01-06 17:58:30 +00:00
e520c4990e README.md aktualisiert 2025-11-25 15:59:22 +00:00
82e5cb1311 wp-rules.php aktualisiert 2025-11-25 06:41:27 +00:00
3 changed files with 1058 additions and 957 deletions

126
README.md
View File

@@ -1,93 +1,113 @@
# WP Rules Regelbereich mit Tabs für WordPress
=== Multi Rules - Regelbereich mit Tabs für WordPress ===
Contributors: M_Viper
Tags: rules, tabs, shortcode, settings, admin, frontend, styling, import-export, responsive, accessibility
Requires at least: 5.0
Tested up to: 6.8
Stable tag: 1.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Ein modernes, benutzerfreundliches WordPress-Plugin zur Erstellung eines responsiven Regelbereichs mit Tabs ideal für Server-Regeln (z. B. Minecraft, Discord, Communitys), AGBs, Verhaltensrichtlinien oder FAQ-Bereiche.
Einfach per Shortcode `[meine_regeln]` einbinden komplett anpassbar, ohne eine Zeile Code schreiben zu müssen.
== Beschreibung ==
Ein modernes, benutzerfreundliches WordPress-Plugin zur Erstellung eines **responsiven Regelbereichs mit Tabs** ideal für Server-Regeln (z.B. Minecraft, Discord, Communitys), AGBs, Verhaltensrichtlinien oder FAQ-Bereiche.
Einfach per Shortcode `[meine_regeln]` einbinden komplett anpassbar, ohne eine Zeile Code schreiben zu müssen.
## Features
== Features ==
- **Unbegrenzt viele Tabs und Regeln** mit Drag & Drop-Sortierung im Backend
- **Willkommens-Tab** (optional ein-/ausblendbar) mit eigenem Editor & Hintergrundfarbe
- **Komplett anpassbares Styling** (Schriftgrößen, Farben für Tabs & Inhalte)
- **Animationen** beim Öffnen/Schließen der Regeln (optional)
- **Import/Export-Funktion** (JSON) perfekt für Backups oder Multisite-Nutzung
- **Responsive & Barrierefrei** (ARIA-konform, Tastaturbedienung)
- **Kein zusätzliches CSS/JS von außen** alles im Plugin enthalten
- **Shortcode:** `[meine_regeln]`
* **Unbegrenzt viele Tabs und Regeln** mit Drag & Drop-Sortierung im Backend
* **Willkommens-Tab** (optional ein-/ausblendbar) mit eigenem Editor & Hintergrundfarbe
* **Komplett anpassbares Styling** (Schriftgrößen, Farben für Tabs & Inhalte)
* **Animationen** beim Öffnen/Schließen der Regeln (optional)
* **Import/Export-Funktion** (JSON) perfekt für Backups oder Multisite-Nutzung
* **Responsive & Barrierefrei** (ARIA-konform, Tastaturbedienung)
* **Kein zusätzliches CSS/JS von außen** alles im Plugin enthalten
* **Shortcode:** `[meine_regeln]`
## Screenshots
## Screenshots
| Frontend (Willkommen) | Frontend (Tabs + Regeln) |
|---|---|
| <img src="https://git.viper.ipv64.net/M_Viper/wp-rules-plugin/raw/branch/main/assets/001.png" alt="Backend" width="100%"> | <img src="https://git.viper.ipv64.net/M_Viper/wp-rules-plugin/raw/branch/main/assets/002.png" alt="Frontend" width="100%"> |
<p style="text-align:center; color:#666; margin-top:20px;">
← Backend • Frontend →
</p>
## Installation
== Installation ==
1. Lade das Plugin als ZIP herunter (Releases)
2. Gehe in WordPress zu **Plugins → Installieren → Hochladen**
3. Aktiviere das Plugin
4. Gehe zu **Einstellungen → Regeln-Plugin** und lege deine Tabs & Regeln an
4. Gehe zu **Multi Rules** und lege deine Tabs & Regeln an
5. Füge den Shortcode `[meine_regeln]` auf einer Seite ein
## Verwendung
== Verwendung ==
```shortcode
[meine_regeln]
```
Füge den folgenden Shortcode auf einer beliebigen Seite oder in einem Beitrag ein, um deine Regeln anzuzeigen:
`[meine_regeln]`
Das wars! Der Regelbereich erscheint automatisch mit deinem Design.
## Einstellungen
== Einstellungen ==
Unter **Einstellungen → Regeln-Plugin** findest du:
Unter **Multi Rules** findest du:
- Standard-Willkommens-Tab (mit WP-Editor)
- Tab- und Regelverwaltung mit Drag & Drop
- Farb- und Schriftgrößen-Anpassungen (Live-Vorschau im Frontend)
- Animationen aktivieren/deaktivieren
- Import & Export deiner kompletten Konfiguration
* Standard-Willkommens-Tab (mit WP-Editor)
* Tab- und Regelverwaltung mit Drag & Drop
* Farb- und Schriftgrößen-Anpassungen (Live-Vorschau im Frontend)
* Animationen aktivieren/deaktivieren
* Import & Export deiner kompletten Konfiguration
## Entwicklung & Mitwirken
== Screenshots ==
| Frontend Willkommens-Ansicht | Frontend-Regel-Ansicht |
|---|---|
| <img src="https://git.viper.ipv64.net/M_Viper/Multi-Rules/raw/branch/main/assets/001.png" alt="Backend" width="100%"> | <img src="https://git.viper.ipv64.net/M_Viper/Multi-Rules/raw/branch/main/assets/002.png" alt="Frontend" width="100%"> |
== Entwicklung & Mitwirken ==
Das Plugin ist Open Source und wird aktiv weiterentwickelt.
```bash
git clone https://git.viper.ipv64.net/M_Viper/wp-rules-plugin.git
```
`git clone https://git.viper.ipv64.net/M_Viper/Multi-Rules.git`
Pull Requests und Issues sind herzlich willkommen!
## Support
== Häufig gestellte Fragen ==
= Funktioniert das Plugin mit meinem Theme? =
Ja, das Plugin ist so konzipiert, dass es mit den meisten WordPress-Themes problemlos funktioniert. Es verwendet grundlegende HTML-Strukturen und CSS-Klassen, die bei Bedarf angepasst werden können.
= Kann ich die Regeln auf mehreren Seiten mit unterschiedlichen Einstellungen anzeigen? =
Aktuell werden die Regeln global aus den Einstellungen unter "Multi Rules" geladen und auf allen Seiten, die den Shortcode verwenden, identisch angezeigt.
== Support ==
Bei Fragen oder Problemen:
- Telegram: [@M_Viper04](https://t.me/M_Viper04)
* Telegram: [@M_Viper04](https://t.me/M_Viper04)
## Changelog
== Changelog ==
### 1.0 (24.11.2025)
- Erste stabile Version
- Vollständiger Repeater mit Tabs & Regeln
- Drag & Drop Sortierung
- Styling-Optionen
- Import/Export
- Animationen
- Willkommens-Tab mit Hintergrundfarbe
= 1.1 (24.11.2025) =
* Umbenennung des Plugins von "WP Rules" zu "Multi Rules"
* Korrektur von Sicherheits- und Code-Qualitätsfehlern
* Verbesserte Performance und Stabilität
## Lizenz
= 1.0 (24.11.2025) =
* Erste stabile Version
* Vollständiger Repeater mit Tabs & Regeln
* Drag & Drop Sortierung
* Styling-Optionen
* Import/Export
* Animationen
* Willkommens-Tab mit Hintergrundfarbe
== Lizenz ==
Dieses Plugin steht unter der **GNU General Public License v2.0**
→ https://www.gnu.org/licenses/gpl-2.0.html
## Danke!
== Danke! ==
Vielen Dank, dass du **WP Rules** nutzt!
Vielen Dank, dass du **Multi Rules** nutzt!
Dein Feedback macht das Plugin besser.
*Made with ♥ by [M_Viper](https://m-viper.de)*

View File

@@ -1,5 +1,10 @@
/* CSS Variablen für ein modernes, konsistentes Design */
:root {
/* Haupt-Container */
.regel-plugin-container {
/*
* CSS Variablen für ein modernes, konsistentes Design
* WICHTIG: Diese Variablen sind jetzt hier definiert, NICHT in :root,
* damit sie nur dieses Plugin beeinflussen und nicht das globale Theme.
*/
--primary-color: #0073aa;
--primary-hover: #005a87;
--background-light: #f8f9fa;
@@ -12,10 +17,7 @@
--shadow-sm: 0 2px 4px rgba(0,0,0,0.06);
--shadow-md: 0 4px 12px rgba(0,0,0,0.08);
--shadow-lg: 0 8px 25px rgba(0,0,0,0.12);
}
/* Haupt-Container */
.regel-plugin-container {
max-width: 900px;
margin: 40px auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
@@ -27,14 +29,14 @@
}
/* Tab-Navigation */
.regel-tabs-nav {
.regel-plugin-container .regel-tabs-nav {
display: flex;
background: var(--background-light);
border-bottom: 1px solid var(--border-color);
padding: 8px;
}
.regel-tab-button {
.regel-plugin-container .regel-tab-button {
background: transparent;
border: none;
padding: 14px 24px;
@@ -47,24 +49,24 @@
text-align: center;
}
.regel-tab-button:hover {
.regel-plugin-container .regel-tab-button:hover {
background: rgba(0, 115, 170, 0.05);
}
.regel-tab-button.active {
.regel-plugin-container .regel-tab-button.active {
background: var(--background-lighter);
box-shadow: var(--shadow-sm);
border-bottom: 3px solid var(--primary-color);
}
/* Tab-Panels (Inhalte) */
.regel-tabs-content .regel-tab-panel {
.regel-plugin-container .regel-tabs-content .regel-tab-panel {
display: none;
padding: 25px;
animation: fadeInUp 0.5s ease-out;
}
.regel-tabs-content .regel-tab-panel.active {
.regel-plugin-container .regel-tabs-content .regel-tab-panel.active {
display: block;
}
@@ -74,7 +76,7 @@
}
/* Akkordeon-Items (Regeln) */
.regel-item {
.regel-plugin-container .regel-item {
margin-bottom: 16px;
border: 1px solid var(--border-color);
border-radius: var(--border-radius);
@@ -83,17 +85,17 @@
border-left: 4px solid var(--primary-color);
}
.regel-item:hover {
.regel-plugin-container .regel-item:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.regel-item:last-child {
.regel-plugin-container .regel-item:last-child {
margin-bottom: 0;
}
/* KORREKTUR: Icon-Positionierung */
.regel-toggle {
.regel-plugin-container .regel-toggle {
width: 100%;
background: var(--background-lighter);
border: none;
@@ -107,7 +109,7 @@
position: relative; /* Wichtig für die Positionierung des Icons */
}
.regel-toggle:hover {
.regel-plugin-container .regel-toggle:hover {
background: var(--background-light);
}
@@ -130,35 +132,35 @@
transform: translateY(-50%);
}
.regel-item .icon-minus {
.regel-plugin-container .regel-item .icon-minus {
opacity: 0;
transform: translateY(-50%) scale(0.8);
}
.regel-item.open .icon-plus {
.regel-plugin-container .regel-item.open .icon-plus {
opacity: 0;
transform: translateY(-50%) scale(0.8);
}
.regel-item.open .icon-minus {
.regel-plugin-container .regel-item.open .icon-minus {
opacity: 1;
transform: translateY(-50%) scale(1);
}
/* Aufklappbarer Inhalt */
.regel-content {
.regel-plugin-container .regel-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease-out, padding 0.4s ease-out;
background: var(--background-lighter);
}
.regel-item.open .regel-content {
.regel-plugin-container .regel-item.open .regel-content {
max-height: 1000px;
padding: 0 22px 20px 50px; /* Linker Abstand anpassen */
}
.regel-content-inner {
.regel-plugin-container .regel-content-inner {
padding-top: 5px;
line-height: 1.7;
}
@@ -175,24 +177,23 @@
list-style: none;
}
/* Responsive Design */
@media (max-width: 768px) {
.regel-plugin-container {
margin: 20px;
border-radius: 0;
}
.regel-tabs-nav {
.regel-plugin-container .regel-tabs-nav {
flex-wrap: wrap;
padding: 5px;
}
.regel-tab-button {
.regel-plugin-container .regel-tab-button {
flex-basis: 50%;
margin: 2px;
font-size: 14px;
padding: 12px 8px;
}
.regel-tabs-content .regel-tab-panel {
.regel-plugin-container .regel-tabs-content .regel-tab-panel {
padding: 15px;
}
}

View File

@@ -1,47 +1,155 @@
<?php
/**
* Plugin Name: WP Rules
* Plugin Name: Multi Rules
* Description: Erstellt einen anpassbaren Regelbereich mit Tabs, Shortcode [meine_regeln] sowie Styling- und Import/Export-Funktionen.
* Version: 1.0
* Version: 1.3
* Author: M_Viper
* Plugin URI: https://git.viper.ipv64.net/M_Viper/wp-regel-plugin/releases
* Plugin URI: https://git.viper.ipv64.net/M_Viper/Multi-Rules/releases
* Author URI: https://m-viper.de
* Tags: rules, tabs, shortcode, settings, admin, frontend, styling, import-export, responsive, accessibility
* Requires at least: 6.7.2
* Tested up to: 6.7.2
* Requires at least: 6.8
* Tested up to: 6.8
* Requires PHP: 7.4
* License: GPL2
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: wp-rules
* Text Domain: multi-rules
* Support: https://t.me/M_Viper04
*/
// Sicherheit: Verhindert direkten Zugriff auf die Datei
if (!defined('ABSPATH')) {
exit;
}
/**
* Multi Rules - Update-Notice (Gitea Releases)
* Einfügen: direkt nach dem ABSPATH-Check oben
*/
// Plugin-Version aus Header lesen
function mrp_get_plugin_version() {
if ( ! function_exists( 'get_plugin_data' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$plugin_data = get_plugin_data( __FILE__ );
return $plugin_data['Version'] ?? '0.0.0';
}
// Cache manuell leeren (Button "Jetzt neu prüfen")
function mrp_clear_update_cache() {
if ( isset( $_GET['mrp_clear_cache'] ) && current_user_can( 'manage_options' ) ) {
check_admin_referer( 'mrp_clear_cache_action' );
delete_transient( 'mrp_latest_release' );
wp_redirect( admin_url( 'plugins.php' ) );
exit;
}
}
add_action( 'admin_init', 'mrp_clear_update_cache' );
// Neueste Release-Infos von Gitea holen
function mrp_get_latest_release_info( $force_refresh = false ) {
$transient_key = 'mrp_latest_release';
if ( $force_refresh ) {
delete_transient( $transient_key );
}
$release_info = get_transient( $transient_key );
if ( false === $release_info ) {
$response = wp_remote_get(
'https://git.viper.ipv64.net/api/v1/repos/M_Viper/Multi-Rules/releases/latest',
array( 'timeout' => 10 )
);
if ( ! is_wp_error( $response ) && 200 === wp_remote_retrieve_response_code( $response ) ) {
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body, true );
if ( $data && isset( $data['tag_name'] ) ) {
$tag = ltrim( (string) $data['tag_name'], 'vV' );
$release_info = array(
'version' => $tag,
'download_url' => $data['zipball_url'] ?? '',
'notes' => $data['body'] ?? '',
'published_at' => $data['published_at'] ?? '',
);
// Cache für 6 Stunden
set_transient( $transient_key, $release_info, 6 * HOUR_IN_SECONDS );
} else {
// Kurzzeit-Cache bei fehlerhafter Antwort
set_transient( $transient_key, array(), HOUR_IN_SECONDS );
}
} else {
// Fehler beim Abruf -> Kurzzeit-Cache
set_transient( $transient_key, array(), HOUR_IN_SECONDS );
}
}
return $release_info;
}
// Admin-Notice anzeigen wenn Update vorhanden
function mrp_show_update_notice() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$current_version = mrp_get_plugin_version();
$latest_release = mrp_get_latest_release_info();
if ( ! empty( $latest_release['version'] ) && version_compare( $current_version, $latest_release['version'], '<' ) ) {
$refresh_url = wp_nonce_url( admin_url( 'plugins.php?mrp_clear_cache=1' ), 'mrp_clear_cache_action' );
?>
<div class="notice notice-warning is-dismissible">
<h3>Multi Rules Update verfügbar</h3>
<p>
Installiert: <strong><?php echo esc_html( $current_version ); ?></strong><br>
Neueste Version: <strong><?php echo esc_html( $latest_release['version'] ); ?></strong>
</p>
<p>
<a href="<?php echo esc_url( $latest_release['download_url'] ); ?>" class="button button-primary" target="_blank" rel="noreferrer noopener">
Update herunterladen
</a>
<a href="https://git.viper.ipv64.net/M_Viper/Multi-Rules/releases" class="button" target="_blank" rel="noreferrer noopener">
Release Notes
</a>
<a href="<?php echo esc_url( $refresh_url ); ?>" class="button">
Jetzt neu prüfen
</a>
</p>
</div>
<?php
}
}
add_action( 'admin_notices', 'mrp_show_update_notice' );
// 1. Backend-Menüpunkt hinzufügen
function mrp_add_admin_menu() {
add_options_page(
'Regeln-Plugin Einstellungen',
'Regeln-Plugin',
add_menu_page(
'Multi Rules Einstellungen',
'Multi Rules',
'manage_options',
'mein-regel-plugin',
'mrp_options_page_html'
'multi-rules-plugin',
'mrp_options_page_html',
'dashicons-admin-generic',
25
);
}
add_action('admin_menu', 'mrp_add_admin_menu');
// 2. Einstellungen registrieren
function mrp_settings_init() {
register_setting('mrp_plugin_page', 'mrp_settings');
register_setting('mrp_plugin_page', 'mrp_settings', 'mrp_sanitize_settings');
// Sektion für den Willkommens-Tab
add_settings_section('mrp_welcome_section', 'Standard-Tab (Willkommen)', 'mrp_welcome_section_callback', 'mrp_plugin_page');
add_settings_field('mrp_welcome_tab_editor', 'Inhalt des Willkommens-Tabs', 'mrp_welcome_tab_render', 'mrp_plugin_page', 'mrp_welcome_section');
add_settings_field('mrp_welcome_tab_bg_color', 'Hintergrundfarbe des Willkommens-Tabs ', 'mrp_welcome_tab_bg_color_render', 'mrp_plugin_page', 'mrp_welcome_section');
// NEU: Schriftfarbe für den Willkommenstab
add_settings_field('mrp_welcome_tab_font_color', 'Schriftfarbe des Willkommens-Tabs', 'mrp_welcome_tab_font_color_render', 'mrp_plugin_page', 'mrp_welcome_section');
add_settings_field('mrp_show_welcome_tab', 'Anzeige', 'mrp_show_welcome_tab_render', 'mrp_plugin_page', 'mrp_welcome_section');
// Sektion für die Regeln (Inhalt)
@@ -57,10 +165,11 @@ function mrp_settings_init() {
add_settings_field('mrp_rule_content_font_size', 'Regel-Text: Schriftgröße', 'mrp_rule_content_font_size_render', 'mrp_plugin_page', 'mrp_style_section');
add_settings_field('mrp_rule_content_font_color', 'Regel-Text: Schriftfarbe', 'mrp_rule_content_font_color_render', 'mrp_plugin_page', 'mrp_style_section');
// NEU: Sektion für erweiterte Funktionen
// Sektion für erweiterte Funktionen
add_settings_section('mrp_advanced_section', 'Erweiterte Funktionen', 'mrp_advanced_section_callback', 'mrp_plugin_page');
add_settings_field('mrp_enable_animations', 'Animationen', 'mrp_enable_animations_render', 'mrp_plugin_page', 'mrp_advanced_section');
add_settings_field('mrp_enable_drag_drop', 'Sortierung', 'mrp_enable_drag_drop_render', 'mrp_plugin_page', 'mrp_advanced_section');
add_settings_field('mrp_show_last_updated', 'Anzeige "Zuletzt aktualisiert"', 'mrp_show_last_updated_render', 'mrp_plugin_page', 'mrp_advanced_section');
}
add_action('admin_init', 'mrp_settings_init');
@@ -70,19 +179,23 @@ function mrp_rules_section_callback() { echo 'Erstellen und verwalten Sie hier I
function mrp_style_section_callback() { echo 'Passen Sie das Erscheinungsbild der Regeln im Frontend an. Änderungen werden sofort angewendet.'; }
function mrp_advanced_section_callback() { echo 'Aktivieren oder deaktivieren Sie hier erweiterte Funktionen des Plugins.'; }
// NEU: Render-Funktionen für erweiterte Funktionen
// Render-Funktionen für erweiterte Funktionen
function mrp_enable_animations_render() {
$options = get_option('mrp_settings');
$enabled = isset($options['enable_animations']) ? $options['enable_animations'] : '1';
echo '<label><input type="checkbox" name="mrp_settings[enable_animations]" value="1" ' . checked(1, $enabled, false) . ' /> Sanfte Animationen für das Auf- und Zuklappen der Regeln aktivieren.</label>';
$enabled = ($options === false || !is_array($options)) ? '1' : (isset($options['enable_animations']) ? $options['enable_animations'] : '0');
echo '<label><input type="checkbox" name="mrp_settings[enable_animations]" value="1" ' . checked(1, $enabled, false) . ' /> ' . esc_html__('Sanfte Animationen für das Auf- und Zuklappen der Regeln aktivieren.', 'multi-rules') . '</label>';
}
function mrp_enable_drag_drop_render() {
$options = get_option('mrp_settings');
$enabled = isset($options['enable_drag_drop']) ? $options['enable_drag_drop'] : '1';
echo '<label><input type="checkbox" name="mrp_settings[enable_drag_drop]" value="1" ' . checked(1, $enabled, false) . ' /> Drag-and-Drop zum Sortieren von Tabs und Regeln im Backend aktivieren.</label>';
$enabled = ($options === false || !is_array($options)) ? '1' : (isset($options['enable_drag_drop']) ? $options['enable_drag_drop'] : '0');
echo '<label><input type="checkbox" name="mrp_settings[enable_drag_drop]" value="1" ' . checked(1, $enabled, false) . ' /> ' . esc_html__('Drag-and-Drop zum Sortieren von Tabs und Regeln im Backend aktivieren.', 'multi-rules') . '</label>';
}
function mrp_show_last_updated_render() {
$options = get_option('mrp_settings');
$is_checked = ($options === false || !is_array($options)) ? '1' : (isset($options['show_last_updated']) ? $options['show_last_updated'] : '0');
echo '<label><input type="checkbox" name="mrp_settings[show_last_updated]" value="1" ' . checked(1, $is_checked, false) . ' ' . esc_html__('"Zuletzt aktualisiert"-Datum im Frontend anzeigen', 'multi-rules') . '</label>';
}
// Render-Funktion für die Checkbox des Willkommens-Tabs
function mrp_show_welcome_tab_render() {
$options = get_option('mrp_settings');
if ($options === false || !is_array($options)) {
@@ -90,15 +203,24 @@ function mrp_show_welcome_tab_render() {
} else {
$is_checked = isset($options['show_welcome_tab']);
}
echo '<label><input type="checkbox" name="mrp_settings[show_welcome_tab]" value="1" ' . checked($is_checked, true, false) . ' /> Willkommens-Tab im Frontend anzeigen</label>';
echo '<label><input type="checkbox" name="mrp_settings[show_welcome_tab]" value="1" ' . checked($is_checked, true, false) . ' /> ' . esc_html__('Willkommens-Tab im Frontend anzeigen', 'multi-rules') . '</label>';
}
// Render-Funktion für den Willkommens-Tab
function mrp_welcome_tab_render() {
$options = get_option('mrp_settings');
$welcome_content = isset($options['welcome_tab_content']) ? $options['welcome_tab_content'] : '';
echo '<br>'; // Abstand zur Checkbox
$default_welcome_text = "Willkommen in unserer Community! 🎉
Es freut uns riesig, dass du den Weg zu uns gefunden hast. Damit alle hier eine tolle Zeit haben, haben wir einige einfache Regeln aufgestellt. Sie sind kein strenges Gesetz, sondern eher eine gemeinsame Vereinbarung, wie wir miteinander umgehen wollen mit Respekt, Fairness und einer guten Portion Spaß.
Nimm dir einen Moment Zeit, sie durchzulesen. Solltest du Fragen haben, zögere nicht, ein Mitglied unseres Teams oder einen Moderator anzusprechen.
Wir wünschen dir eine fantastische Zeit hier!";
$welcome_content = isset($options['welcome_tab_content']) ? $options['welcome_tab_content'] : $default_welcome_text;
echo '<br>';
$editor_id = 'mrp_welcome_tab_editor';
$settings = array(
@@ -110,12 +232,19 @@ function mrp_welcome_tab_render() {
wp_editor($welcome_content, $editor_id, $settings);
}
// NEU: Render-Funktion für die Hintergrundfarbe des Willkommens-Tabs
function mrp_welcome_tab_bg_color_render() {
$options = get_option('mrp_settings');
$bg_color = isset($options['welcome_tab_bg_color']) ? $options['welcome_tab_bg_color'] : '#f0f0f0';
echo "<input type='color' name='mrp_settings[welcome_tab_bg_color]' value='" . esc_attr($bg_color) . "'>";
echo "<p class='description'>Wählen Sie eine Hintergrundfarbe. Diese wird automatisch mit 50% Transparenz im Frontend angezeigt.</p>";
echo "<p class='description'>" . esc_html__('Wählen Sie eine Hintergrundfarbe. Diese wird automatisch mit 50% Transparenz im Frontend angezeigt.', 'multi-rules') . "</p>";
}
// NEU: Render-Funktion für die Schriftfarbe des Willkommen-Tabs
function mrp_welcome_tab_font_color_render() {
$options = get_option('mrp_settings');
$font_color = isset($options['welcome_tab_font_color']) ? $options['welcome_tab_font_color'] : '#6c757d'; // Standard Grau
echo "<input type='color' name='mrp_settings[welcome_tab_font_color]' value='" . esc_attr($font_color) . "'>";
echo "<p class='description'>" . esc_html__('Wählen Sie die Schriftfarbe für den Willkommen-Text.', 'multi-rules') . "</p>";
}
// 4. Render-Funktionen für die Styling-Felder
@@ -144,7 +273,6 @@ function mrp_rule_content_font_color_render() {
echo "<input type='color' name='mrp_settings[rule_content_font_color]' value='" . esc_attr($font_color) . "'>";
}
// NEU: Hilfsfunktion zur Umwandlung von Hex zu RGBA
if (!function_exists('hex_to_rgba')) {
function hex_to_rgba($hex, $alpha) {
$hex = str_replace("#", "", $hex);
@@ -165,11 +293,8 @@ if (!function_exists('hex_to_rgba')) {
function mrp_options_page_html() {
if (!current_user_can('manage_options')) return;
// Lade Einstellungen für die Live-Vorschau
$options = get_option('mrp_settings');
// Lade jQuery UI Sortable, falls Drag-and-Drop aktiv ist
$enable_drag_drop = isset($options['enable_drag_drop']) ? $options['enable_drag_drop'] : '1';
$enable_drag_drop = isset($options['enable_drag_drop']) ? $options['enable_drag_drop'] : '0';
if ($enable_drag_drop === '1') {
wp_enqueue_script('jquery-ui-sortable');
}
@@ -181,11 +306,10 @@ function mrp_options_page_html() {
<form action="options.php" method="post" id="mrp-settings-form">
<?php settings_fields('mrp_plugin_page'); ?>
<!-- NEU: Container für nebeneinander liegende Boxen -->
<div class="mrp-two-column-container">
<div class="mrp-column">
<div class="postbox">
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php _e('Erweiterte Funktionen'); ?></h2>
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php esc_html_e('Erweiterte Funktionen', 'multi-rules'); ?></h2>
<div class="inside">
<table class="form-table" role="presentation">
<tbody><?php do_settings_fields('mrp_plugin_page', 'mrp_advanced_section'); ?></tbody>
@@ -196,38 +320,38 @@ function mrp_options_page_html() {
<div class="mrp-column">
<div class="postbox">
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php _e('Stil-Einstellungen (Frontend)'); ?></h2>
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php esc_html_e('Stil-Einstellungen (Frontend)', 'multi-rules'); ?></h2>
<div class="inside">
<div class="mrp-style-settings">
<div class="mrp-style-row">
<div class="mrp-style-field">
<label><?php _e('Tab-Titel: Schriftgröße'); ?></label>
<label><?php esc_html_e('Tab-Titel: Schriftgröße', 'multi-rules'); ?></label>
<?php mrp_tab_title_font_size_render(); ?>
</div>
<div class="mrp-style-field">
<label><?php _e('Tab-Titel: Schriftfarbe'); ?></label>
<label><?php esc_html_e('Tab-Titel: Schriftfarbe', 'multi-rules'); ?></label>
<?php mrp_tab_title_font_color_render(); ?>
</div>
</div>
<div class="mrp-style-row">
<div class="mrp-style-field">
<label><?php _e('Regel-Titel: Schriftgröße'); ?></label>
<label><?php esc_html_e('Regel-Titel: Schriftgröße', 'multi-rules'); ?></label>
<?php mrp_rule_title_font_size_render(); ?>
</div>
<div class="mrp-style-field">
<label><?php _e('Regel-Titel: Schriftfarbe'); ?></label>
<label><?php esc_html_e('Regel-Titel: Schriftfarbe', 'multi-rules'); ?></label>
<?php mrp_rule_title_font_color_render(); ?>
</div>
</div>
<div class="mrp-style-row">
<div class="mrp-style-field">
<label><?php _e('Regel-Text: Schriftgröße'); ?></label>
<label><?php esc_html_e('Regel-Text: Schriftgröße', 'multi-rules'); ?></label>
<?php mrp_rule_content_font_size_render(); ?>
</div>
<div class="mrp-style-field">
<label><?php _e('Regel-Text: Schriftfarbe'); ?></label>
<label><?php esc_html_e('Regel-Text: Schriftfarbe', 'multi-rules'); ?></label>
<?php mrp_rule_content_font_color_render(); ?>
</div>
</div>
@@ -238,21 +362,21 @@ function mrp_options_page_html() {
</div>
<div class="postbox">
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php _e('Standard-Tab (Willkommen)'); ?></h2>
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php esc_html_e('Standard-Tab (Willkommen)', 'multi-rules'); ?></h2>
<div class="inside">
<?php do_settings_fields('mrp_plugin_page', 'mrp_welcome_section'); ?>
</div>
</div>
<div class="postbox">
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php _e('Regeln und Tabs verwalten'); ?></h2>
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php esc_html_e('Regeln und Tabs verwalten', 'multi-rules'); ?></h2>
<div class="inside">
<div id="mrp-repeater-wrapper">
<div id="tabs-container">
<?php $tabs = isset($options['tabs']) ? $options['tabs'] : array(); ?>
<?php if (!empty($tabs)) : ?>
<?php foreach ($tabs as $tab_index => $tab) : ?>
<div class="backend-tab-card" data-index="<?php echo $tab_index; ?>">
<div class="backend-tab-card" data-index="<?php echo esc_attr($tab_index); ?>">
<div class="backend-tab-header">
<h3><span class="dashicons dashicons-menu drag-handle"></span> <span class="dashicons dashicons-category"></span> <?php echo esc_html($tab['title'] ?: 'Unbenannter Tab'); ?></h3>
<div class="header-actions">
@@ -261,20 +385,20 @@ function mrp_options_page_html() {
</div>
</div>
<div class="backend-tab-content">
<p><label>Tab-Titel (z.B. Minecraft)</label><input type="text" name="mrp_settings[tabs][<?php echo $tab_index; ?>][title]" value="<?php echo esc_attr($tab['title']); ?>" class="regular-text"></p>
<p><label>Tab-Titel (z.B. Minecraft)</label><input type="text" name="mrp_settings[tabs][<?php echo esc_attr($tab_index); ?>][title]" value="<?php echo esc_attr($tab['title']); ?>" class="regular-text"></p>
<h4>Regeln für diesen Tab</h4>
<div class="rules-container">
<?php if (!empty($tab['rules'])) : ?>
<?php foreach ($tab['rules'] as $rule_index => $rule) : ?>
<div class="backend-rule-card" data-rule-index="<?php echo $rule_index; ?>">
<div class="backend-rule-card" data-rule-index="<?php echo esc_attr($rule_index); ?>">
<div class="backend-rule-header">
<span class="dashicons dashicons-menu drag-handle"></span>
<strong><?php echo esc_html($rule['rule_title'] ?: 'Unbenannte Regel'); ?></strong>
<button type="button" class="button button-link-delete remove-rule">Regel entfernen</button>
</div>
<div class="backend-rule-content">
<p><label>Regel-Titel</label><input type="text" name="mrp_settings[tabs][<?php echo $tab_index; ?>][rules][<?php echo $rule_index; ?>][rule_title]" value="<?php echo esc_attr($rule['rule_title']); ?>" class="regular-text"></p>
<p><label>Regel-Text</label><textarea name="mrp_settings[tabs][<?php echo $tab_index; ?>][rules][<?php echo $rule_index; ?>][rule_content]" rows="4" class="large-text"><?php echo esc_textarea($rule['rule_content']); ?></textarea></p>
<p><label>Regel-Titel</label><input type="text" name="mrp_settings[tabs][<?php echo esc_attr($tab_index); ?>][rules][<?php echo esc_attr($rule_index); ?>][rule_title]" value="<?php echo esc_attr($rule['rule_title']); ?>" class="regular-text"></p>
<p><label>Regel-Text</label><textarea name="mrp_settings[tabs][<?php echo esc_attr($tab_index); ?>][rules][<?php echo esc_attr($rule_index); ?>][rule_content]" rows="4" class="large-text"><?php echo esc_textarea($rule['rule_content']); ?></textarea></p>
</div>
</div>
<?php endforeach; ?>
@@ -292,16 +416,16 @@ function mrp_options_page_html() {
</div>
<div class="postbox">
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php _e('Import/Export'); ?></h2>
<h2 class="hndle" style="padding: 8px 12px; font-size: 14px;"><?php esc_html_e('Import/Export', 'multi-rules'); ?></h2>
<div class="inside">
<p>Hier können Sie Ihre Einstellungen und Regeln exportieren, um sie zu sichern oder auf einer anderen Seite zu importieren.</p>
<p><?php esc_html_e('Hier können Sie Ihre Einstellungen und Regeln exportieren, um sie zu sichern oder auf einer anderen Seite zu importieren.', 'multi-rules'); ?></p>
<p>
<button type="button" id="mrp-export-button" class="button button-secondary">Einstellungen exportieren</button>
<button type="button" id="mrp-export-button" class="button button-secondary"><?php esc_html_e('Einstellungen exportieren', 'multi-rules'); ?></button>
</p>
<p>
<label for="mrp-import-file">Einstellungen importieren:</label>
<label for="mrp-import-file"><?php esc_html_e('Einstellungen importieren:', 'multi-rules'); ?></label>
<input type="file" id="mrp-import-file" name="mrp-import-file" accept=".json">
<button type="button" id="mrp-import-button" class="button button-secondary">Importieren</button>
<button type="button" id="mrp-import-button" class="button button-secondary"><?php esc_html_e('Importieren', 'multi-rules'); ?></button>
</p>
</div>
</div>
@@ -310,66 +434,30 @@ function mrp_options_page_html() {
</form>
</div>
<!-- NEU: Inline-CSS für Backend -->
<style>
/* CSS für den Backend-Repeater */
#mrp-repeater-wrapper{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.backend-tab-card{background:#fff;border:1px solid #c3c4c7;border-radius:8px;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,.04)}.backend-tab-header{display:flex;justify-content:space-between;align-items:center;padding:12px 15px;background:#f8f9f9;border-bottom:1px solid #c3c4c7;border-radius:8px 8px 0 0;cursor:pointer}.backend-tab-header h3{margin:0;font-size:1.2em;display:flex;align-items:center}.backend-tab-header h3 .dashicons{margin-right:10px;color:#50575e}.backend-tab-content{padding:20px;display:none}.backend-tab-card.collapsed .backend-tab-content{display:none}.backend-tab-card:not(.collapsed) .backend-tab-content{display:block}.backend-rule-card{background:#fcfcfc;border:1px dashed #dcdcde;border-radius:5px;margin-bottom:15px}.backend-rule-header{display:flex;justify-content:space-between;align-items:center;padding:10px 15px;background:#f6f7f7;border-bottom:1px dashed #dcdcde;cursor:pointer}.backend-rule-content{padding:15px;display:none}.backend-rule-card.collapsed .backend-rule-content{display:none}.backend-rule-card:not(.collapsed) .backend-rule-content{display:block}.header-actions{display:flex;gap:10px}#mrp-repeater-wrapper p label{display:block;font-weight:600;margin-bottom:5px;color:#1e1e1e}#mrp-repeater-wrapper .button-primary{background-color:#0065cc;border-color:#0065cc}#mrp-repeater-wrapper .button-primary:hover{background-color:#0053a6;border-color:#0053a6}#mrp-repeater-wrapper .button-hero{font-size:14px;height:46px;line-height:44px;padding:0 36px}
/* NEU: CSS für Drag-and-Drop */
/* CSS für Drag-and-Drop */
.drag-handle { cursor: move; color: #8c8f94; margin-right: 10px; }
.ui-sortable-helper { background-color: #f9f9f9; opacity: 0.8; }
.rules-container.ui-sortable { min-height: 50px; border: 1px dashed transparent; }
.rules-container.ui-sortable-placeholder { border: 1px dashed #ccc; background: #f0f0f0; border-radius: 5px; margin: 0 0 15px 0; }
/* NEU: CSS für nebeneinander liegende Boxen */
.mrp-two-column-container {
display: flex;
gap: 20px;
margin-top: 20px;
}
/* CSS für nebeneinander liegende Boxen */
.mrp-two-column-container { display: flex; gap: 20px; margin-top: 20px; }
.mrp-column { flex: 1; }
.mrp-column {
flex: 1;
}
/* CSS für kompakte Stil-Einstellungen */
.mrp-style-settings { display: flex; flex-direction: column; gap: 15px; }
.mrp-style-row { display: flex; gap: 20px; }
.mrp-style-field { flex: 1; }
.mrp-style-field label { display: block; font-weight: 600; margin-bottom: 5px; }
/* NEU: CSS für kompakte Stil-Einstellungen */
.mrp-style-settings {
display: flex;
flex-direction: column;
gap: 15px;
}
.mrp-style-row {
display: flex;
gap: 20px;
}
.mrp-style-field {
flex: 1;
}
.mrp-style-field label {
display: block;
font-weight: 600;
margin-bottom: 5px;
}
/* Responsives Design für kleinere Bildschirme */
@media screen and (max-width: 1024px) {
.mrp-two-column-container {
flex-direction: column;
}
}
@media screen and (max-width: 768px) {
.mrp-style-row {
flex-direction: column;
gap: 10px;
}
}
@media screen and (max-width: 1024px) { .mrp-two-column-container { flex-direction: column; } }
@media screen and (max-width: 768px) { .mrp-style-row { flex-direction: column; gap: 10px; } }
</style>
<!-- NEU: Inline-JavaScript für alle neuen Funktionen -->
<script>
jQuery(document).ready(function($) {
var tabCount = $('.backend-tab-card').length;
@@ -377,15 +465,12 @@ function mrp_options_page_html() {
var $form = $('#mrp-settings-form');
var enableDragDrop = $('input[name="mrp_settings[enable_drag_drop]"]').is(':checked');
// === FUNKTIONEN FÜR TABS UND REGELN ===
$tabsContainer.find('.backend-tab-card').addClass('collapsed');
$('#add-tab').click(function() {
var template = $('#tab-template').html().replace(/INDEX/g, tabCount);
$tabsContainer.append(template);
if (enableDragDrop) {
initializeSortable();
}
if (enableDragDrop) initializeSortable();
tabCount++;
});
@@ -396,9 +481,7 @@ function mrp_options_page_html() {
var ruleCount = $tabCard.find('.backend-rule-card').length;
var template = $('#rule-template').html().replace(/TAB_INDEX/g, tabIndex).replace(/RULE_INDEX/g, ruleCount);
$tabCard.find('.rules-container').append(template);
if (enableDragDrop) {
initializeSortable();
}
if (enableDragDrop) initializeSortable();
});
$(document).on('click', '.backend-tab-header, .toggle-collapse', function(e) {
@@ -423,36 +506,18 @@ function mrp_options_page_html() {
$(this).closest('.backend-rule-card').remove();
});
// === FUNKTIONEN FÜR DRAG-AND-DROP ===
function initializeSortable() {
if (!enableDragDrop) return;
$tabsContainer.sortable({
handle: '.backend-tab-header .drag-handle',
placeholder: 'ui-sortable-placeholder',
stop: function(event, ui) {
reindexTabs();
}
});
$('.rules-container').sortable({
handle: '.backend-rule-header .drag-handle',
placeholder: 'ui-sortable-placeholder',
stop: function(event, ui) {
reindexRules($(this));
}
});
}
if (enableDragDrop) {
initializeSortable();
$tabsContainer.sortable({ handle: '.backend-tab-header .drag-handle', placeholder: 'ui-sortable-placeholder', stop: function(event, ui) { reindexTabs(); } });
$('.rules-container').sortable({ handle: '.backend-rule-header .drag-handle', placeholder: 'ui-sortable-placeholder', stop: function(event, ui) { reindexRules($(this)); } });
}
if (enableDragDrop) initializeSortable();
function reindexTabs() {
$tabsContainer.find('.backend-tab-card').each(function(i) {
var $card = $(this);
var newIndex = i;
$card.attr('data-index', newIndex);
$card.find('input, textarea').each(function() {
var name = $(this).attr('name');
var newName = name.replace(/tabs\[\d+\]/, 'tabs[' + newIndex + ']');
@@ -467,7 +532,6 @@ function mrp_options_page_html() {
var newIndex = i;
var $tabCard = $rulesContainer.closest('.backend-tab-card');
var tabIndex = $tabCard.data('index');
$card.find('input, textarea').each(function() {
var name = $(this).attr('name');
var newName = name.replace(/rules\[\d+\]/, 'rules[' + newIndex + ']');
@@ -476,13 +540,9 @@ function mrp_options_page_html() {
});
}
// === FUNKTIONEN FÜR IMPORT/EXPORT ===
$('#mrp-export-button').on('click', function() {
var nonce = $('#mrp-settings-form input[name="_wpnonce"]').val();
$.post(ajaxurl, {
action: 'mrp_export_settings',
_wpnonce: nonce
}, function(response) {
$.post(ajaxurl, { action: 'mrp_export_settings', _wpnonce: nonce }, function(response) {
if (response.success) {
var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(response.data, null, 2));
var downloadAnchorNode = document.createElement('a');
@@ -491,60 +551,41 @@ function mrp_options_page_html() {
document.body.appendChild(downloadAnchorNode);
downloadAnchorNode.click();
downloadAnchorNode.remove();
} else {
alert('Export fehlgeschlagen: ' + response.data);
}
} else { alert('Export fehlgeschlagen: ' + response.data); }
});
});
$('#mrp-import-button').on('click', function() {
var fileInput = document.getElementById('mrp-import-file');
if (!fileInput.files.length) {
alert('Bitte wählen Sie eine Datei zum Importieren aus.');
return;
}
if (!fileInput.files.length) { alert('Bitte wählen Sie eine Datei zum Importieren aus.'); return; }
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(e) {
try {
var importedData = JSON.parse(e.target.result);
var nonce = $('#mrp-settings-form input[name="_wpnonce"]').val();
$.post(ajaxurl, {
action: 'mrp_import_settings',
_wpnonce: nonce,
data: JSON.stringify(importedData)
}, function(response) {
if (response.success) {
alert('Einstellungen erfolgreich importiert! Die Seite wird neu geladen.');
location.reload();
} else {
alert('Import fehlgeschlagen: ' + response.data);
}
$.post(ajaxurl, { action: 'mrp_import_settings', _wpnonce: nonce, data: JSON.stringify(importedData) }, function(response) {
if (response.success) { alert('Einstellungen erfolgreich importiert! Die Seite wird neu geladen.'); location.reload(); } else { alert('Import fehlgeschlagen: ' + response.data); }
});
} catch (error) {
alert('Fehler beim Lesen der JSON-Datei. Stellen Sie sicher, dass es sich um eine gültige Export-Datei handelt.');
}
} catch (error) { alert('Fehler beim Lesen der JSON-Datei.'); }
};
reader.readAsText(file);
});
});
</script>
<!-- Templates für neue Tabs/Regeln -->
<template id="tab-template"><div class="backend-tab-card" data-index="INDEX"><div class="backend-tab-header"><h3><span class="dashicons dashicons-menu drag-handle"></span> <span class="dashicons dashicons-category"></span> Neuer Tab</h3><div class="header-actions"><button type="button" class="button toggle-collapse">Umschalten</button><button type="button" class="button button-link-delete remove-tab">Löschen</button></div></div><div class="backend-tab-content"><p><label>Tab-Titel (z.B. Minecraft)</label><input type="text" name="mrp_settings[tabs][INDEX][title]" value="" class="regular-text"></p><h4>Regeln für diesen Tab</h4><div class="rules-container"></div><button type="button" class="button add-rule">+ Neue Regel hinzufügen</button></div></div></template>
<template id="rule-template"><div class="backend-rule-card" data-rule-index="RULE_INDEX"><div class="backend-rule-header"><span class="dashicons dashicons-menu drag-handle"></span><strong>Neue Regel</strong><button type="button" class="button button-link-delete remove-rule">Regel entfernen</button></div><div class="backend-rule-content"><p><label>Regel-Titel</label><input type="text" name="mrp_settings[tabs][TAB_INDEX][rules][RULE_INDEX][rule_title]" value="" class="regular-text"></p><p><label>Regel-Text</label><textarea name="mrp_settings[tabs][TAB_INDEX][rules][RULE_INDEX][rule_content]" rows="4" class="large-text"></textarea></p></div></div></template>
<?php
}
function mrp_repeater_field_render() {}
// NEU: AJAX-Handler für Import/Export
add_action('wp_ajax_mrp_export_settings', 'mrp_ajax_export_settings');
add_action('wp_ajax_mrp_import_settings', 'mrp_ajax_import_settings');
function mrp_ajax_export_settings() {
check_ajax_referer('mrp_plugin_page-options', '_wpnonce');
if (!current_user_can('manage_options')) wp_die();
$settings = get_option('mrp_settings');
wp_send_json_success($settings);
}
@@ -552,102 +593,102 @@ function mrp_ajax_export_settings() {
function mrp_ajax_import_settings() {
check_ajax_referer('mrp_plugin_page-options', '_wpnonce');
if (!current_user_can('manage_options')) wp_die();
$imported_data = json_decode(stripslashes($_POST['data']), true);
if (is_array($imported_data)) {
update_option('mrp_settings', $imported_data);
wp_send_json_success();
} else {
wp_send_json_error('Ungültiges JSON-Format.');
}
if ( ! isset( $_POST['data'] ) ) wp_send_json_error( 'Keine Daten empfangen.' );
$raw_data = wp_unslash( $_POST['data'] );
$imported_data = json_decode( $raw_data, true );
if ( is_array( $imported_data ) ) { update_option('mrp_settings', $imported_data); wp_send_json_success(); } else { wp_send_json_error('Ungültiges JSON-Format.'); }
}
add_filter('pre_update_option_mrp_settings', 'mrp_add_last_updated_timestamp', 10, 2);
function mrp_add_last_updated_timestamp($new_value, $old_value) {
if ( is_array( $new_value ) ) { $new_value['last_updated'] = current_time('timestamp'); }
return $new_value;
}
// 6. Shortcode für die Frontend-Anzeige
function mrp_display_rules_shortcode($atts) {
$options = get_option('mrp_settings');
$tabs = isset($options['tabs']) ? $options['tabs'] : array();
// Korrekte Logik für den Checkbox-Status
if ($options === false || !is_array($options)) {
$show_welcome_tab = true;
} else {
$show_welcome_tab = isset($options['show_welcome_tab']);
}
if ($options === false || !is_array($options)) { $show_welcome_tab = true; } else { $show_welcome_tab = isset($options['show_welcome_tab']); }
$enable_animations = isset($options['enable_animations']) ? $options['enable_animations'] : '1';
$show_last_updated = isset($options['show_last_updated']) ? $options['show_last_updated'] : '0';
$enable_animations = isset($options['enable_animations']) ? $options['enable_animations'] : '0';
if (empty($tabs) && !$show_welcome_tab) {
return '<p style="text-align:center; padding: 40px; color: #666;">Keine Regeln wurden im Backend konfiguriert.</p>';
}
if (empty($tabs) && !$show_welcome_tab) { return '<p style="text-align:center; padding: 40px; color: #666;">' . esc_html__('Keine Regeln wurden im Backend konfiguriert.', 'multi-rules') . '</p>'; }
// Frontend-Script und Style registrieren
wp_enqueue_style('mrp-frontend-style', plugin_dir_url(__FILE__) . 'style.css', array(), '8.0');
wp_enqueue_script('mrp-frontend-script', plugin_dir_url(__FILE__) . 'script.js', array('jquery'), '8.0', true);
// Daten an das Frontend-Script übergeben
wp_localize_script('mrp-frontend-script', 'mrp_frontend_vars', [
'enable_animations' => $enable_animations,
]);
wp_localize_script('mrp-frontend-script', 'mrp_frontend_vars', [ 'enable_animations' => $enable_animations ]);
// Beginne die Ausgabepufferung
ob_start();
$last_updated_html = '';
if ($show_last_updated && isset($options['last_updated']) && is_numeric($options['last_updated'])) {
$last_updated_timestamp = $options['last_updated'];
$date_format = sanitize_text_field( get_option('date_format') );
$formatted_date = date_i18n( $date_format, $last_updated_timestamp );
/* translators: %s: Formatted date. */
$last_updated_html = '<p class="mrp-last-updated">' . sprintf(esc_html__('Zuletzt aktualisiert am: %s', 'multi-rules'), esc_html($formatted_date)) . '</p>';
}
?>
<style id="mrp-custom-inline-styles">
/* Dynamische Stile für die Tab-Titel */
.regel-plugin-container .regel-tab-button {
<?php if (!empty($options['tab_title_font_size'])): ?>font-size: <?php echo intval($options['tab_title_font_size']); ?>px !important;<?php endif; ?>
<?php if (!empty($options['tab_title_font_color'])): ?>color: <?php echo esc_attr($options['tab_title_font_color']); ?> !important;<?php endif; ?>
}
/* Dynamische Stile für die Regel-Titel - NEU: Greift direkt auf den Text im Span zu */
.regel-plugin-container .regel-title-text {
<?php if (!empty($options['rule_title_font_size'])): ?>font-size: <?php echo intval($options['rule_title_font_size']); ?>px !important;<?php endif; ?>
<?php if (!empty($options['rule_title_font_color'])): ?>color: <?php echo esc_attr($options['rule_title_font_color']); ?> !important;<?php endif; ?>
}
/* Dynamische Stile für den Regel-Text */
.regel-plugin-container .regel-item .regel-content .regel-content-inner, .regel-plugin-container .regel-item .regel-content .regel-content-inner p {
<?php if (!empty($options['rule_content_font_size'])): ?>font-size: <?php echo intval($options['rule_content_font_size']); ?>px !important;<?php endif; ?>
<?php if (!empty($options['rule_content_font_color'])): ?>color: <?php echo esc_attr($options['rule_content_font_color']); ?> !important;<?php endif; ?>
}
.regel-plugin-container .regel-item:nth-child(even) { background-color: #f5f5f5 !important; border-radius: 5px; }
<?php if ($show_welcome_tab): ?>
#tab-welcome { background-color: <?php echo esc_attr(hex_to_rgba($options['welcome_tab_bg_color'] ?? '#f0f0f0', 0.4)); ?> !important; padding: 15px; border-radius: 5px; }
#tab-welcome {
background-color: <?php echo esc_attr(hex_to_rgba($options['welcome_tab_bg_color'] ?? '#f0f0f0', 0.4)); ?> !important;
padding: 15px;
border-radius: 5px;
/* NEU: Nutzt die spezifische Farbe für den Willkommenstab */
color: <?php echo esc_attr($options['welcome_tab_font_color'] ?? '#6c757d'); ?> !important;
}
/* Zusätzliche Sicherheit: Überschreibt auch die Farbe von Absätzen im Willkommen-Tab */
#tab-welcome p, #tab-welcome li, #tab-welcome h1, #tab-welcome h2, #tab-welcome h3, #tab-welcome ul, #tab-welcome ol {
color: inherit !important;
}
<?php endif; ?>
.mrp-last-updated {
text-align: left;
padding-left: 550px;
font-size: 0.9em;
color: #aaaaaacc;
margin-top: 20px;
font-style: italic;
text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.9), -1px -1px 2px rgba(0, 0, 0, 0.6);
}
</style>
<div class="regel-plugin-container">
<div class="regel-tabs-nav">
<?php
// HTML für die Tab-Buttons sauber in PHP zusammenbauen
$nav_buttons_html = '';
$is_first_tab = true;
// Willkommens-Tab hinzufügen
if ($show_welcome_tab) {
$nav_buttons_html .= '<button class="regel-tab-button active" data-tab="tab-welcome">Willkommen</button>';
$is_first_tab = false;
}
// Benutzerdefinierte Tabs hinzufügen
if (!empty($tabs)) {
foreach ($tabs as $index => $tab) {
$active_class = $is_first_tab ? 'active' : '';
$nav_buttons_html .= '<button class="regel-tab-button ' . $active_class . '" data-tab="tab-' . $index . '">' . esc_html($tab['title']) . '</button>';
$is_first_tab = false;
}
}
// Alle Buttons auf einmal ausgeben
echo $nav_buttons_html;
if ($show_welcome_tab) { $nav_buttons_html .= '<button class="regel-tab-button active" data-tab="tab-welcome">' . esc_html__('Willkommen', 'multi-rules') . '</button>'; $is_first_tab = false; }
if (!empty($tabs)) { foreach ($tabs as $index => $tab) { $active_class = $is_first_tab ? 'active' : ''; $nav_buttons_html .= '<button class="regel-tab-button ' . esc_attr($active_class) . '" data-tab="tab-' . esc_attr($index) . '">' . esc_html($tab['title']) . '</button>'; $is_first_tab = false; } }
echo wp_kses_post($nav_buttons_html);
?>
</div>
<div class="regel-tabs-content">
<?php $first_panel = true;
if ($show_welcome_tab) { $welcome_content = $options['welcome_tab_content'] ?? ''; ?>
<div id="tab-welcome" class="regel-tab-panel active"><div class="regel-content-inner"><?php echo wpautop(wp_kses_post($welcome_content)); ?></div></div>
<div id="tab-welcome" class="regel-tab-panel active"><div class="regel-content-inner"><?php echo wp_kses_post(wpautop($welcome_content)); ?></div></div>
<?php $first_panel = false;
}
foreach ($tabs as $index => $tab): ?>
<div id="tab-<?php echo $index; ?>" class="regel-tab-panel <?php echo $first_panel ? 'active' : ''; ?>">
<div id="tab-<?php echo esc_attr($index); ?>" class="regel-tab-panel <?php echo $first_panel ? 'active' : ''; ?>">
<?php if (!empty($tab['rules'])): foreach ($tab['rules'] as $rule): ?>
<div class="regel-item">
<button class="regel-toggle">
@@ -656,15 +697,16 @@ function mrp_display_rules_shortcode($atts) {
<span class="regel-title-text"><?php echo esc_html($rule['rule_title']); ?></span>
</button>
<div class="regel-content">
<div class="regel-content-inner"><?php echo wpautop(wp_kses_post($rule['rule_content'])); ?></div>
<div class="regel-content-inner"><?php echo wp_kses_post(wpautop($rule['rule_content'])); ?></div>
</div>
</div>
<?php endforeach; else: ?>
<p style="text-align:center; padding: 20px; color: #888;">Für diesen Tab wurden noch keine Regeln erstellt.</p>
<p style="text-align:center; padding: 20px; color: #888;"><?php esc_html_e('Für diesen Tab wurden noch keine Regeln erstellt.', 'multi-rules'); ?></p>
<?php endif; ?>
</div>
<?php $first_panel = false; endforeach; ?>
</div>
<?php echo wp_kses_post($last_updated_html); ?>
</div>
<?php
return ob_get_clean();
@@ -677,7 +719,6 @@ add_action('wp_enqueue_scripts', function() {
";
wp_add_inline_style('mrp-frontend-style', $frontend_css);
// JS
$frontend_js = "
jQuery(document).ready(function($) {
var enableAnimations = mrp_frontend_vars.enable_animations === '1';
@@ -691,14 +732,53 @@ add_action('wp_enqueue_scripts', function() {
$('.regel-plugin-container').on('click', '.regel-toggle', function() {
var $content = $(this).next('.regel-content');
var $toggle = $(this);
if (enableAnimations) {
$content.slideToggle(300);
} else {
$content.toggle();
}
if (enableAnimations) { $content.slideToggle(300); } else { $content.toggle(); }
$toggle.toggleClass('active');
});
});
";
wp_add_inline_script('mrp-frontend-script', $frontend_js);
});
function mrp_sanitize_settings( $input ) {
$sanitized_options = array();
if ( ! is_array( $input ) ) return $sanitized_options;
$sanitized_options['show_welcome_tab'] = isset( $input['show_welcome_tab'] ) ? 1 : 0;
$sanitized_options['enable_animations'] = isset( $input['enable_animations'] ) ? 1 : 0;
$sanitized_options['enable_drag_drop'] = isset( $input['enable_drag_drop'] ) ? 1 : 0;
$sanitized_options['show_last_updated'] = isset( $input['show_last_updated'] ) ? 1 : 0;
if ( isset( $input['welcome_tab_content'] ) ) $sanitized_options['welcome_tab_content'] = wp_kses_post( $input['welcome_tab_content'] );
if ( isset( $input['welcome_tab_bg_color'] ) ) $sanitized_options['welcome_tab_bg_color'] = sanitize_hex_color( $input['welcome_tab_bg_color'] );
// NEU: Sanitize für Willkommens-Schriftfarbe
if ( isset( $input['welcome_tab_font_color'] ) ) $sanitized_options['welcome_tab_font_color'] = sanitize_hex_color( $input['welcome_tab_font_color'] );
$sanitized_options['tab_title_font_size'] = isset( $input['tab_title_font_size'] ) ? absint( $input['tab_title_font_size'] ) : 15;
$sanitized_options['tab_title_font_color'] = isset( $input['tab_title_font_color'] ) ? sanitize_hex_color( $input['tab_title_font_color'] ) : '#2c3e50';
$sanitized_options['rule_title_font_size'] = isset( $input['rule_title_font_size'] ) ? absint( $input['rule_title_font_size'] ) : 16;
$sanitized_options['rule_title_font_color'] = isset( $input['rule_title_font_color'] ) ? sanitize_hex_color( $input['rule_title_font_color'] ) : '#2c3e50';
$sanitized_options['rule_content_font_size'] = isset( $input['rule_content_font_size'] ) ? absint( $input['rule_content_font_size'] ) : 15;
$sanitized_options['rule_content_font_color'] = isset( $input['rule_content_font_color'] ) ? sanitize_hex_color( $input['rule_content_font_color'] ) : '#6c757d';
if ( isset( $input['tabs'] ) && is_array( $input['tabs'] ) ) {
$sanitized_options['tabs'] = array();
foreach ( $input['tabs'] as $tab ) {
if ( isset( $tab['title'] ) ) {
$sanitized_tab = array();
$sanitized_tab['title'] = sanitize_text_field( $tab['title'] );
if ( isset( $tab['rules'] ) && is_array( $tab['rules'] ) ) {
$sanitized_tab['rules'] = array();
foreach ( $tab['rules'] as $rule ) {
$sanitized_rule = array();
if ( isset( $rule['rule_title'] ) ) $sanitized_rule['rule_title'] = sanitize_text_field( $rule['rule_title'] );
if ( isset( $rule['rule_content'] ) ) $sanitized_rule['rule_content'] = wp_kses_post( $rule['rule_content'] );
$sanitized_tab['rules'][] = $sanitized_rule;
}
}
$sanitized_options['tabs'][] = $sanitized_tab;
}
}
}
return $sanitized_options;
}