From 839b1a2e85411024806e41784ec0469f9a2d634a Mon Sep 17 00:00:00 2001 From: M_Viper Date: Fri, 9 Jan 2026 19:45:46 +0000 Subject: [PATCH] Upload functions.php via GUI --- Minecraft-Modern-Theme/functions.php | 1823 +++++++++++++++++++------- 1 file changed, 1329 insertions(+), 494 deletions(-) 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' => '

', - 'after_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' => '

', - 'after_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' => '

', - 'after_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 .= 'Minecraft Avatar ' . ($i + 1) . ''; - } - } - $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() { - ?> -
- ← Zu -
- - - - - $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' => '

', + 'after_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' => '

', + 'after_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' => '

', + 'after_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 .= 'Minecraft Avatar ' . ($i + 1) . ''; + } + } + $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() { + ?> +
+ ← Zu +
+ + + + + '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. +

+ +
+ + +

Allgemein

+ + + + + +
Aktivieren + +

Wenn deaktiviert, wird die Leiste nicht angezeigt.

+
+ +

Inhalt

+ + + + + +
Text + 6, + 'media_buttons' => false, + 'tinymce' => true, + 'quicktags' => true, + ) + ); + ?> + + + + +

Verfügbare Icons

+

Diese Icons kannst du direkt im Ankündigungstext verwenden. Klicke auf ein Icon, um es in den Editor einzufügen.

+ +
+ '.$icon.''; + } + ?> +
+ + + + +

HTML erlaubt (z. B. <a>-Links). Änderungen hier erscheinen sofort in der Vorschau — sie werden aber erst nach "Änderungen speichern" im Frontend übernommen.

+ + +
+
+ +
+ +

+ Live Vorschau +

+
+ +
+ +

Position

+ + + + + +
Anzeigeort + +

Wähle die Position für die Anzeige. Die Vorschau zeigt die Position optisch — tatsächliche Frontend-Platzierung erfolgt nach Speichern.

+
+ +

Design

+ + + + + + + + + + + + + + + + + +
Hintergrundfarbe
Textfarbe
Schriftgröße (px)
Schriftfamilie + +

Wähle eine Schriftart. Die Vorschau lädt Google-Fonts automatisch für die Vorschau an (nur im Admin).

+
+ + +

Countdown Timer

+ + + + + + + + + + + + + + + + + +
Countdown aktivieren + +

Zeigt einen Countdown neben dem Ankündigungstext an.

+
Label (Text vor dem Timer) + +

z.B. "Server Restart in:"

+
Zieldatum & Uhrzeit + +

Wähle das Datum und die Uhrzeit (lokale Server-Zeit).

+
Nachricht nach Ablauf + +

Text, der angezeigt wird, wenn der Countdown bei 0 ist.

+
+ + +
+ +
+ + + ' . $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 ); + ?> +

+ + +

+ +
+

Team Verwaltung

+

Hier kannst du Teammitglieder hinzufügen, sortieren und bearbeiten.

+ + +
+

Neues Mitglied hinzufügen

+
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ + + Kein Bild gewählt +
+
+
+ +
+ +
+
+
+ + +
+ + + + + + + + + + + + + '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(); + $id = get_the_ID(); + $name = get_the_title(); + $rank = get_post_meta($id, '_team_member_rank', true); + $bio = get_the_content(); + $img_id = get_post_thumbnail_id($id); + ?> + + + + + + + + + '; + endif; + ?> + +
BildNameRangBioSort.Aktionen
+
+ 👤'; ?> +
+
+ + + + + +
Noch keine Mitglieder vorhanden.
+
+
+ + + + + + 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