12 Commits
10 changed files with 4333 additions and 4113 deletions
-1
View File
@@ -6,7 +6,6 @@
<div class="faq-archive-container"> <div class="faq-archive-container">
<header class="page-header"> <header class="page-header">
<h1 class="page-title"><?php _e( 'Häufig gestellte Fragen (FAQ)', 'minecraft-modern-theme' ); ?></h1>
<p><?php _e( 'Wählen Sie eine Kategorie, um die passenden Fragen zu sehen.', 'minecraft-modern-theme' ); ?></p> <p><?php _e( 'Wählen Sie eine Kategorie, um die passenden Fragen zu sehen.', 'minecraft-modern-theme' ); ?></p>
</header> </header>
-1
View File
@@ -5,7 +5,6 @@
<div class="team-archive-container"> <div class="team-archive-container">
<header class="page-header"> <header class="page-header">
<h1 class="page-title">Unser Team</h1>
<p class="page-description">Lerne die Leute kennen, die diesen Server am Laufen halten.</p> <p class="page-description">Lerne die Leute kennen, die diesen Server am Laufen halten.</p>
</header> </header>
-5
View File
@@ -8,11 +8,9 @@
<?php <?php
if ( is_category() ) { if ( is_category() ) {
echo '<div class="archive-type-badge"><i class="fas fa-folder-open"></i> ' . __('Kategorie', 'minecraft-modern-theme') . '</div>'; echo '<div class="archive-type-badge"><i class="fas fa-folder-open"></i> ' . __('Kategorie', 'minecraft-modern-theme') . '</div>';
the_archive_title( '<h1 class="archive-title">', '</h1>' );
the_archive_description( '<div class="archive-description">', '</div>' ); the_archive_description( '<div class="archive-description">', '</div>' );
} elseif ( is_tag() ) { } elseif ( is_tag() ) {
echo '<div class="archive-type-badge"><i class="fas fa-hashtag"></i> ' . __('Tag', 'minecraft-modern-theme') . '</div>'; echo '<div class="archive-type-badge"><i class="fas fa-hashtag"></i> ' . __('Tag', 'minecraft-modern-theme') . '</div>';
the_archive_title( '<h1 class="archive-title">', '</h1>' );
the_archive_description( '<div class="archive-description">', '</div>' ); the_archive_description( '<div class="archive-description">', '</div>' );
} elseif ( is_author() ) { } elseif ( is_author() ) {
$author = get_queried_object(); $author = get_queried_object();
@@ -21,7 +19,6 @@
<div class="archive-author-header"> <div class="archive-author-header">
<?php echo get_avatar( $author->ID, 80, '', '', array('class' => 'archive-author-avatar') ); ?> <?php echo get_avatar( $author->ID, 80, '', '', array('class' => 'archive-author-avatar') ); ?>
<div> <div>
<h1 class="archive-title"><?php echo esc_html( $author->display_name ); ?></h1>
<?php if ( $author->description ) : ?> <?php if ( $author->description ) : ?>
<p class="archive-description"><?php echo esc_html( $author->description ); ?></p> <p class="archive-description"><?php echo esc_html( $author->description ); ?></p>
<?php endif; ?> <?php endif; ?>
@@ -30,9 +27,7 @@
<?php <?php
} elseif ( is_date() ) { } elseif ( is_date() ) {
echo '<div class="archive-type-badge"><i class="fas fa-calendar"></i> ' . __('Archiv', 'minecraft-modern-theme') . '</div>'; echo '<div class="archive-type-badge"><i class="fas fa-calendar"></i> ' . __('Archiv', 'minecraft-modern-theme') . '</div>';
the_archive_title( '<h1 class="archive-title">', '</h1>' );
} else { } else {
the_archive_title( '<h1 class="archive-title">', '</h1>' );
the_archive_description( '<div class="archive-description">', '</div>' ); the_archive_description( '<div class="archive-description">', '</div>' );
} }
?> ?>
+85
View File
@@ -1353,6 +1353,9 @@ function mm_team_manager_page_html() {
<button type="submit" class="button button-primary button-large" style="width:100%;">Hinzufügen</button> <button type="submit" class="button button-primary button-large" style="width:100%;">Hinzufügen</button>
</div> </div>
</form> </form>
<button id="save-order-btn" class="button button-primary" style="margin-top:16px;float:right;">Reihenfolge speichern</button>
<div id="order-save-msg" style="margin-top:16px;float:left;color:green;display:none;">Reihenfolge gespeichert!</div>
<div style="clear:both;"></div>
</div> </div>
<div class="card" style="background:#fff;padding:20px;"> <div class="card" style="background:#fff;padding:20px;">
@@ -1562,11 +1565,49 @@ function mm_team_manager_page_html() {
$('.sort-up').on('click', function() { var r = $(this).closest('tr'), p = r.prev('tr'); if (p.length) r.insertBefore(p); }); $('.sort-up').on('click', function() { var r = $(this).closest('tr'), p = r.prev('tr'); if (p.length) r.insertBefore(p); });
$('.sort-down').on('click', function() { var r = $(this).closest('tr'), n = r.next('tr'); if (n.length) r.insertAfter(n); }); $('.sort-down').on('click', function() { var r = $(this).closest('tr'), n = r.next('tr'); if (n.length) r.insertAfter(n); });
// Reihenfolge speichern
$('#save-order-btn').on('click', function() {
var ids = [];
$('#team-list-body tr').each(function(){ ids.push($(this).data('id')); });
var btn = $(this);
btn.prop('disabled', true).text('Speichern...');
$('#order-save-msg').hide();
$.post(ajaxurl, {
action: 'mm_save_team_order',
ids: ids,
nonce: '<?php echo wp_create_nonce( 'mm_team_nonce' ); ?>'
}, function(r) {
btn.prop('disabled', false).text('Reihenfolge speichern');
if(r.success){
$('#order-save-msg').fadeIn().delay(1200).fadeOut();
} else {
alert('Fehler beim Speichern der Reihenfolge!');
}
});
});
}); });
</script> </script>
<?php <?php
} }
// AJAX-Handler für Reihenfolge speichern
add_action( 'wp_ajax_mm_save_team_order', 'handle_mm_save_team_order' );
function handle_mm_save_team_order() {
check_ajax_referer( 'mm_team_nonce', 'nonce' );
if ( ! current_user_can( 'edit_posts' ) ) wp_send_json_error( 'Keine Berechtigung' );
if ( empty( $_POST['ids'] ) ) {
wp_send_json_error( 'Keine IDs' );
}
$ids = is_array($_POST['ids']) ? $_POST['ids'] : explode(',', $_POST['ids']);
$ids = array_map('intval', $ids);
$pos = 0;
foreach ( $ids as $id ) {
wp_update_post( array( 'ID' => $id, 'menu_order' => $pos ) );
$pos++;
}
wp_send_json_success();
}
add_action( 'wp_ajax_mm_add_team_member', 'handle_mm_add_member' ); add_action( 'wp_ajax_mm_add_team_member', 'handle_mm_add_member' );
function handle_mm_add_member() { function handle_mm_add_member() {
@@ -3581,9 +3622,35 @@ function mm_bewerbung_customizer( $wp_customize ) {
'type' => 'number', 'type' => 'number',
'input_attrs' => array( 'min' => 0, 'max' => 99 ), 'input_attrs' => array( 'min' => 0, 'max' => 99 ),
) ); ) );
// ── Positionen ──
$wp_customize->add_setting( 'mm_bewerbung_positionen', array(
'default' => "Moderator
Supporter
Builder
Developer",
'sanitize_callback' => 'sanitize_textarea_field',
) );
$wp_customize->add_control( 'mm_bewerbung_positionen', array(
'label' => __( 'Bewerbungs-Positionen', 'minecraft-modern-theme' ),
'description' => __( 'Eine Position pro Zeile. Der Bewerber wählt genau eine davon aus.', 'minecraft-modern-theme' ),
'section' => 'mm_bewerbung_section',
'type' => 'textarea',
) );
} }
add_action( 'customize_register', 'mm_bewerbung_customizer' ); add_action( 'customize_register', 'mm_bewerbung_customizer' );
// Hilfsfunktion: Positions-Liste als Array zurückgeben
function mm_bewerbung_get_positionen() {
$raw = get_theme_mod( 'mm_bewerbung_positionen', "Moderator
Supporter
Builder
Developer" );
$list = array_filter( array_map( 'trim', explode( "
", $raw ) ) );
return array_values( $list );
}
// --- 2. Custom Post Type: Bewerbung --- // --- 2. Custom Post Type: Bewerbung ---
function mm_register_bewerbung_cpt() { function mm_register_bewerbung_cpt() {
@@ -3633,6 +3700,7 @@ function mm_bewerbung_meta_box_html( $post ) {
'_mm_bew_mc_name' => __( 'Minecraft Username', 'minecraft-modern-theme' ), '_mm_bew_mc_name' => __( 'Minecraft Username', 'minecraft-modern-theme' ),
'_mm_bew_discord' => __( 'Discord Username', 'minecraft-modern-theme' ), '_mm_bew_discord' => __( 'Discord Username', 'minecraft-modern-theme' ),
'_mm_bew_alter' => __( 'Alter', 'minecraft-modern-theme' ), '_mm_bew_alter' => __( 'Alter', 'minecraft-modern-theme' ),
'_mm_bew_position' => __( 'Bewirbt sich als', 'minecraft-modern-theme' ),
'_mm_bew_warum' => __( 'Warum möchtest du mitspielen?', 'minecraft-modern-theme' ), '_mm_bew_warum' => __( 'Warum möchtest du mitspielen?', 'minecraft-modern-theme' ),
'_mm_bew_erfahrung' => __( 'Erfahrung / Vorstellung', 'minecraft-modern-theme' ), '_mm_bew_erfahrung' => __( 'Erfahrung / Vorstellung', 'minecraft-modern-theme' ),
'_mm_bew_datum' => __( 'Eingereicht am', 'minecraft-modern-theme' ), '_mm_bew_datum' => __( 'Eingereicht am', 'minecraft-modern-theme' ),
@@ -3703,6 +3771,7 @@ function mm_bewerbung_columns( $cols ) {
'mc_name' => __( 'Minecraft', 'minecraft-modern-theme' ), 'mc_name' => __( 'Minecraft', 'minecraft-modern-theme' ),
'discord' => __( 'Discord', 'minecraft-modern-theme' ), 'discord' => __( 'Discord', 'minecraft-modern-theme' ),
'alter' => __( 'Alter', 'minecraft-modern-theme' ), 'alter' => __( 'Alter', 'minecraft-modern-theme' ),
'position' => __( 'Position', 'minecraft-modern-theme' ),
'status' => __( 'Status', 'minecraft-modern-theme' ), 'status' => __( 'Status', 'minecraft-modern-theme' ),
'datum' => __( 'Eingereicht', 'minecraft-modern-theme' ), 'datum' => __( 'Eingereicht', 'minecraft-modern-theme' ),
); );
@@ -3737,6 +3806,15 @@ function mm_bewerbung_column_content( $col, $post_id ) {
case 'alter': case 'alter':
echo esc_html( get_post_meta($post_id, '_mm_bew_alter', true) ); echo esc_html( get_post_meta($post_id, '_mm_bew_alter', true) );
break; break;
case 'position':
$pos = get_post_meta($post_id, '_mm_bew_position', true);
if ( $pos ) {
echo '<span style="background:#1e3a5f;color:#58a6ff;padding:2px 10px;border-radius:12px;font-size:12px;font-weight:600;">'
. esc_html($pos) . '</span>';
} else {
echo '<span style="color:#999;">—</span>';
}
break;
case 'status': case 'status':
$s = get_post_meta($post_id, '_mm_bew_status', true) ?: 'neu'; $s = get_post_meta($post_id, '_mm_bew_status', true) ?: 'neu';
$color = isset($status_colors[$s]) ? $status_colors[$s] : '#0073aa'; $color = isset($status_colors[$s]) ? $status_colors[$s] : '#0073aa';
@@ -3768,10 +3846,16 @@ function mm_submit_bewerbung() {
$warum = sanitize_textarea_field( $_POST['warum'] ?? '' ); $warum = sanitize_textarea_field( $_POST['warum'] ?? '' );
$erfahrung = sanitize_textarea_field( $_POST['erfahrung'] ?? '' ); $erfahrung = sanitize_textarea_field( $_POST['erfahrung'] ?? '' );
$position = sanitize_text_field( $_POST['position'] ?? '' );
$positionen = mm_bewerbung_get_positionen();
$errors = array(); $errors = array();
if ( empty($mc_name) ) $errors[] = __('Minecraft Username ist erforderlich.', 'minecraft-modern-theme'); if ( empty($mc_name) ) $errors[] = __('Minecraft Username ist erforderlich.', 'minecraft-modern-theme');
if ( empty($discord) ) $errors[] = __('Discord Username ist erforderlich.', 'minecraft-modern-theme'); if ( empty($discord) ) $errors[] = __('Discord Username ist erforderlich.', 'minecraft-modern-theme');
if ( $alter_raw < 1 ) $errors[] = __('Bitte gib dein Alter an.', 'minecraft-modern-theme'); if ( $alter_raw < 1 ) $errors[] = __('Bitte gib dein Alter an.', 'minecraft-modern-theme');
if ( ! empty($positionen) && ! in_array($position, $positionen, true) ) {
$errors[] = __('Bitte wähle eine gültige Position aus.', 'minecraft-modern-theme');
}
if ( empty($warum) ) $errors[] = __('Bitte erkläre warum du mitspielen möchtest.', 'minecraft-modern-theme'); if ( empty($warum) ) $errors[] = __('Bitte erkläre warum du mitspielen möchtest.', 'minecraft-modern-theme');
if ( empty($erfahrung) ) $errors[] = __('Bitte stell dich kurz vor.', 'minecraft-modern-theme'); if ( empty($erfahrung) ) $errors[] = __('Bitte stell dich kurz vor.', 'minecraft-modern-theme');
@@ -3815,6 +3899,7 @@ function mm_submit_bewerbung() {
update_post_meta( $post_id, '_mm_bew_mc_name', $mc_name ); update_post_meta( $post_id, '_mm_bew_mc_name', $mc_name );
update_post_meta( $post_id, '_mm_bew_discord', $discord ); update_post_meta( $post_id, '_mm_bew_discord', $discord );
update_post_meta( $post_id, '_mm_bew_alter', $alter_raw ); update_post_meta( $post_id, '_mm_bew_alter', $alter_raw );
update_post_meta( $post_id, '_mm_bew_position', $position );
update_post_meta( $post_id, '_mm_bew_warum', $warum ); update_post_meta( $post_id, '_mm_bew_warum', $warum );
update_post_meta( $post_id, '_mm_bew_erfahrung', $erfahrung ); update_post_meta( $post_id, '_mm_bew_erfahrung', $erfahrung );
update_post_meta( $post_id, '_mm_bew_status', 'neu' ); update_post_meta( $post_id, '_mm_bew_status', 'neu' );
+28
View File
@@ -84,6 +84,32 @@
</div><!-- .bew-grid --> </div><!-- .bew-grid -->
<!-- Bewirbt sich als -->
<?php
$positionen = mm_bewerbung_get_positionen();
if ( ! empty( $positionen ) ) :
?>
<div class="bew-field">
<label class="bew-label">
<i class="fas fa-briefcase"></i>
<?php _e('Bewirbt sich als', 'minecraft-modern-theme'); ?>
<span class="bew-required">*</span>
</label>
<div class="bew-position-grid">
<?php foreach ( $positionen as $pos ) : ?>
<label class="bew-position-card">
<input type="radio" name="position" value="<?php echo esc_attr( $pos ); ?>" required>
<span class="bew-position-label">
<i class="fas fa-shield-alt"></i>
<?php echo esc_html( $pos ); ?>
</span>
</label>
<?php endforeach; ?>
</div>
<p class="bew-hint"><?php _e('Wähle die Position für die du dich bewirbst.', 'minecraft-modern-theme'); ?></p>
</div>
<?php endif; ?>
<!-- Warum mitspielen --> <!-- Warum mitspielen -->
<div class="bew-field"> <div class="bew-field">
<label for="bew_warum" class="bew-label"> <label for="bew_warum" class="bew-label">
@@ -199,9 +225,11 @@ document.addEventListener('DOMContentLoaded', function() {
var data = new FormData(); var data = new FormData();
data.append('action', 'mm_submit_bewerbung'); data.append('action', 'mm_submit_bewerbung');
data.append('nonce', nonce.value); data.append('nonce', nonce.value);
var positionEl = document.querySelector('input[name="position"]:checked');
data.append('mc_name', document.getElementById('bew_mc_name').value.trim()); data.append('mc_name', document.getElementById('bew_mc_name').value.trim());
data.append('discord', document.getElementById('bew_discord').value.trim()); data.append('discord', document.getElementById('bew_discord').value.trim());
data.append('alter', document.getElementById('bew_alter').value.trim()); data.append('alter', document.getElementById('bew_alter').value.trim());
data.append('position', positionEl ? positionEl.value : '');
data.append('warum', document.getElementById('bew_warum').value.trim()); data.append('warum', document.getElementById('bew_warum').value.trim());
data.append('erfahrung', document.getElementById('bew_erfahrung').value.trim()); data.append('erfahrung', document.getElementById('bew_erfahrung').value.trim());
-1
View File
@@ -6,7 +6,6 @@
<?php while ( have_posts() ) : the_post(); ?> <?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class('page-content'); ?>> <article id="post-<?php the_ID(); ?>" <?php post_class('page-content'); ?>>
<div class="page-content-inner"> <div class="page-content-inner">
<h1 class="page-title"><?php the_title(); ?></h1>
<div class="page-entry"> <div class="page-entry">
<?php the_content(); ?> <?php the_content(); ?>
</div> </div>
-8
View File
@@ -8,14 +8,6 @@
<div class="archive-type-badge"> <div class="archive-type-badge">
<i class="fas fa-search"></i> <?php _e('Suchergebnisse', 'minecraft-modern-theme'); ?> <i class="fas fa-search"></i> <?php _e('Suchergebnisse', 'minecraft-modern-theme'); ?>
</div> </div>
<h1 class="archive-title">
<?php
printf(
__('Ergebnisse für: <span class="search-query">%s</span>', 'minecraft-modern-theme'),
'<em>' . esc_html( get_search_query() ) . '</em>'
);
?>
</h1>
<?php global $wp_query; ?> <?php global $wp_query; ?>
<p class="search-result-count"> <p class="search-result-count">
<?php printf( <?php printf(
-1
View File
@@ -5,7 +5,6 @@
<article id="post-<?php the_ID(); ?>" <?php post_class('post single-faq'); ?>> <article id="post-<?php the_ID(); ?>" <?php post_class('post single-faq'); ?>>
<header class="entry-header"> <header class="entry-header">
<h1 class="entry-title"><?php the_title(); ?></h1>
<a href="<?php echo get_post_type_archive_link('faq'); ?>" class="back-to-faq">&larr; <?php _e( 'Zurück zur Übersicht', 'minecraft-modern-theme' ); ?></a> <a href="<?php echo get_post_type_archive_link('faq'); ?>" class="back-to-faq">&larr; <?php _e( 'Zurück zur Übersicht', 'minecraft-modern-theme' ); ?></a>
</header> </header>
<div class="entry-content"> <div class="entry-content">
-1
View File
@@ -50,7 +50,6 @@ $layout_class = $has_sidebar
</nav> </nav>
<?php endif; ?> <?php endif; ?>
<h1 class="post-title"><?php the_title(); ?></h1>
<div class="post-meta"> <div class="post-meta">
<span class="post-meta-item post-author"> <span class="post-meta-item post-author">
+126 -1
View File
@@ -4,7 +4,7 @@ Theme URI: https://git.viper.ipv64.net/M_Viper/Minecraft-Modern-Theme
Author: M_Viper Author: M_Viper
Description: Ein modernes Gaming-Theme mit konfigurierbarem Header-Slider. Description: Ein modernes Gaming-Theme mit konfigurierbarem Header-Slider.
Author URI: https://M-Viper.de Author URI: https://M-Viper.de
Version: 2.1 Version: 2.3
License: GNU General Public License v2 or later License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: minecraft-modern-theme Text Domain: minecraft-modern-theme
@@ -4713,3 +4713,128 @@ html.light-mode .bew-mc-avatar { background: #f0f0f0; }
.bew-grid { grid-template-columns: 1fr; } .bew-grid { grid-template-columns: 1fr; }
.bewerbung-container .page-title { font-size: 1.8rem; } .bewerbung-container .page-title { font-size: 1.8rem; }
} }
/* ── Bewerbungs-Positionen ── */
.bew-position-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 12px;
margin-top: 8px;
}
.bew-position-card {
cursor: pointer;
display: block;
}
.bew-position-card input[type="radio"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.bew-position-label {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 16px 12px;
border: 2px solid var(--border-color, #30363d);
border-radius: 10px;
background: var(--card-bg, #161b22);
color: var(--text-color, #c9d1d9);
font-weight: 600;
font-size: 14px;
text-align: center;
transition: border-color 0.2s, background 0.2s, color 0.2s, box-shadow 0.2s;
}
.bew-position-label i {
font-size: 22px;
color: var(--primary-accent, #00d4e8);
transition: transform 0.2s;
}
.bew-position-card:hover .bew-position-label {
border-color: var(--primary-accent, #00d4e8);
background: rgba(0, 212, 232, 0.07);
}
.bew-position-card input[type="radio"]:checked + .bew-position-label {
border-color: var(--primary-accent, #00d4e8);
background: rgba(0, 212, 232, 0.12);
color: var(--primary-accent, #00d4e8);
box-shadow: 0 0 0 3px rgba(0, 212, 232, 0.18), 0 4px 16px rgba(0, 212, 232, 0.15);
}
.bew-position-card input[type="radio"]:checked + .bew-position-label i {
transform: scale(1.2);
}
/* Light Mode */
html.light-mode .bew-position-label {
background: #f4f4f4;
border-color: #ddd;
color: #333;
}
html.light-mode .bew-position-card input[type="radio"]:checked + .bew-position-label {
background: rgba(0, 212, 232, 0.1);
color: #007a8c;
}
/* Responsive */
@media (max-width: 500px) {
.bew-position-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* ══════════════════════════════════════════════════════════════
FIX: Dropdown-Sichtbarkeit im Centered-Layout (Logo oben, Menü darunter)
Das .header-row-nav muss overflow:visible haben damit das Sub-Menu
sichtbar aus dem Header herausragen kann.
══════════════════════════════════════════════════════════════ */
/* Zeilen-Container darf das Dropdown nicht abschneiden */
.site-header--centered,
.site-header--centered .container,
.site-header--classic,
.site-header--classic .container,
.header-row-nav,
.header-centered-nav {
overflow: visible !important;
}
/* Nav-Zeile braucht position:relative als Ankerpunkt für das Dropdown */
.header-row-nav {
position: relative;
}
/* Jedes Menü-Item ist der Ankerpunkt für sein Sub-Menu */
.header-row-nav .menu-item-has-children,
.header-centered-nav .menu-item-has-children,
.site-header--centered .menu-item-has-children,
.site-header--classic .menu-item-has-children {
position: relative;
}
/* Sub-Menu öffnet sich direkt unterhalb des Menüpunkts */
.header-row-nav .sub-menu,
.header-centered-nav .sub-menu,
.site-header--centered .sub-menu,
.site-header--classic .sub-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 99999;
}
/* Hover-State: Dropdown einblenden */
.header-row-nav .menu-item-has-children:hover > .sub-menu,
.header-centered-nav .menu-item-has-children:hover > .sub-menu,
.site-header--centered .menu-item-has-children:hover > .sub-menu,
.site-header--classic .menu-item-has-children:hover > .sub-menu {
opacity: 1;
visibility: visible;
transform: translateY(10px);
}