diff --git a/Minecraft-Modern-Theme/functions.php b/Minecraft-Modern-Theme/functions.php
index 055a448..e71972e 100644
--- a/Minecraft-Modern-Theme/functions.php
+++ b/Minecraft-Modern-Theme/functions.php
@@ -1,494 +1,1329 @@
- 9999, // Sehr hohe Werte, um den Crop-Dialog zu umgehen
- 'width' => 9999, // Sehr hohe Werte, um den Crop-Dialog zu umgehen
- 'flex-height' => true,
- 'flex-width' => true,
- 'header_text' => array( 'site-title', 'site-description' ),
- ) );
-
- // Benutzerdefinierten Hintergrund aktivieren
- add_theme_support( 'custom-background' );
-
- register_nav_menus( array(
- 'primary' => __( 'Hauptmenü', 'minecraft-modern-theme' ),
- 'footer' => __( 'Footer-Menü', 'minecraft-modern-theme' ),
- ) );
- add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' ) );
-}
-add_action( 'after_setup_theme', 'minecraft_modern_setup' );
-
-// === Styles & Scripts laden ===
-function minecraft_modern_scripts() {
- // Haupt-Stylesheet
- wp_enqueue_style( 'minecraft-modern-style', get_stylesheet_uri() );
-
- // Swiper.js CSS (von CDN)
- wp_enqueue_style( 'swiper-css', 'https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css' );
-
- // JavaScript für den Header-Scroll-Effekt
- wp_enqueue_script(
- 'minecraft-modern-header-script',
- get_template_directory_uri() . '/js/header-scroll.js',
- array(),
- '1.0',
- true
- );
-
- // NEU: Navigation Script für Dropdown Menü laden
- wp_enqueue_script(
- 'minecraft-navigation',
- get_template_directory_uri() . '/js/navigation.js',
- array(), // Keine Abhängigkeiten
- '1.0',
- true
- );
-
- // NEU: Ankündigungs-Skript laden
- wp_enqueue_script(
- 'announcement-script',
- get_template_directory_uri() . '/js/announcement.js',
- array(), // Keine Abhängigkeiten
- '1.0',
- true
- );
-
- // Swiper.js JS (von CDN)
- wp_enqueue_script(
- 'swiper-js',
- 'https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js',
- array(),
- '8.0.0',
- true
- );
-
- // Unsere eigene Slider-Initialisierungs-Datei
- wp_enqueue_script(
- 'minecraft-modern-slider-script',
- get_template_directory_uri() . '/js/slider-init.js',
- array('swiper-js'), // Hängt von Swiper.js ab
- '1.0',
- true
- );
-
- // NEU: Theme-Toggle-Skript laden
- wp_enqueue_script(
- 'theme-toggle-script',
- get_template_directory_uri() . '/js/theme-toggle.js',
- array(), // Keine Abhängigkeiten
- '1.0',
- true
- );
-
- // FAQ Skript laden, wenn der Post-Type aktiv ist
- if ( post_type_exists('faq') ) {
- wp_enqueue_script(
- 'faq-accordion-script',
- get_template_directory_uri() . '/js/faq-accordion.js',
- array(),
- '1.0',
- true
- );
- }
-
- // Übergebe ALLE Theme-Einstellungen an das JavaScript
- wp_localize_script(
- 'minecraft-modern-slider-script',
- 'sliderSettings',
- array(
- 'hideArrows' => get_theme_mod( 'slider_hide_arrows', false ) ? '1' : '0',
- 'hidePagination' => get_theme_mod( 'slider_hide_pagination', false ) ? '1' : '0',
- 'effect' => get_theme_mod( 'slider_effect', 'fade' ),
- 'direction' => get_theme_mod( 'slider_direction', 'horizontal' ),
- 'defaultMode' => get_theme_mod( 'default_theme_mode', 'dark' ),
- 'ajax_url' => admin_url('admin-ajax.php')
- )
- );
-
- // Dies verhindert das Flackern im Customizer.
- wp_localize_script(
- 'minecraft-modern-header-script', // <-- Richtiges Skript-Handle!
- 'headerSettings', // <-- Neuer Objektname für Klarheit
- array(
- 'isCustomizer' => is_customize_preview()
- )
- );
-}
-add_action( 'wp_enqueue_scripts', 'minecraft_modern_scripts' );
-
-// === Customizer-Datei laden ===
-require get_template_directory() . '/inc/customizer.php';
-
-// === Theme-Updater-Datei laden ===
-require get_template_directory() . '/inc/theme-updater.php';
-
-// === Footer-Widgets registrieren ===
-function minecraft_modern_footer_widgets() {
- register_sidebar( array(
- 'name' => __( 'Footer Links', 'minecraft-modern-theme' ),
- 'id' => 'footer-left',
- 'description' => __( 'Widget-Bereich links im Footer.', 'minecraft-modern-theme' ),
- 'before_widget' => '
',
- 'after_widget' => '
',
- 'before_title' => '',
- ) );
- for ( $i = 1; $i <= 3; $i++ ) {
- register_sidebar( array(
- 'name' => sprintf( __( 'Footer Spalte %d', 'minecraft-modern-theme' ), $i ),
- 'id' => 'footer-' . $i,
- 'description' => sprintf( __( 'Widget für die %d. Spalte im Footer.', 'minecraft-modern-theme' ), $i ),
- 'before_widget' => '',
- 'after_widget' => '
',
- 'before_title' => '',
- ) );
- }
- register_sidebar( array(
- 'name' => __( 'Footer Rechts', 'minecraft-modern-theme' ),
- 'id' => 'footer-right',
- 'description' => __( 'Widget-Bereich rechts im Footer.', 'minecraft-modern-theme' ),
- 'before_widget' => '',
- 'after_widget' => '
',
- 'before_title' => '',
- ) );
-}
-add_action( 'widgets_init', 'minecraft_modern_footer_widgets' );
-
-// === FAQ Custom Post Type & Taxonomy ===
-function create_faq_post_type() {
- // Nur registrieren, wenn im Customizer aktiviert
- if ( get_theme_mod( 'faq_enabled', true ) ) {
- register_post_type('faq',
- array(
- 'labels' => array(
- 'name' => __( 'FAQs', 'minecraft-modern-theme' ),
- 'singular_name' => __( 'FAQ', 'minecraft-modern-theme' ),
- 'add_new' => __( 'Neue FAQ hinzufügen', 'minecraft-modern-theme' ),
- 'add_new_item' => __( 'Neue FAQ hinzufügen', 'minecraft-modern-theme' ),
- 'edit_item' => __( 'FAQ bearbeiten', 'minecraft-modern-theme' ),
- 'new_item' => __( 'Neue FAQ', 'minecraft-modern-theme' ),
- 'view_item' => __( 'FAQ ansehen', 'minecraft-modern-theme' ),
- 'search_items' => __( 'FAQs durchsuchen', 'minecraft-modern-theme' ),
- 'not_found' => __( 'Keine FAQs gefunden', 'minecraft-modern-theme' ),
- 'not_found_in_trash' => __( 'Keine FAQs im Papierkorb gefunden', 'minecraft-modern-theme' ),
- 'all_items' => __( 'Alle FAQs', 'minecraft-modern-theme' ),
- ),
- 'public' => true,
- 'has_archive' => true, // Archiv-Seite /faq/ bleibt als Fallback
- 'menu_icon' => 'dashicons-format-chat',
- 'supports' => array( 'title', 'editor', 'page-attributes' ),
- 'rewrite' => array( 'slug' => 'faq' ),
- 'show_in_rest' => true,
- )
- );
- register_taxonomy(
- 'faq_category',
- 'faq',
- array(
- 'label' => __( 'FAQ Kategorien', 'minecraft-modern-theme' ),
- 'rewrite' => array( 'slug' => 'faq-kategorie' ),
- 'hierarchical' => true,
- 'show_in_rest' => true,
- )
- );
- }
-}
-add_action('init', 'create_faq_post_type');
-
-// =============================================================================
-// ===== Automatische "Home" Seitenerstellung und Zuweisung (kombiniert) =======
-// =============================================================================
-
-/**
- * Erstellt die "Home" Seite und weist sie automatisch als statische Startseite zu,
- * wenn das Theme aktiviert wird und noch keine Seite festgelegt ist.
- */
-function set_static_front_page_automatically() {
- // Nur ausführen, wenn noch keine statische Seite als Startseite festgelegt ist
- if ( 'page' !== get_option( 'show_on_front' ) ) {
-
- // Finde die "Home" Seite (oder erstelle sie, falls sie nicht existiert)
- $home_page = get_page_by_title( 'Home' );
- if ( ! $home_page ) {
- // Seite erstellen, falls sie nicht existiert
- $home_page_id = wp_insert_post( array(
- 'post_title' => 'Home',
- 'post_content' => 'Diese Seite dient als statische Startseite.',
- 'post_status' => 'publish',
- 'post_type' => 'page',
- 'post_author' => 1,
- ) );
- } else {
- $home_page_id = $home_page->ID;
- }
-
- // Setze die Seite als statische Startseite
- if ( $home_page_id ) {
- update_option( 'show_on_front', 'page' );
- update_option( 'page_on_front', $home_page_id );
- }
- }
-}
-add_action( 'after_switch_theme', 'set_static_front_page_automatically' );
-
-
-/**
- * Fügt eine Body-Klasse hinzu, um den Home-Titel per CSS auszublenden.
- */
-function add_home_body_class( $classes ) {
- // Prüfen, ob wir auf der Startseite sind und die Einstellung zum Ausblenden aktiv ist
- if ( is_front_page() && !get_theme_mod( 'show_home_title', true ) ) {
- $classes[] = 'home-title-hidden';
- }
- return $classes;
-}
-add_filter( 'body_class', 'add_home_body_class' );
-
-
-// =============================================================================
-// Automatische FAQ-Seitenerstellung und Template-Zuweisung
-// =============================================================================
-
-/**
- * Erstellt automatisch eine "FAQ" Seite, wenn die FAQ-Funktion aktiviert wird.
- */
-function create_faq_page_automatically() {
- // Prüfen, ob die FAQ-Funktion aktiv ist
- if ( get_theme_mod( 'faq_enabled', true ) ) {
- // Prüfen, ob die Seite bereits existiert
- if ( get_page_by_title( 'FAQ' ) == null ) {
- // Seite erstellen
- $new_page = array(
- 'post_title' => 'FAQ',
- 'post_content' => 'Diese Seite zeigt alle FAQs an. Der Inhalt wird automatisch generiert.',
- 'post_status' => 'publish',
- 'post_type' => 'page',
- 'post_author' => 1,
- );
- // Seite in die Datenbank einfügen
- wp_insert_post( $new_page );
- }
- }
-}
-// Diese Funktion wird ausgeführt, wenn der Customizer gespeichert wird.
-add_action( 'customize_save_after', 'create_faq_page_automatically' );
-
-
-/**
- * Leitet Anfragen für die "FAQ" Seite auf unser spezielles Template um.
- */
-function load_faq_page_template( $template ) {
- // Prüfen, ob die FAQ-Funktion aktiv ist
- if ( get_theme_mod( 'faq_enabled', true ) ) {
- // Prüfen, ob wir uns auf einer Seite befinden
- if ( is_page() ) {
- global $post;
- // Prüfen, ob der Titel der Seite "FAQ" ist
- if ( $post && $post->post_title == 'FAQ' ) {
- // Pfad zu unserem Template zurückgeben
- return get_template_directory() . '/archive-faq.php';
- }
- }
- }
- // Standard-Template in allen anderen Fällen
- return $template;
-}
-add_filter( 'template_include', 'load_faq_page_template' );
-
-
-// =========================================================================
-// === CUSTOM LOGIN FUNCTIONS =============================================
-// =========================================================================
-
-// Lädt alle notwendigen Styles und Scripts nur für die Login-Seite
-function minecraft_modern_login_assets() {
- // Lade die Login-spezifische CSS
- wp_enqueue_style('minecraft-modern-login-style', get_template_directory_uri() . '/css/login-style.css');
-
- // Lade Font Awesome für Icons
- wp_enqueue_style('font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css');
-
- // Lade das JavaScript für den Avatar-Slider
- wp_enqueue_script('minecraft-avatar-slider-script', get_template_directory_uri() . '/js/login-slider.js', array('jquery'), '1.0', true);
-
- // Lade das JavaScript, das die HTML-Struktur anpasst
- wp_enqueue_script('minecraft-modern-login-script', get_template_directory_uri() . '/js/login-script.js', array('jquery'), '1.0', true);
-
- wp_add_inline_script('minecraft-modern-login-script', "
- jQuery(document).ready(function($) {
- $('.forgetmenot, #nav').wrapAll('
');
- });
- ");
-
- // Übergebe die Slider-Geschwindigkeit aus dem Customizer an das JavaScript
- $slider_speed = get_theme_mod('login_avatar_slider_speed', 4); // Standard: 4 Sekunden
- wp_localize_script('minecraft-avatar-slider-script', 'avatarSliderSettings', array(
- 'speed' => $slider_speed * 1000 // Umwandlung in Millisekunden für JS
- ));
-
- // Hintergrundbild und Logo als Inline-CSS hinzufügen
- $login_bg_image = get_theme_mod('login_background_image');
- if ($login_bg_image) {
- $custom_css = "body.login { background-image: url('{$login_bg_image}') !important; }";
- wp_add_inline_style('minecraft-modern-login-style', $custom_css);
- }
- $logo_url = get_theme_mod('login_logo');
- if ($logo_url) {
- $logo_css = ".login h1 a { background-image: url('{$logo_url}') !important; }";
- wp_add_inline_style('minecraft-modern-login-style', $logo_css);
- }
-}
-add_action('login_enqueue_scripts', 'minecraft_modern_login_assets');
-
-// Erstellt die HTML-Struktur für den Avatar-Slider
-function add_minecraft_avatar_slider_to_login() {
- $avatar_html = '';
- $has_avatars = false;
-
- // Durchlaufe alle 5 möglichen Avatar-Plätze
- for ($i = 1; $i <= 5; $i++) {
- $uuid = get_theme_mod('login_avatar_uuid_' . $i);
- if (!empty($uuid)) {
- $has_avatars = true;
- $avatar_url = "https://visage.surgeplay.com/full/{$uuid}.png";
- // Das erste Bild wird direkt angezeigt
- $active_class = ($i === 1) ? 'avatar-slide-active' : '';
- $avatar_html .= '
';
- }
- }
- $avatar_html .= '
';
-
- // Nur den Slider ausgeben, wenn mindestens ein Avatar hinterlegt wurde
- if ($has_avatars) {
- echo $avatar_html;
- }
-}
-add_action('login_form', 'add_minecraft_avatar_slider_to_login');
-
-function add_post_login_links() {
- ?>
-
-
-
-
-
- $mod_value ) {
- set_theme_mod( $mod_key, $mod_value );
- }
-
- wp_send_json_success( __( 'Einstellungen erfolgreich importiert! Die Seite wird neu geladen...', 'minecraft-modern-theme' ) );
-}
-
+ 9999, // Sehr hohe Werte, um den Crop-Dialog zu umgehen
+ 'width' => 9999, // Sehr hohe Werte, um den Crop-Dialog zu umgehen
+ 'flex-height' => true,
+ 'flex-width' => true,
+ 'header_text' => array( 'site-title', 'site-description' ),
+ ) );
+
+ // Benutzerdefinierten Hintergrund aktivieren
+ add_theme_support( 'custom-background' );
+
+ register_nav_menus( array(
+ 'primary' => __( 'Hauptmenü', 'minecraft-modern-theme' ),
+ 'footer' => __( 'Footer-Menü', 'minecraft-modern-theme' ),
+ ) );
+ add_theme_support( 'html5', array( 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' ) );
+}
+add_action( 'after_setup_theme', 'minecraft_modern_setup' );
+
+// === Styles & Scripts laden ===
+function minecraft_modern_scripts() {
+ // Haupt-Stylesheet
+ wp_enqueue_style( 'minecraft-modern-style', get_stylesheet_uri() );
+
+ // Swiper.js CSS (von CDN)
+ wp_enqueue_style( 'swiper-css', 'https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css' );
+
+ // JavaScript für den Header-Scroll-Effekt
+ wp_enqueue_script(
+ 'minecraft-modern-header-script',
+ get_template_directory_uri() . '/js/header-scroll.js',
+ array(),
+ '1.0',
+ true
+ );
+
+ // NEU: Navigation Script für Dropdown Menü laden
+ wp_enqueue_script(
+ 'minecraft-navigation',
+ get_template_directory_uri() . '/js/navigation.js',
+ array(), // Keine Abhängigkeiten
+ '1.0',
+ true
+ );
+
+ // NEU: Ankündigungs-Skript laden
+ wp_enqueue_script(
+ 'announcement-script',
+ get_template_directory_uri() . '/js/announcement.js',
+ array(), // Keine Abhängigkeiten
+ '1.3', // Version angehoben für Countdown Update
+ true
+ );
+
+ // Swiper.js JS (von CDN)
+ wp_enqueue_script(
+ 'swiper-js',
+ 'https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js',
+ array(),
+ '8.0.0',
+ true
+ );
+
+ // Unsere eigene Slider-Initialisierungs-Datei
+ wp_enqueue_script(
+ 'minecraft-modern-slider-script',
+ get_template_directory_uri() . '/js/slider-init.js',
+ array('swiper-js'), // Hängt von Swiper.js ab
+ '1.0',
+ true
+ );
+
+ // NEU: Theme-Toggle-Skript laden
+ wp_enqueue_script(
+ 'theme-toggle-script',
+ get_template_directory_uri() . '/js/theme-toggle.js',
+ array(), // Keine Abhängigkeiten
+ '1.0',
+ true
+ );
+
+ // FAQ Skript laden, wenn der Post-Type aktiv ist
+ if ( post_type_exists('faq') ) {
+ wp_enqueue_script(
+ 'faq-accordion-script',
+ get_template_directory_uri() . '/js/faq-accordion.js',
+ array(),
+ '1.0',
+ true
+ );
+ }
+
+ // Übergebe ALLE Theme-Einstellungen an das JavaScript
+ wp_localize_script(
+ 'minecraft-modern-slider-script',
+ 'sliderSettings',
+ array(
+ 'hideArrows' => get_theme_mod( 'slider_hide_arrows', false ) ? '1' : '0',
+ 'hidePagination' => get_theme_mod( 'slider_hide_pagination', false ) ? '1' : '0',
+ 'effect' => get_theme_mod( 'slider_effect', 'fade' ),
+ 'direction' => get_theme_mod( 'slider_direction', 'horizontal' ),
+ 'defaultMode' => get_theme_mod( 'default_theme_mode', 'dark' ),
+ 'ajax_url' => admin_url('admin-ajax.php')
+ )
+ );
+
+ // Dies verhindert das Flackern im Customizer.
+ wp_localize_script(
+ 'minecraft-modern-header-script', // <-- Richtiges Skript-Handle!
+ 'headerSettings', // <-- Neuer Objektname für Klarheit
+ array(
+ 'isCustomizer' => is_customize_preview()
+ )
+ );
+}
+add_action( 'wp_enqueue_scripts', 'minecraft_modern_scripts' );
+
+// === Customizer-Datei laden ===
+require get_template_directory() . '/inc/customizer.php';
+
+// === Theme-Updater-Datei laden ===
+require get_template_directory() . '/inc/theme-updater.php';
+
+// === Footer-Widgets registrieren ===
+function minecraft_modern_footer_widgets() {
+ register_sidebar( array(
+ 'name' => __( 'Footer Links', 'minecraft-modern-theme' ),
+ 'id' => 'footer-left',
+ 'description' => __( 'Widget-Bereich links im Footer.', 'minecraft-modern-theme' ),
+ 'before_widget' => '',
+ 'after_widget' => '
',
+ 'before_title' => '',
+ ) );
+ for ( $i = 1; $i <= 3; $i++ ) {
+ register_sidebar( array(
+ 'name' => sprintf( __( 'Footer Spalte %d', 'minecraft-modern-theme' ), $i ),
+ 'id' => 'footer-' . $i,
+ 'description' => sprintf( __( 'Widget für die %d. Spalte im Footer.', 'minecraft-modern-theme' ), $i ),
+ 'before_widget' => '',
+ 'after_widget' => '
',
+ 'before_title' => '',
+ ) );
+ }
+ register_sidebar( array(
+ 'name' => __( 'Footer Rechts', 'minecraft-modern-theme' ),
+ 'id' => 'footer-right',
+ 'description' => __( 'Widget-Bereich rechts im Footer.', 'minecraft-modern-theme' ),
+ 'before_widget' => '',
+ 'after_widget' => '
',
+ 'before_title' => '',
+ ) );
+}
+add_action( 'widgets_init', 'minecraft_modern_footer_widgets' );
+
+// === FAQ Custom Post Type & Taxonomy ===
+function create_faq_post_type() {
+ // Nur registrieren, wenn im Customizer aktiviert
+ if ( get_theme_mod( 'faq_enabled', true ) ) {
+ register_post_type('faq',
+ array(
+ 'labels' => array(
+ 'name' => __( 'FAQs', 'minecraft-modern-theme' ),
+ 'singular_name' => __( 'FAQ', 'minecraft-modern-theme' ),
+ 'add_new' => __( 'Neue FAQ hinzufügen', 'minecraft-modern-theme' ),
+ 'add_new_item' => __( 'Neue FAQ hinzufügen', 'minecraft-modern-theme' ),
+ 'edit_item' => __( 'FAQ bearbeiten', 'minecraft-modern-theme' ),
+ 'new_item' => __( 'Neue FAQ', 'minecraft-modern-theme' ),
+ 'view_item' => __( 'FAQ ansehen', 'minecraft-modern-theme' ),
+ 'search_items' => __( 'FAQs durchsuchen', 'minecraft-modern-theme' ),
+ 'not_found' => __( 'Keine FAQs gefunden', 'minecraft-modern-theme' ),
+ 'not_found_in_trash' => __( 'Keine FAQs im Papierkorb gefunden', 'minecraft-modern-theme' ),
+ 'all_items' => __( 'Alle FAQs', 'minecraft-modern-theme' ),
+ ),
+ 'public' => true,
+ 'has_archive' => true, // Archiv-Seite /faq/ bleibt als Fallback
+ 'menu_icon' => 'dashicons-format-chat',
+ 'supports' => array( 'title', 'editor', 'page-attributes' ),
+ 'rewrite' => array( 'slug' => 'faq' ),
+ 'show_in_rest' => true,
+ )
+ );
+ register_taxonomy(
+ 'faq_category',
+ 'faq',
+ array(
+ 'label' => __( 'FAQ Kategorien', 'minecraft-modern-theme' ),
+ 'rewrite' => array( 'slug' => 'faq-kategorie' ),
+ 'hierarchical' => true,
+ 'show_in_rest' => true,
+ )
+ );
+ }
+}
+add_action('init', 'create_faq_post_type');
+
+// =============================================================================
+// ===== Automatische "Home" Seitenerstellung und Zuweisung (kombiniert) =======
+// =============================================================================
+
+/**
+ * Erstellt die "Home" Seite und weist sie automatisch als statische Startseite zu,
+ * wenn das Theme aktiviert wird und noch keine Seite festgelegt ist.
+ */
+function set_static_front_page_automatically() {
+ // Nur ausführen, wenn noch keine statische Seite als Startseite festgelegt ist
+ if ( 'page' !== get_option( 'show_on_front' ) ) {
+
+ // Finde die "Home" Seite (oder erstelle sie, falls sie nicht existiert)
+ $home_page = get_page_by_title( 'Home' );
+ if ( ! $home_page ) {
+ // Seite erstellen, falls sie nicht existiert
+ $home_page_id = wp_insert_post( array(
+ 'post_title' => 'Home',
+ 'post_content' => 'Diese Seite dient als statische Startseite.',
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'post_author' => 1,
+ ) );
+ } else {
+ $home_page_id = $home_page->ID;
+ }
+
+ // Setze die Seite als statische Startseite
+ if ( $home_page_id ) {
+ update_option( 'show_on_front', 'page' );
+ update_option( 'page_on_front', $home_page_id );
+ }
+ }
+}
+add_action( 'after_switch_theme', 'set_static_front_page_automatically' );
+
+
+/**
+ * Fügt eine Body-Klasse hinzu, um den Home-Titel per CSS auszublenden.
+ */
+function add_home_body_class( $classes ) {
+ // Prüfen, ob wir auf der Startseite sind und die Einstellung zum Ausblenden aktiv ist
+ if ( is_front_page() && !get_theme_mod( 'show_home_title', true ) ) {
+ $classes[] = 'home-title-hidden';
+ }
+ return $classes;
+}
+add_filter( 'body_class', 'add_home_body_class' );
+
+
+// =============================================================================
+// Automatische FAQ-Seitenerstellung und Template-Zuweisung
+// =============================================================================
+
+/**
+ * Erstellt automatisch eine "FAQ" Seite, wenn die FAQ-Funktion aktiviert wird.
+ */
+function create_faq_page_automatically() {
+ // Prüfen, ob die FAQ-Funktion aktiv ist
+ if ( get_theme_mod( 'faq_enabled', true ) ) {
+ // Prüfen, ob die Seite bereits existiert
+ if ( get_page_by_title( 'FAQ' ) == null ) {
+ // Seite erstellen
+ $new_page = array(
+ 'post_title' => 'FAQ',
+ 'post_content' => 'Diese Seite zeigt alle FAQs an. Der Inhalt wird automatisch generiert.',
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'post_author' => 1,
+ );
+ // Seite in die Datenbank einfügen
+ wp_insert_post( $new_page );
+ }
+ }
+}
+// Diese Funktion wird ausgeführt, wenn der Customizer gespeichert wird.
+add_action( 'customize_save_after', 'create_faq_page_automatically' );
+
+
+/**
+ * Leitet Anfragen für die "FAQ" Seite auf unser spezielles Template um.
+ */
+function load_faq_page_template( $template ) {
+ // Prüfen, ob die FAQ-Funktion aktiv ist
+ if ( get_theme_mod( 'faq_enabled', true ) ) {
+ // Prüfen, ob wir uns auf einer Seite befinden
+ if ( is_page() ) {
+ global $post;
+ // Prüfen, ob der Titel der Seite "FAQ" ist
+ if ( $post && $post->post_title == 'FAQ' ) {
+ // Pfad zu unserem Template zurückgeben
+ return get_template_directory() . '/archive-faq.php';
+ }
+ }
+ }
+ // Standard-Template in allen anderen Fällen
+ return $template;
+}
+add_filter( 'template_include', 'load_faq_page_template' );
+
+
+// =========================================================================
+// === CUSTOM LOGIN FUNCTIONS =============================================
+// =========================================================================
+
+// Lädt alle notwendigen Styles und Scripts nur für die Login-Seite
+function minecraft_modern_login_assets() {
+ // Lade die Login-spezifische CSS
+ wp_enqueue_style('minecraft-modern-login-style', get_template_directory_uri() . '/css/login-style.css');
+
+ // Lade Font Awesome für Icons
+ wp_enqueue_style('font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css');
+
+ // Lade das JavaScript für den Avatar-Slider
+ wp_enqueue_script('minecraft-avatar-slider-script', get_template_directory_uri() . '/js/login-slider.js', array('jquery'), '1.0', true);
+
+ // Lade das JavaScript, das die HTML-Struktur anpasst
+ wp_enqueue_script('minecraft-modern-login-script', get_template_directory_uri() . '/js/login-script.js', array('jquery'), '1.0', true);
+
+ wp_add_inline_script('minecraft-modern-login-script', "
+ jQuery(document).ready(function($) {
+ $('.forgetmenot, #nav').wrapAll('
');
+ });
+ ");
+
+ // Übergebe die Slider-Geschwindigkeit aus dem Customizer an das JavaScript
+ $slider_speed = get_theme_mod('login_avatar_slider_speed', 4); // Standard: 4 Sekunden
+ wp_localize_script('minecraft-avatar-slider-script', 'avatarSliderSettings', array(
+ 'speed' => $slider_speed * 1000 // Umwandlung in Millisekunden für JS
+ ));
+
+ // Hintergrundbild und Logo als Inline-CSS hinzufügen
+ $login_bg_image = get_theme_mod('login_background_image');
+ if ($login_bg_image) {
+ $custom_css = "body.login { background-image: url('{$login_bg_image}') !important; }";
+ wp_add_inline_style('minecraft-modern-login-style', $custom_css);
+ }
+ $logo_url = get_theme_mod('login_logo');
+ if ($logo_url) {
+ $logo_css = ".login h1 a { background-image: url('{$logo_url}') !important; }";
+ wp_add_inline_style('minecraft-modern-login-style', $logo_css);
+ }
+}
+add_action('login_enqueue_scripts', 'minecraft_modern_login_assets');
+
+// Erstellt die HTML-Struktur für den Avatar-Slider
+function add_minecraft_avatar_slider_to_login() {
+ $avatar_html = '';
+ $has_avatars = false;
+
+ // Durchlaufe alle 5 möglichen Avatar-Plätze
+ for ($i = 1; $i <= 5; $i++) {
+ $uuid = get_theme_mod('login_avatar_uuid_' . $i);
+ if (!empty($uuid)) {
+ $has_avatars = true;
+ $avatar_url = "https://visage.surgeplay.com/full/{$uuid}.png";
+ // Das erste Bild wird direkt angezeigt
+ $active_class = ($i === 1) ? 'avatar-slide-active' : '';
+ $avatar_html .= '
';
+ }
+ }
+ $avatar_html .= '
';
+
+ // Nur den Slider ausgeben, wenn mindestens ein Avatar hinterlegt wurde
+ if ($has_avatars) {
+ echo $avatar_html;
+ }
+}
+add_action('login_form', 'add_minecraft_avatar_slider_to_login');
+
+function add_post_login_links() {
+ ?>
+
+
+
+
+
+ 'team_member',
+ 'posts_per_page' => -1,
+ 'orderby' => 'menu_order',
+ 'order' => 'ASC'
+ ));
+
+ if ( $team_query->have_posts() ) {
+ while ( $team_query->have_posts() ) : $team_query->the_post();
+ $team_data[] = array(
+ 'title' => get_the_title(),
+ 'content' => get_the_content(),
+ 'rank' => get_post_meta( get_the_ID(), '_team_member_rank', true ),
+ 'menu_order' => get_post_field( 'menu_order', get_the_ID() ),
+ // Bilder werden NICHT exportiert (siehe Hinweis unten)
+ );
+ endwhile;
+ }
+ $mods['team_data'] = $team_data;
+ // --- ENDE TEAM EXPORT ---
+
+ // Daten als JSON vorbereiten
+ $data = json_encode( $mods, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE );
+
+ // Header für Download setzen
+ header( 'Content-Type: application/json; charset=utf-8' );
+ header( 'Content-Disposition: attachment; filename=' . $theme_slug . '-settings-' . date( 'Y-m-d' ) . '.json' );
+ header( 'Pragma: no-cache' );
+ header( 'Expires: 0' );
+
+ echo $data;
+ exit;
+}
+
+// 2. Import Handler (AJAX) - ERWEITERT UM TEAM
+add_action( 'wp_ajax_import_theme_settings', 'handle_theme_settings_import' );
+
+function handle_theme_settings_import() {
+ // Sicherheitscheck & Nonce
+ if ( ! current_user_can( 'edit_theme_options' ) ) {
+ wp_send_json_error( __( 'Keine Berechtigung.', 'minecraft-modern-theme' ) );
+ }
+
+ check_ajax_referer( 'theme-import-nonce', 'nonce' );
+
+ if ( empty( $_FILES['import_file']['tmp_name'] ) ) {
+ wp_send_json_error( __( 'Keine Datei hochgeladen.', 'minecraft-modern-theme' ) );
+ }
+
+ // Datei einlesen
+ $file = $_FILES['import_file']['tmp_name'];
+ $json_content = file_get_contents( $file );
+ $data = json_decode( $json_content, true );
+
+ // JSON validieren
+ if ( json_last_error() !== JSON_ERROR_NONE || ! is_array( $data ) ) {
+ wp_send_json_error( __( 'Die hochgeladene Datei ist keine gültige JSON-Datei.', 'minecraft-modern-theme' ) );
+ }
+
+ // 1. Theme Mods & Announcement importieren (siehe vorheriger Code)
+ foreach ( $data as $mod_key => $mod_value ) {
+ // Differenzierung wie beim Export
+ if ( strpos( $mod_key, 'mm_announcement_' ) === 0 ) {
+ update_option( $mod_key, $mod_value );
+ } else {
+ set_theme_mod( $mod_key, $mod_value );
+ }
+ }
+
+ // 2. --- NEU: Team Daten importieren ---
+ if ( isset( $data['team_data'] ) && ! empty( $data['team_data'] ) ) {
+
+ // Option 1: Vorherige Team-Mitglieder löschen (Clean Import)
+ // Wir force-delete alle Posts, damit die Liste exakt so ist wie im Backup.
+ $existing_team = new WP_Query(array(
+ 'post_type' => 'team_member',
+ 'posts_per_page' => -1,
+ 'fields' => 'ids' // Nur IDs holen, schneller
+ ));
+ if ( $existing_team->have_posts() ) {
+ while ( $existing_team->have_posts() ) {
+ wp_delete_post( $existing_team->next_post()->ID, true ); // true = force delete
+ }
+ }
+
+ // Neue Mitglieder anlegen
+ foreach ( $data['team_data'] as $member ) {
+ $id = wp_insert_post(array(
+ 'post_title' => sanitize_text_field( $member['title'] ),
+ 'post_content' => sanitize_textarea_field( $member['content'] ),
+ 'post_type' => 'team_member',
+ 'post_status' => 'publish',
+ 'menu_order' => isset( $member['menu_order'] ) ? intval( $member['menu_order'] ) : 0
+ ));
+
+ if ( $id && ! is_wp_error( $id ) ) {
+ // Rang als Meta-Data speichern
+ if ( isset( $member['rank'] ) ) {
+ update_post_meta( $id, '_team_member_rank', sanitize_text_field( $member['rank'] ) );
+ }
+ // Bilder werden NICFT importiert (siehe Hinweis unten)
+ }
+ }
+ }
+ // --- ENDE TEAM IMPORT ---
+
+ wp_send_json_success( __( 'Einstellungen und Team erfolgreich importiert! Bilder müssen ggf. neu hochgeladen werden.', 'minecraft-modern-theme' ) );
+}
+
+/*
+ * -------------------------------------------------------------------------
+ * Announcement Bar (Admin + Frontend) – vollständiges Modul mit Font-Vorschau & Countdown
+ * -------------------------------------------------------------------------
+ */
+
+/**
+ * Liste verfügbarer Fonts (Label, CSS-Family, Google-Flag, Google-Name)
+ */
+function mm_announcement_get_font_list() {
+ return array(
+ 'inherit' => array('label' => 'Theme-Standard', 'css' => 'inherit', 'google' => false, 'google_name' => ''),
+ 'Arial' => array('label' => 'Arial', 'css' => 'Arial, Helvetica, sans-serif', 'google' => false, 'google_name' => ''),
+ 'Roboto' => array('label' => 'Roboto', 'css' => "'Roboto', sans-serif", 'google' => true, 'google_name' => 'Roboto'),
+ 'Montserrat' => array('label' => 'Montserrat', 'css' => "'Montserrat', sans-serif", 'google' => true, 'google_name' => 'Montserrat'),
+ 'Open Sans' => array('label' => 'Open Sans', 'css' => "'Open Sans', sans-serif", 'google' => true, 'google_name' => 'Open+Sans'),
+ 'Lato' => array('label' => 'Lato', 'css' => "'Lato', sans-serif", 'google' => true, 'google_name' => 'Lato'),
+ 'Poppins' => array('label' => 'Poppins', 'css' => "'Poppins', sans-serif", 'google' => true, 'google_name' => 'Poppins'),
+ 'Source Sans Pro' => array('label' => 'Source Sans Pro', 'css' => "'Source Sans Pro', sans-serif", 'google' => true, 'google_name' => 'Source+Sans+Pro'),
+ 'Noto Sans' => array('label' => 'Noto Sans', 'css' => "'Noto Sans', sans-serif", 'google' => true, 'google_name' => 'Noto+Sans'),
+ 'Raleway' => array('label' => 'Raleway', 'css' => "'Raleway', sans-serif", 'google' => true, 'google_name' => 'Raleway'),
+ 'Merriweather' => array('label' => 'Merriweather', 'css' => "'Merriweather', serif", 'google' => true, 'google_name' => 'Merriweather'),
+ 'Playfair Display' => array('label' => 'Playfair Display', 'css' => "'Playfair Display', serif", 'google' => true, 'google_name' => 'Playfair+Display'),
+ 'Oswald' => array('label' => 'Oswald', 'css' => "'Oswald', sans-serif", 'google' => true, 'google_name' => 'Oswald'),
+ 'Rubik' => array('label' => 'Rubik', 'css' => "'Rubik', sans-serif", 'google' => true, 'google_name' => 'Rubik'),
+ 'Inter' => array('label' => 'Inter', 'css' => "'Inter', sans-serif", 'google' => true, 'google_name' => 'Inter'),
+ 'Nunito' => array('label' => 'Nunito', 'css' => "'Nunito', sans-serif", 'google' => true, 'google_name' => 'Nunito'),
+ 'Ubuntu' => array('label' => 'Ubuntu', 'css' => "'Ubuntu', sans-serif", 'google' => true, 'google_name' => 'Ubuntu'),
+ 'PT Sans' => array('label' => 'PT Sans', 'css' => "'PT Sans', sans-serif", 'google' => true, 'google_name' => 'PT+Sans'),
+ 'Archivo' => array('label' => 'Archivo', 'css' => "'Archivo', sans-serif", 'google' => true, 'google_name' => 'Archivo'),
+ 'Fira Sans' => array('label' => 'Fira Sans', 'css' => "'Fira Sans', sans-serif", 'google' => true, 'google_name' => 'Fira+Sans'),
+ 'Work Sans' => array('label' => 'Work Sans', 'css' => "'Work Sans', sans-serif", 'google' => true, 'google_name' => 'Work+Sans'),
+ 'Quicksand' => array('label' => 'Quicksand', 'css' => "'Quicksand', sans-serif", 'google' => true, 'google_name' => 'Quicksand'),
+ 'Karla' => array('label' => 'Karla', 'css' => "'Karla', sans-serif", 'google' => true, 'google_name' => 'Karla'),
+
+ // Script / Schreibschrift
+ 'Dancing Script' => array('label' => 'Dancing Script', 'css' => "'Dancing Script', cursive", 'google' => true, 'google_name' => 'Dancing+Script'),
+ 'Pacifico' => array('label' => 'Pacifico', 'css' => "'Pacifico', cursive", 'google' => true, 'google_name' => 'Pacifico'),
+ 'Great Vibes' => array('label' => 'Great Vibes', 'css' => "'Great Vibes', cursive", 'google' => true, 'google_name' => 'Great+Vibes'),
+ 'Satisfy' => array('label' => 'Satisfy', 'css' => "'Satisfy', cursive", 'google' => true, 'google_name' => 'Satisfy'),
+ 'Allura' => array('label' => 'Allura', 'css' => "'Allura', cursive", 'google' => true, 'google_name' => 'Allura'),
+ 'Alex Brush' => array('label' => 'Alex Brush', 'css' => "'Alex Brush', cursive", 'google' => true, 'google_name' => 'Alex+Brush'),
+ 'Cookie' => array('label' => 'Cookie', 'css' => "'Cookie', cursive", 'google' => true, 'google_name' => 'Cookie'),
+ );
+}
+
+
+
+/* ------------------ Admin: Einstellungen & Menü ------------------ */
+function mm_announcement_admin_init() {
+ add_menu_page(
+ 'Ankündigung',
+ 'Ankündigung',
+ 'manage_options',
+ 'mm-announcement',
+ 'mm_announcement_admin_page',
+ 'dashicons-megaphone',
+ 61
+ );
+
+ register_setting('mm_announcement_group', 'mm_announcement_enabled');
+ register_setting('mm_announcement_group', 'mm_announcement_text');
+ register_setting('mm_announcement_group', 'mm_announcement_bg');
+ register_setting('mm_announcement_group', 'mm_announcement_color');
+ register_setting('mm_announcement_group', 'mm_announcement_font_size');
+ register_setting('mm_announcement_group', 'mm_announcement_font_family');
+ register_setting('mm_announcement_group', 'mm_announcement_position');
+
+ // --- NEU: Countdown Timer Settings ---
+ register_setting('mm_announcement_group', 'mm_announcement_countdown_enabled');
+ register_setting('mm_announcement_group', 'mm_announcement_countdown_label');
+ register_setting('mm_announcement_group', 'mm_announcement_countdown_date');
+ register_setting('mm_announcement_group', 'mm_announcement_countdown_expired_msg');
+}
+add_action('admin_menu', 'mm_announcement_admin_init');
+
+
+/* ------------------ Admin: Seite (mit Font-Select & Vorschau) ------------------ */
+function mm_announcement_admin_page() {
+ if ( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ $fonts = mm_announcement_get_font_list();
+ $selected_font = get_option('mm_announcement_font_family', 'inherit');
+ $selected_size = (int) get_option('mm_announcement_font_size', 16 );
+ $bg = esc_attr( get_option('mm_announcement_bg', '#1e1e1e') );
+ $color = esc_attr( get_option('mm_announcement_color', '#ffffff') );
+ $text_sample = wp_strip_all_tags( get_option('mm_announcement_text') ) ?: 'Das ist eine Vorschau: Wie sieht die Schrift aus?';
+
+ ?>
+
+
Header-Ankündigung
+
+
+ Diese Leiste wird auf allen Seiten angezeigt. Die Vorschau unten zeigt sofort, wie die Ankündigung aussieht — Änderungen im Editor oder an den Design-Feldern wirken direkt in der Vorschau , erst wenn du auf Änderungen speichern klickst, werden die Einstellungen im Frontend übernommen.
+
+
+
+
+
+
+
+ ' . $countdown_label . '
+ Laden...
+ ';
+ }
+
+ ?>
+
+ get_option('mm_announcement_font_family', 'inherit'),
+ 'size' => (int) get_option('mm_announcement_font_size', 16),
+ 'bg' => get_option('mm_announcement_bg', '#1e1e1e'),
+ 'color'=> get_option('mm_announcement_color', '#ffffff'),
+ 'text' => wp_kses_post( get_option('mm_announcement_text') )
+ );
+ wp_localize_script( 'mm-announcement-admin-script', 'MM_Announcement_Current', $current );
+}
+add_action( 'admin_enqueue_scripts', 'mm_announcement_admin_assets' );
+
+
+/* -------------------------------------------------------------------------
+ * COMPLETES TEAM MODUL (SICHER & FUNKTIONIEREND)
+ * ------------------------------------------------------------------------- */
+
+// === 1. Custom Post Type Registrierung ===
+function create_team_post_type() {
+ // Nur laden, wenn im Customizer aktiviert
+ if ( get_theme_mod( 'team_enabled', true ) ) {
+ register_post_type('team_member',
+ array(
+ 'labels' => array(
+ 'name' => __( 'Team', 'minecraft-modern-theme' ),
+ 'singular_name' => __( 'Teammitglied', 'minecraft-modern-theme' ),
+ 'add_new' => __( 'Neues Mitglied', 'minecraft-modern-theme' ),
+ 'menu_name' => __( 'Team', 'minecraft-modern-theme' ),
+ ),
+ 'public' => true,
+ 'has_archive' => true,
+ 'menu_icon' => 'dashicons-groups',
+ 'supports' => array( 'title', 'thumbnail', 'page-attributes' ),
+ 'rewrite' => array( 'slug' => 'team' ),
+ 'show_in_rest' => true,
+
+ // FIX: Standard-Menü ausblenden, wir nutzen nur den Manager
+ 'show_in_menu' => false,
+
+ )
+ );
+ }
+}
+add_action('init', 'create_team_post_type');
+
+// === 2. Meta-Box für Rang ===
+function add_team_meta_boxes() {
+ add_meta_box(
+ 'team_member_rank_box',
+ __( 'Rang & Position', 'minecraft-modern-theme' ),
+ 'team_member_rank_callback',
+ 'team_member',
+ 'side',
+ 'default'
+ );
+}
+add_action('add_meta_boxes', 'add_team_meta_boxes');
+
+function team_member_rank_callback( $post ) {
+ wp_nonce_field( 'team_member_rank_save', 'team_member_rank_nonce' );
+ $value = get_post_meta( $post->ID, '_team_member_rank', true );
+ ?>
+
+ Rang:
+
+
+
+
+
Team Verwaltung
+
Hier kannst du Teammitglieder hinzufügen, sortieren und bearbeiten.
+
+
+
+
Neues Mitglied hinzufügen
+
+
+
+
+
+
+
+
+
+
+
+ sanitize_text_field($_POST['name']),
+ 'post_content' => sanitize_textarea_field($_POST['bio']),
+ 'post_type' => 'team_member', 'post_status' => 'publish', 'menu_order' => 999
+ ));
+ if ($id && !is_wp_error($id)) {
+ update_post_meta($id, '_team_member_rank', sanitize_text_field($_POST['rank']));
+ if (!empty($_POST['img_id'])) set_post_thumbnail($id, intval($_POST['img_id']));
+ wp_send_json_success('Hinzugefügt');
+ } else { wp_send_json_error('Fehler'); }
+}
+
+add_action('wp_ajax_mm_update_team_member', 'handle_mm_update_team_member');
+function handle_mm_update_team_member() {
+ check_ajax_referer('mm_team_nonce', 'nonce');
+ if (!current_user_can('edit_posts')) wp_send_json_error('Keine Berechtigung');
+ $id = intval($_POST['id']);
+ wp_update_post(array('ID' => $id, 'post_title' => sanitize_text_field($_POST['title']), 'post_content' => sanitize_textarea_field($_POST['bio'])));
+ update_post_meta($id, '_team_member_rank', sanitize_text_field($_POST['rank']));
+ wp_send_json_success('Gespeichert');
+}
+
+add_action('wp_ajax_mm_delete_team_member', 'handle_mm_delete_team_member');
+function handle_mm_delete_team_member() {
+ check_ajax_referer('mm_team_nonce', 'nonce');
+ if (!current_user_can('delete_posts')) wp_send_json_error('Keine Berechtigung');
+ wp_delete_post(intval($_POST['id']), true);
+ wp_send_json_success('Gelöscht');
+}
+
+// === 4. Automatische Team-Seite ===
+function create_team_page_automatically() {
+ if ( get_theme_mod( 'team_enabled', true ) && get_page_by_title( 'Team' ) == null ) {
+ wp_insert_post( array( 'post_title' => 'Team', 'post_status' => 'publish', 'post_type' => 'page', 'post_author' => 1 ) );
+ }
+}
+add_action( 'customize_save_after', 'create_team_page_automatically' );
+
+// === 5. Template Loader (ROBUSTER FIX) ===
+function load_team_page_template( $template ) {
+ if ( ! get_theme_mod( 'team_enabled', true ) ) return $template;
+
+ // 1. Check auf Archiv-Seite
+ if ( is_post_type_archive('team_member') ) { return get_template_directory() . '/archive-team.php'; }
+
+ // 2. Check auf Seite anhand des Slugs
+ if ( is_page() ) {
+ // FIX: Korrekte Methode das Page-Objekt zu holen
+ $obj = get_queried_object();
+
+ if ( $obj && $obj->post_name === 'team' ) {
+ return get_template_directory() . '/archive-team.php';
+ }
+ }
+ return $template;
+}
+add_filter( 'template_include', 'load_team_page_template' );
+
+// === 6. Customizer Settings ===
+add_action( 'customize_register', 'team_customize_register' );
+function team_customize_register( $wp_customize ) {
+ $wp_customize->add_section( 'team_settings', array( 'title' => 'Team Einstellungen', 'priority' => 65 ) );
+ $wp_customize->add_setting( 'team_enabled', array( 'default' => true, 'sanitize_callback' => 'wp_validate_boolean' ) );
+ $wp_customize->add_control( 'team_enabled', array( 'label' => 'Team Showcase aktivieren', 'section' => 'team_settings', 'settings' => 'team_enabled', 'type' => 'checkbox' ) );
+}
\ No newline at end of file