3 Commits
2.3 ... main

Author SHA1 Message Date
Git Manager GUI
3d0c7ce557 Upload via Git Manager GUI 2026-05-11 09:52:23 +02:00
Git Manager GUI
acb12a15bf Upload via Git Manager GUI 2026-05-11 09:52:14 +02:00
Git Manager GUI
287ee0da24 Upload via Git Manager GUI 2026-05-11 09:51:36 +02:00
3 changed files with 4332 additions and 4135 deletions

View File

@@ -3622,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() {
@@ -3674,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' ),
@@ -3744,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' ),
); );
@@ -3778,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';
@@ -3809,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');
@@ -3856,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' );

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());

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.2 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);
}