Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 519c7c6b52 | |||
| 8499b29174 | |||
| b62c52cfad | |||
| 57e758353a | |||
| ae4ec1dc30 |
@@ -16,7 +16,7 @@ function minecraft_modern_setup() {
|
||||
'width' => 9999, // Sehr hohe Werte, um den Crop-Dialog zu umgehen
|
||||
'flex-height' => true,
|
||||
'flex-width' => true,
|
||||
'header-text' => array( 'site-title', 'site-description' ),
|
||||
'header_text' => array( 'site-title', 'site-description' ),
|
||||
) );
|
||||
|
||||
// Benutzerdefinierten Hintergrund aktivieren
|
||||
@@ -425,4 +425,70 @@ function minecraft_modern_scroll_to_top_script() {
|
||||
true
|
||||
);
|
||||
}
|
||||
add_action('wp_enqueue_scripts', 'minecraft_modern_scroll_to_top_script');
|
||||
add_action('wp_enqueue_scripts', 'minecraft_modern_scroll_to_top_script');
|
||||
|
||||
// =============================================================================
|
||||
// === THEME SETTINGS EXPORT / IMPORT (KORRIGIERTE VERSION) =================
|
||||
// =============================================================================
|
||||
|
||||
// 1. Export Handler (Download)
|
||||
add_action( 'admin_post_export_theme_settings', 'handle_theme_settings_export' );
|
||||
|
||||
function handle_theme_settings_export() {
|
||||
// Sicherheitscheck
|
||||
if ( ! current_user_can( 'edit_theme_options' ) ) {
|
||||
wp_die( __( 'Du hast keine Berechtigung, diese Aktion auszuführen.', 'minecraft-modern-theme' ) );
|
||||
}
|
||||
|
||||
// Theme Slug ermitteln
|
||||
$theme_slug = get_option( 'stylesheet' );
|
||||
|
||||
// Alle Einstellungen holen
|
||||
$mods = get_theme_mods();
|
||||
|
||||
// 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)
|
||||
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' ) );
|
||||
}
|
||||
|
||||
// Einstellungen in die Datenbank schreiben
|
||||
foreach ( $data as $mod_key => $mod_value ) {
|
||||
set_theme_mod( $mod_key, $mod_value );
|
||||
}
|
||||
|
||||
wp_send_json_success( __( 'Einstellungen erfolgreich importiert! Die Seite wird neu geladen...', 'minecraft-modern-theme' ) );
|
||||
}
|
||||
|
||||
|
||||
@@ -46,35 +46,35 @@
|
||||
|
||||
<div class="header-info">
|
||||
<div class="social-links">
|
||||
<?php
|
||||
// Array mit den Social-Media-Plattformen und ihren Font Awesome Klassen
|
||||
$social_icons = array(
|
||||
'discord' => 'fab fa-discord',
|
||||
'youtube' => 'fab fa-youtube',
|
||||
'twitter' => 'fab fa-x-twitter', // Neues Icon für Twitter/X
|
||||
'facebook' => 'fab fa-facebook-f',
|
||||
'instagram' => 'fab fa-instagram',
|
||||
'tiktok' => 'fab fa-tiktok',
|
||||
'twitch' => 'fab fa-twitch',
|
||||
'steam' => 'fab fa-steam',
|
||||
'github' => 'fab fa-github',
|
||||
'linkedin' => 'fab fa-linkedin-in',
|
||||
'pinterest' => 'fab fa-pinterest-p',
|
||||
'reddit' => 'fab fa-reddit-alien',
|
||||
'teamspeak' => 'fab fa-teamspeak',
|
||||
'spotify' => 'fab fa-spotify'
|
||||
);
|
||||
<?php
|
||||
// Array mit den Social-Media-Plattformen und ihren Font Awesome Klassen
|
||||
$social_icons = array(
|
||||
'discord' => 'fab fa-discord',
|
||||
'youtube' => 'fab fa-youtube',
|
||||
'twitter' => 'fab fa-x-twitter', // Neues Icon für Twitter/X
|
||||
'facebook' => 'fab fa-facebook-f',
|
||||
'instagram' => 'fab fa-instagram',
|
||||
'tiktok' => 'fab fa-tiktok',
|
||||
'twitch' => 'fab fa-twitch',
|
||||
'steam' => 'fab fa-steam',
|
||||
'github' => 'fab fa-github',
|
||||
'linkedin' => 'fab fa-linkedin-in',
|
||||
'pinterest' => 'fab fa-pinterest-p',
|
||||
'reddit' => 'fab fa-reddit-alien',
|
||||
'teamspeak' => 'fab fa-teamspeak',
|
||||
'spotify' => 'fab fa-spotify'
|
||||
);
|
||||
|
||||
// Schleife, die alle verfügbaren Icons durchgeht
|
||||
foreach ($social_icons as $key => $class) {
|
||||
// Prüfen, ob für diese Plattform eine URL im Customizer hinterlegt wurde
|
||||
if (get_theme_mod('social_' . $key)) {
|
||||
// Wenn ja, Link und Icon ausgeben
|
||||
echo '<a href="' . esc_url(get_theme_mod('social_' . $key)) . '" target="_blank"><i class="' . esc_attr($class) . '"></i></a>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
// Schleife, die alle verfügbaren Icons durchgeht
|
||||
foreach ($social_icons as $key => $class) {
|
||||
// Prüfen, ob für diese Plattform eine URL im Customizer hinterlegt wurde
|
||||
if (get_theme_mod('social_' . $key)) {
|
||||
// Wenn ja, Link und Icon ausgeben
|
||||
echo '<a href="' . esc_url(get_theme_mod('social_' . $key)) . '" target="_blank"><i class="' . esc_attr($class) . '"></i></a>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -68,7 +68,7 @@ function minecraft_modern_customize_register( $wp_customize ) {
|
||||
'label' => 'Schriftfarbe', 'section' => 'header_slider', 'settings' => 'slider_font_color',
|
||||
) ) );
|
||||
|
||||
// === VERGESSENE EINSTELLUNG WIEDER HINZUGEFÜGT ===
|
||||
// Header-Höhe
|
||||
$wp_customize->add_setting( 'header_height', array( 'default' => 'mittel', 'sanitize_callback' => 'sanitize_text_field' ) );
|
||||
$wp_customize->add_control( 'header_height', array(
|
||||
'label' => 'Header-Höhe', 'section' => 'header_slider', 'settings' => 'header_height', 'type' => 'select',
|
||||
@@ -84,10 +84,6 @@ function minecraft_modern_customize_register( $wp_customize ) {
|
||||
'label' => 'Paginierung (Punkte) ausblenden', 'section' => 'header_slider', 'settings' => 'slider_hide_pagination', 'type' => 'checkbox',
|
||||
) );
|
||||
|
||||
// =========================================================================
|
||||
// === ENTFERNT: Slider-Effekt-Einstellungen ==============================
|
||||
// =========================================================================
|
||||
|
||||
// --- Sektion: Startseiten-Hero (Fallback) ---
|
||||
$wp_customize->add_section( 'hero_section', array(
|
||||
'title' => 'Startseiten-Hero (wenn Slider deaktiviert)',
|
||||
@@ -113,7 +109,7 @@ function minecraft_modern_customize_register( $wp_customize ) {
|
||||
|
||||
// --- Checkbox: Seitentitel auf Startseite verstecken ---
|
||||
$wp_customize->add_setting( 'show_home_title', array(
|
||||
'default' => false, // Standard: Aus (Titel wird versteckt)
|
||||
'default' => false,
|
||||
'sanitize_callback' => 'wp_validate_boolean',
|
||||
) );
|
||||
$wp_customize->add_control( 'show_home_title', array(
|
||||
@@ -276,6 +272,121 @@ function minecraft_modern_customize_register( $wp_customize ) {
|
||||
'type' => 'number',
|
||||
'input_attrs' => array( 'min' => 2, 'max' => 10, 'step' => 1 ),
|
||||
) );
|
||||
|
||||
// =========================================================================
|
||||
// === 7. EXPORT / IMPORT SECTION =========================================
|
||||
// =========================================================================
|
||||
|
||||
$wp_customize->add_section( 'theme_mods_import_export', array(
|
||||
'title' => __( 'Einstellungen sichern', 'minecraft-modern-theme' ),
|
||||
'priority' => 999,
|
||||
'description' => '',
|
||||
) );
|
||||
|
||||
// Füge ein Custom Control mit HTML hinzu
|
||||
$wp_customize->add_setting( 'import_export_placeholder', array(
|
||||
'sanitize_callback' => 'sanitize_text_field',
|
||||
) );
|
||||
|
||||
// Custom Control Class für Export/Import
|
||||
class Import_Export_Control extends WP_Customize_Control {
|
||||
public $type = 'import_export';
|
||||
|
||||
public function render_content() {
|
||||
$export_url = admin_url('admin-post.php?action=export_theme_settings');
|
||||
$nonce = wp_create_nonce('theme-import-nonce');
|
||||
?>
|
||||
<div class="import-export-wrapper" style="margin-top: 15px;">
|
||||
<p class="description" style="margin-bottom: 20px;">
|
||||
<strong>Hinweis:</strong> Hier kannst du alle deine Theme-Einstellungen sichern und wiederherstellen.
|
||||
</p>
|
||||
|
||||
<a href="<?php echo esc_url($export_url); ?>" class="button button-primary button-hero" id="export-settings-btn" style="display: inline-flex; align-items: center; gap: 8px; margin-bottom: 20px;">
|
||||
<span class="dashicons dashicons-download" style="margin-top:3px;"></span> Einstellungen Exportieren
|
||||
</a>
|
||||
|
||||
<div style="border-top: 2px solid #ddd; padding-top: 20px; margin-top: 20px;">
|
||||
<label style="display:block; margin-bottom:10px; font-weight:bold;">
|
||||
Backup wiederherstellen:
|
||||
</label>
|
||||
<input type="file" id="import-settings-file" accept=".json" style="width:100%; margin-bottom:10px;">
|
||||
<button type="button" class="button button-secondary" id="import-settings-btn" disabled style="display: inline-flex; align-items: center; gap: 8px;">
|
||||
<span class="dashicons dashicons-upload" style="margin-top:3px;"></span> Einstellungen Importieren
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="description" style="margin-top:15px; padding: 10px; background: #fff3cd; border-left: 4px solid #ffc107;">
|
||||
<strong>⚠️ Warnung:</strong> Beim Import werden alle aktuellen Einstellungen überschrieben!
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function($) {
|
||||
var ajaxUrl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
var nonce = '<?php echo $nonce; ?>';
|
||||
|
||||
$('#import-settings-file').on('change', function() {
|
||||
$('#import-settings-btn').prop('disabled', $(this).val() === '');
|
||||
});
|
||||
|
||||
$('#import-settings-btn').on('click', function() {
|
||||
var fileInput = $('#import-settings-file')[0];
|
||||
|
||||
if (fileInput.files.length === 0) {
|
||||
alert('Bitte wähle eine JSON-Datei aus.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!confirm('WARNUNG: Alle aktuellen Einstellungen werden überschrieben. Bist du sicher?')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('import_file', fileInput.files[0]);
|
||||
formData.append('action', 'import_theme_settings');
|
||||
formData.append('nonce', nonce);
|
||||
|
||||
var $btn = $(this);
|
||||
var originalText = $btn.html();
|
||||
$btn.prop('disabled', true).html('<span class="dashicons dashicons-update" style="margin-top:3px; animation: rotation 1s infinite linear;"></span> Importiere...');
|
||||
|
||||
$.ajax({
|
||||
url: ajaxUrl,
|
||||
type: 'POST',
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
alert('✅ ' + response.data);
|
||||
location.reload();
|
||||
} else {
|
||||
alert('❌ Fehler: ' + response.data);
|
||||
$btn.prop('disabled', false).html(originalText);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
alert('❌ Ein technischer Fehler ist aufgetreten.');
|
||||
$btn.prop('disabled', false).html(originalText);
|
||||
}
|
||||
});
|
||||
});
|
||||
})(jQuery);
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@keyframes rotation {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
</style>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
|
||||
$wp_customize->add_control( new Import_Export_Control( $wp_customize, 'import_export_placeholder', array(
|
||||
'section' => 'theme_mods_import_export',
|
||||
) ) );
|
||||
}
|
||||
add_action( 'customize_register', 'minecraft_modern_customize_register' );
|
||||
|
||||
@@ -289,7 +400,7 @@ function minecraft_modern_dynamic_css_output() {
|
||||
$slider_font = get_theme_mod( 'slider_font_family', 'Raleway' );
|
||||
$slider_color = get_theme_mod( 'slider_font_color', '#ffffff' );
|
||||
$slider_size_setting = get_theme_mod( 'slider_font_size', 'mittel' );
|
||||
$header_height_setting = get_theme_mod( 'header_height', 'mittel' ); // Diese Einstellung wird hier verwendet!
|
||||
$header_height_setting = get_theme_mod( 'header_height', 'mittel' );
|
||||
|
||||
// Header-Höhe umwandeln
|
||||
$header_height_value = '300px';
|
||||
@@ -329,10 +440,6 @@ function minecraft_modern_dynamic_css_output() {
|
||||
font-size: <?php echo esc_attr($chosen_sizes['subtitle']); ?>;
|
||||
}
|
||||
|
||||
/* =================================================================== */
|
||||
/* === NEU: Trennlinien mit der Akzentfarbe ========================= */
|
||||
/* =================================================================== */
|
||||
|
||||
/* Trennlinie unter dem Header */
|
||||
.site-header {
|
||||
border-bottom: 4px solid var(--primary-accent);
|
||||
@@ -347,7 +454,6 @@ function minecraft_modern_dynamic_css_output() {
|
||||
.site-footer {
|
||||
border-top: 4px solid var(--primary-accent);
|
||||
}
|
||||
|
||||
</style>
|
||||
<?php
|
||||
}
|
||||
|
||||
@@ -1,125 +1,125 @@
|
||||
<?php
|
||||
|
||||
// Exit if accessed directly.
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// === ZENTRALE VERSIONSKONSTANTE ===
|
||||
// Bitte passen Sie diese Version bei jedem Release an!
|
||||
define( 'MINECRAFT_MODERN_THEME_VERSION', '1.4' );
|
||||
|
||||
|
||||
// === THEME UPDATE NOTIFICATION SYSTEM ===
|
||||
|
||||
// Funktion zum Abrufen der neuesten Release-Informationen vom Git-Repository
|
||||
function minecraft_modern_get_latest_release_info() {
|
||||
$transient_key = 'minecraft_modern_latest_release';
|
||||
|
||||
// Versuche, die Daten aus dem Transient-Cache zu holen
|
||||
$release_info = get_transient($transient_key);
|
||||
|
||||
// Wenn der Cache leer oder abgelaufen ist, rufe neue Daten ab
|
||||
if (false === $release_info) {
|
||||
$response = wp_remote_get('https://git.viper.ipv64.net/api/v1/repos/M_Viper/Minecraft-Modern-Theme/releases/latest');
|
||||
|
||||
if (!is_wp_error($response) && 200 === wp_remote_retrieve_response_code($response)) {
|
||||
$body = wp_remote_retrieve_body($response);
|
||||
$release_data = json_decode($body, true);
|
||||
|
||||
if ($release_data && isset($release_data['tag_name'])) {
|
||||
$release_info = array(
|
||||
'version' => $release_data['tag_name'],
|
||||
'download_url' => $release_data['zipball_url'],
|
||||
'release_notes' => isset($release_data['body']) ? $release_data['body'] : '',
|
||||
'published_at' => isset($release_data['published_at']) ? $release_data['published_at'] : ''
|
||||
);
|
||||
|
||||
// Speichere die Daten für 12 Stunden im Cache
|
||||
set_transient($transient_key, $release_info, 12 * HOUR_IN_SECONDS);
|
||||
}
|
||||
} else {
|
||||
// Bei Fehler, leere Daten für 1 Stunde cachen, um wiederholte fehlgeschlagene Anfragen zu vermeiden
|
||||
set_transient($transient_key, array(), HOUR_IN_SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
return $release_info;
|
||||
}
|
||||
|
||||
// Funktion zum Anzeigen der Update-Benachrichtigung im Admin-Bereich
|
||||
function minecraft_modern_show_update_notification() {
|
||||
// Nur im Admin-Bereich und für Administratoren anzeigen
|
||||
if (!is_admin() || !current_user_can('manage_options')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Aktuelle Theme-Version abrufen (JETZT AUS UNSERER KONSTANTE)
|
||||
$current_version = MINECRAFT_MODERN_THEME_VERSION;
|
||||
|
||||
// Neueste Release-Informationen abrufen
|
||||
$latest_release = minecraft_modern_get_latest_release_info();
|
||||
|
||||
// Wenn wir gültige Release-Informationen haben und die Versionen unterschiedlich sind
|
||||
if (!empty($latest_release) && isset($latest_release['version']) && version_compare($current_version, $latest_release['version'], '<')) {
|
||||
?>
|
||||
<div class="notice notice-warning is-dismissible">
|
||||
<h3><?php _e('Minecraft Modern Theme Update Available', 'minecraft-modern-theme'); ?></h3>
|
||||
<p>
|
||||
<?php
|
||||
printf(
|
||||
__('You are using version %1$s of the Minecraft Modern Theme. Version %2$s is now available.', 'minecraft-modern-theme'),
|
||||
'<strong>' . esc_html($current_version) . '</strong>',
|
||||
'<strong>' . esc_html($latest_release['version']) . '</strong>'
|
||||
);
|
||||
?>
|
||||
</p>
|
||||
<p>
|
||||
<a href="<?php echo esc_url($latest_release['download_url']); ?>" class="button button-primary" target="_blank">
|
||||
<?php _e('Download Latest Version', 'minecraft-modern-theme'); ?>
|
||||
</a>
|
||||
<a href="https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme/releases" class="button" target="_blank">
|
||||
<?php _e('View Release Notes', 'minecraft-modern-theme'); ?>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
add_action('admin_notices', 'minecraft_modern_show_update_notification');
|
||||
|
||||
// Funktion zum Hinzufügen eines Update-Status-Widgets zum Dashboard
|
||||
function minecraft_modern_add_dashboard_widget() {
|
||||
wp_add_dashboard_widget(
|
||||
'minecraft_modern_update_widget', // Widget slug.
|
||||
'Minecraft Modern Theme Status', // Title.
|
||||
'minecraft_modern_update_widget_function' // Display function.
|
||||
);
|
||||
}
|
||||
add_action('wp_dashboard_setup', 'minecraft_modern_add_dashboard_widget');
|
||||
|
||||
// Funktion zum Anzeigen des Inhalts im Dashboard-Widget
|
||||
function minecraft_modern_update_widget_function() {
|
||||
// Aktuelle Theme-Version abrufen (JETZT AUS UNSERER KONSTANTE)
|
||||
$current_version = MINECRAFT_MODERN_THEME_VERSION;
|
||||
|
||||
// Neueste Release-Informationen abrufen
|
||||
$latest_release = minecraft_modern_get_latest_release_info();
|
||||
|
||||
echo '<p><strong>' . __('Current Version:', 'minecraft-modern-theme') . '</strong> ' . esc_html($current_version) . '</p>';
|
||||
|
||||
if (!empty($latest_release) && isset($latest_release['version'])) {
|
||||
if (version_compare($current_version, $latest_release['version'], '<')) {
|
||||
echo '<p><strong>' . __('Latest Version:', 'minecraft-modern-theme') . '</strong> <span style="color: #d63638;">' . esc_html($latest_release['version']) . '</span></p>';
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> <span style="color: #d63638;">' . __('Update Available', 'minecraft-modern-theme') . '</span></p>';
|
||||
echo '<p><a href="' . esc_url($latest_release['download_url']) . '" class="button button-primary" target="_blank">' . __('Download Update', 'minecraft-modern-theme') . '</a></p>';
|
||||
} else {
|
||||
echo '<p><strong>' . __('Latest Version:', 'minecraft-modern-theme') . '</strong> <span style="color: #46b450;">' . esc_html($latest_release['version']) . '</span></p>';
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> <span style="color: #46b450;">' . __('Up to Date', 'minecraft-modern-theme') . '</span></p>';
|
||||
}
|
||||
} else {
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> ' . __('Unable to check for updates', 'minecraft-modern-theme') . '</p>';
|
||||
}
|
||||
|
||||
echo '<p><a href="https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme/releases" target="_blank">' . __('View All Releases', 'minecraft-modern-theme') . '</a></p>';
|
||||
<?php
|
||||
|
||||
// Exit if accessed directly.
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// === ZENTRALE VERSIONSKONSTANTE ===
|
||||
// Bitte passen Sie diese Version bei jedem Release an!
|
||||
define( 'MINECRAFT_MODERN_THEME_VERSION', '1.5' );
|
||||
|
||||
|
||||
// === THEME UPDATE NOTIFICATION SYSTEM ===
|
||||
|
||||
// Funktion zum Abrufen der neuesten Release-Informationen vom Git-Repository
|
||||
function minecraft_modern_get_latest_release_info() {
|
||||
$transient_key = 'minecraft_modern_latest_release';
|
||||
|
||||
// Versuche, die Daten aus dem Transient-Cache zu holen
|
||||
$release_info = get_transient($transient_key);
|
||||
|
||||
// Wenn der Cache leer oder abgelaufen ist, rufe neue Daten ab
|
||||
if (false === $release_info) {
|
||||
$response = wp_remote_get('https://git.viper.ipv64.net/api/v1/repos/M_Viper/Minecraft-Modern-Theme/releases/latest');
|
||||
|
||||
if (!is_wp_error($response) && 200 === wp_remote_retrieve_response_code($response)) {
|
||||
$body = wp_remote_retrieve_body($response);
|
||||
$release_data = json_decode($body, true);
|
||||
|
||||
if ($release_data && isset($release_data['tag_name'])) {
|
||||
$release_info = array(
|
||||
'version' => $release_data['tag_name'],
|
||||
'download_url' => $release_data['zipball_url'],
|
||||
'release_notes' => isset($release_data['body']) ? $release_data['body'] : '',
|
||||
'published_at' => isset($release_data['published_at']) ? $release_data['published_at'] : ''
|
||||
);
|
||||
|
||||
// Speichere die Daten für 12 Stunden im Cache
|
||||
set_transient($transient_key, $release_info, 12 * HOUR_IN_SECONDS);
|
||||
}
|
||||
} else {
|
||||
// Bei Fehler, leere Daten für 1 Stunde cachen, um wiederholte fehlgeschlagene Anfragen zu vermeiden
|
||||
set_transient($transient_key, array(), HOUR_IN_SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
return $release_info;
|
||||
}
|
||||
|
||||
// Funktion zum Anzeigen der Update-Benachrichtigung im Admin-Bereich
|
||||
function minecraft_modern_show_update_notification() {
|
||||
// Nur im Admin-Bereich und für Administratoren anzeigen
|
||||
if (!is_admin() || !current_user_can('manage_options')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Aktuelle Theme-Version abrufen (JETZT AUS UNSERER KONSTANTE)
|
||||
$current_version = MINECRAFT_MODERN_THEME_VERSION;
|
||||
|
||||
// Neueste Release-Informationen abrufen
|
||||
$latest_release = minecraft_modern_get_latest_release_info();
|
||||
|
||||
// Wenn wir gültige Release-Informationen haben und die Versionen unterschiedlich sind
|
||||
if (!empty($latest_release) && isset($latest_release['version']) && version_compare($current_version, $latest_release['version'], '<')) {
|
||||
?>
|
||||
<div class="notice notice-warning is-dismissible">
|
||||
<h3><?php _e('Minecraft Modern Theme Update Available', 'minecraft-modern-theme'); ?></h3>
|
||||
<p>
|
||||
<?php
|
||||
printf(
|
||||
__('You are using version %1$s of the Minecraft Modern Theme. Version %2$s is now available.', 'minecraft-modern-theme'),
|
||||
'<strong>' . esc_html($current_version) . '</strong>',
|
||||
'<strong>' . esc_html($latest_release['version']) . '</strong>'
|
||||
);
|
||||
?>
|
||||
</p>
|
||||
<p>
|
||||
<a href="<?php echo esc_url($latest_release['download_url']); ?>" class="button button-primary" target="_blank">
|
||||
<?php _e('Download Latest Version', 'minecraft-modern-theme'); ?>
|
||||
</a>
|
||||
<a href="https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme/releases" class="button" target="_blank">
|
||||
<?php _e('View Release Notes', 'minecraft-modern-theme'); ?>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
add_action('admin_notices', 'minecraft_modern_show_update_notification');
|
||||
|
||||
// Funktion zum Hinzufügen eines Update-Status-Widgets zum Dashboard
|
||||
function minecraft_modern_add_dashboard_widget() {
|
||||
wp_add_dashboard_widget(
|
||||
'minecraft_modern_update_widget', // Widget slug.
|
||||
'Minecraft Modern Theme Status', // Title.
|
||||
'minecraft_modern_update_widget_function' // Display function.
|
||||
);
|
||||
}
|
||||
add_action('wp_dashboard_setup', 'minecraft_modern_add_dashboard_widget');
|
||||
|
||||
// Funktion zum Anzeigen des Inhalts im Dashboard-Widget
|
||||
function minecraft_modern_update_widget_function() {
|
||||
// Aktuelle Theme-Version abrufen (JETZT AUS UNSERER KONSTANTE)
|
||||
$current_version = MINECRAFT_MODERN_THEME_VERSION;
|
||||
|
||||
// Neueste Release-Informationen abrufen
|
||||
$latest_release = minecraft_modern_get_latest_release_info();
|
||||
|
||||
echo '<p><strong>' . __('Current Version:', 'minecraft-modern-theme') . '</strong> ' . esc_html($current_version) . '</p>';
|
||||
|
||||
if (!empty($latest_release) && isset($latest_release['version'])) {
|
||||
if (version_compare($current_version, $latest_release['version'], '<')) {
|
||||
echo '<p><strong>' . __('Latest Version:', 'minecraft-modern-theme') . '</strong> <span style="color: #d63638;">' . esc_html($latest_release['version']) . '</span></p>';
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> <span style="color: #d63638;">' . __('Update Available', 'minecraft-modern-theme') . '</span></p>';
|
||||
echo '<p><a href="' . esc_url($latest_release['download_url']) . '" class="button button-primary" target="_blank">' . __('Download Update', 'minecraft-modern-theme') . '</a></p>';
|
||||
} else {
|
||||
echo '<p><strong>' . __('Latest Version:', 'minecraft-modern-theme') . '</strong> <span style="color: #46b450;">' . esc_html($latest_release['version']) . '</span></p>';
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> <span style="color: #46b450;">' . __('Up to Date', 'minecraft-modern-theme') . '</span></p>';
|
||||
}
|
||||
} else {
|
||||
echo '<p><strong>' . __('Status:', 'minecraft-modern-theme') . '</strong> ' . __('Unable to check for updates', 'minecraft-modern-theme') . '</p>';
|
||||
}
|
||||
|
||||
echo '<p><a href="https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme/releases" target="_blank">' . __('View All Releases', 'minecraft-modern-theme') . '</a></p>';
|
||||
}
|
||||
@@ -73,7 +73,7 @@ a:hover { color: #fff; }
|
||||
.site-header {
|
||||
background-color: var(--header-bg);
|
||||
backdrop-filter: blur(10px);
|
||||
padding: 15px 0;
|
||||
padding: 30px 0; /* FIX: Mehr vertikaler Platz im Header */
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1000;
|
||||
@@ -87,10 +87,15 @@ a:hover { color: #fff; }
|
||||
.header-main {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
gap: 120px; /* Gleichmäßiger Abstand zwischen den Elementen */
|
||||
justify-content: space-between; /* FIX: Logo Links, Menü Mitte, Info Rechts */
|
||||
gap: 40px; /* Flexiblerer Abstand */
|
||||
}
|
||||
|
||||
/* WICHTIG: Typo im Header.html korrigieren!
|
||||
HTML: <div class="site-branding">
|
||||
CSS: .site-branding
|
||||
Sie müssen die 'g' im HTML oder CSS angleichen, sonst ist das Layout kaputt.
|
||||
*/
|
||||
.site-branding {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -117,12 +122,13 @@ a:hover { color: #fff; }
|
||||
/* === NEUE DROPDOWN NAVIGATION ======================================= */
|
||||
/* =================================================================== */
|
||||
|
||||
.main-navigation {
|
||||
#site-navigation {
|
||||
position: relative;
|
||||
flex-grow: 1;
|
||||
flex-grow: 1; /* FIX: Navigation nimmt den gesamten Platz in der Mitte ein */
|
||||
display: flex;
|
||||
justify-content: center; /* Zentriert das Menü */
|
||||
justify-content: center; /* Zentriert das Menü innerhalb seines Raums */
|
||||
align-items: center;
|
||||
padding: 0 30px; /* Mindestabstand zu Logo und Socials */
|
||||
}
|
||||
|
||||
/* Hauptliste (Top Level) */
|
||||
@@ -132,7 +138,7 @@ a:hover { color: #fff; }
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
gap: 25px;
|
||||
gap: 20px; /* Abstand zwischen Menüpunkten horizontal */
|
||||
}
|
||||
|
||||
/* Menüpunkte */
|
||||
@@ -142,12 +148,12 @@ a:hover { color: #fff; }
|
||||
|
||||
/* Links in der Navigation */
|
||||
.main-navigation a {
|
||||
display: block;
|
||||
display: inline-block;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: var(--text-muted);
|
||||
text-decoration: none;
|
||||
padding: 10px 0;
|
||||
padding: 20px 0; /* FIX: Mehr vertikaler Platz (Oben/Unten) ohne horizontales Padding */
|
||||
transition: color 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
@@ -209,6 +215,12 @@ a:hover { color: #fff; }
|
||||
border-bottom: 1px solid rgba(255,255,255,0.05);
|
||||
font-size: 14px;
|
||||
white-space: nowrap;
|
||||
|
||||
/* FIX: Vollständige Hintergrund-Markierung */
|
||||
display: block;
|
||||
width: 100%;
|
||||
box-sizing: border-box; /* Padding wird zur Breite hinzugezählt */
|
||||
transition: background-color 0.2s ease, color 0.2s ease, padding-left 0.2s ease;
|
||||
}
|
||||
|
||||
.sub-menu li:last-child a {
|
||||
@@ -658,7 +670,7 @@ html.light-mode .icon-sun { opacity: 1; }
|
||||
}
|
||||
.faq-answer p { margin-bottom: 20px; font-size: 0.9rem; }
|
||||
.faq-item.active .faq-answer {
|
||||
padding: 0 20px 20px 20px;
|
||||
padding: 0 20px 20px;
|
||||
max-height: 1000px;
|
||||
transition: max-height 0.4s ease-in, padding 0.4s ease-in;
|
||||
}
|
||||
@@ -881,7 +893,7 @@ main#primary.site-main {
|
||||
|
||||
.site-branding { flex-grow: 1; }
|
||||
.header-info { order: 2; } /* Social rechts */
|
||||
.main-navigation { order: 3; width: 100%; }
|
||||
#site-navigation { order: 3; width: 100%; }
|
||||
|
||||
.menu-toggle {
|
||||
display: block;
|
||||
@@ -902,13 +914,13 @@ main#primary.site-main {
|
||||
}
|
||||
|
||||
/* Wenn .toggled aktiv ist, zeigen */
|
||||
.main-navigation.toggled .primary-menu {
|
||||
#site-navigation.toggled .primary-menu {
|
||||
display: flex;
|
||||
animation: slideDown 0.3s ease forwards;
|
||||
}
|
||||
|
||||
.menu-item { width: 100%; text-align: left; }
|
||||
.main-navigation a { padding: 15px 20px; }
|
||||
#site-navigation a { padding: 15px 20px; }
|
||||
|
||||
/* Submenus mobil - Akkordeon Style */
|
||||
.sub-menu {
|
||||
@@ -949,8 +961,8 @@ main#primary.site-main {
|
||||
.custom-logo-link img, .custom-logo { max-height: 50px; }
|
||||
|
||||
/* Hero */
|
||||
.hero-title, .slider-title { font-size: 32px; }
|
||||
.hero-subtitle, .slider-subtitle { font-size: 18px; }
|
||||
.slider-title { font-size: 32px; }
|
||||
.slider-subtitle { font-size: 18px; }
|
||||
.hero-buttons a { display: block; margin: 10px auto; width: 80%; }
|
||||
|
||||
/* Footer Responsive */
|
||||
|
||||
Reference in New Issue
Block a user