/** * 1. Theme-Supports */ add_theme_support('avia_conditionals_for_mega_menu'); add_theme_support('avia_template_builder_custom_css'); /** * Hilfsfunktion: sichere Logout-URL mit Nonce bauen */ function ml_build_logout_url($role = '') { $args = ['action' => 'custom_logout']; if ($role !== '') { $args['role'] = $role; } $url = add_query_arg($args, site_url('wp-login.php')); return wp_nonce_url($url, 'ml_logout', 'ml_nonce'); } /** * 2. Shortcode für Login-Formular */ function mein_login_form_shortcode() { error_log('Shortcode aufgerufen'); if (is_user_logged_in()) { $user = wp_get_current_user(); $roles = (array)$user->roles; $role = ''; if (in_array('administrator', $roles, true)) { $role = 'admin'; } elseif (in_array('customer', $roles, true)) { $role = 'customer'; } elseif (in_array('s2member_level1', $roles, true)) { $role = 's2member'; } $logout_url = ml_build_logout_url($role); error_log('Shortcode Logout-Link: ' . $logout_url); return '

' . esc_html__('Du bist bereits angemeldet.', 'avia_framework') . ' ' . esc_html__('Abmelden', 'avia_framework') . '

'; } ob_start(); $locale = get_locale(); $labels = [ 'label_username' => __('Benutzername oder E-Mail-Adresse', 'avia_framework'), 'label_password' => __('Passwort', 'avia_framework'), 'label_remember' => __('Angemeldet bleiben', 'avia_framework'), 'label_log_in' => __('Anmelden', 'avia_framework'), ]; if (strpos($locale, 'fr') === 0) { $labels = [ 'label_username' => 'Nom d’utilisateur ou e-mail', 'label_password' => 'Mot de passe', 'label_remember' => 'Rester connecté', 'label_log_in' => 'Connexion', ]; } elseif (strpos($locale, 'en') === 0) { $labels = [ 'label_username' => 'Username or Email', 'label_password' => 'Password', 'label_remember' => 'Remember Me', 'label_log_in' => 'Log In', ]; } wp_login_form([ 'echo' => true, 'redirect' => wp_get_referer() ? wp_get_referer() : site_url(), 'id_username' => 'user_login', 'id_password' => 'user_pass', 'id_remember' => 'rememberme', 'id_submit' => 'wp-submit', 'remember' => true, 'label_username' => $labels['label_username'], 'label_password' => $labels['label_password'], 'label_remember' => $labels['label_remember'], 'label_log_in' => $labels['label_log_in'], ]); return ob_get_clean(); } add_shortcode('mein_login_formular', 'mein_login_form_shortcode'); /** * 3. Menü-Logout-Link ersetzen */ add_filter('wp_nav_menu_objects', function($items, $args) { error_log('Nav-Menü Filter aufgerufen'); if (!$items) return $items; foreach ($items as $item) { if ($item->url === '#logout') { $user = wp_get_current_user(); $roles = (array)$user->roles; $role = ''; if (in_array('administrator', $roles, true)) { $role = 'admin'; } elseif (in_array('customer', $roles, true)) { $role = 'customer'; } elseif (in_array('s2member_level1', $roles, true)) { $role = 's2member'; } $item->url = ml_build_logout_url($role); error_log('Nav Logout-Link: ' . $item->url); } } return $items; }, 10, 2); /** * 4. Mobile Menü-Logout-Link */ add_filter('avia_mobile_menu', function($menu) { error_log('Mobile Menü Filter aufgerufen'); if (is_user_logged_in()) { $user = wp_get_current_user(); $roles = (array)$user->roles; $role = ''; if (in_array('administrator', $roles, true)) { $role = 'admin'; } elseif (in_array('customer', $roles, true)) { $role = 'customer'; } elseif (in_array('s2member_level1', $roles, true)) { $role = 's2member'; } $logout_url = ml_build_logout_url($role); $menu .= ''; error_log('Mobile Logout-Link: ' . $logout_url); } return $menu; }); /** * 5. Direkter Logout-Handler */ add_action('init', function() { if (isset($_GET['action']) && $_GET['action'] === 'custom_logout') { ml_custom_logout(); } }); function ml_custom_logout() { error_log('Logout-Funktion erreicht'); error_log('Logout: Nonce vorhanden: ' . (isset($_GET['ml_nonce']) ? 'Ja' : 'Nein')); error_log('Cookies vor Logout: ' . print_r($_COOKIE, true)); if (empty($_GET['ml_nonce']) || !wp_verify_nonce($_GET['ml_nonce'], 'ml_logout')) { error_log('Logout: Ungültige Nonce'); wp_die(__('Ungültiger Logout-Link.', 'avia_framework')); } if (!is_user_logged_in()) { error_log('Logout: Benutzer nicht angemeldet'); wp_safe_redirect(home_url('/')); exit; } $user = wp_get_current_user(); $roles = (array)$user->roles; if (function_exists('ws_plugin__s2member_clear_cookies')) { ws_plugin__s2member_clear_cookies(); error_log('s2Member Cookies gelöscht'); } elseif (function_exists('ws_plugin__s2member_logout')) { ws_plugin__s2member_logout(); error_log('s2Member Logout-Funktion ausgeführt'); } else { error_log('s2Member Logout-Funktion nicht verfügbar'); } foreach (array_keys($_COOKIE) as $cookie) { if (strpos($cookie, 's2member_') === 0) { setcookie($cookie, '', time() - 3600, '/', COOKIE_DOMAIN, is_ssl(), true); if (defined('SITECOOKIEPATH')) { setcookie($cookie, '', time() - 3600, SITECOOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); } unset($_COOKIE[$cookie]); error_log('Cookie gelöscht: ' . $cookie); } } if (function_exists('wp_destroy_current_session')) { wp_destroy_current_session(); error_log('WP Session zerstört'); } wp_clear_auth_cookie(); wp_set_current_user(0); wp_logout(); error_log('WP Logout abgeschlossen'); $valid_roles = ['customer', 'admin', 's2member']; $role = isset($_GET['role']) && in_array($_GET['role'], $valid_roles, true) ? $_GET['role'] : ''; error_log('Verwendete Rolle für Redirect: ' . ($role ?: 'keine')); $locale = get_locale(); $url = home_url('/'); if ($role === 's2member') { if (strpos($locale, 'fr') === 0) { $url = home_url('/fr/'); } elseif (strpos($locale, 'en') === 0) { $url = home_url('/en/'); } else { $url = home_url('/'); } } switch ($role) { case 'customer': $url = site_url('/shop/'); break; case 'admin': $url = admin_url(); break; } error_log('Logout: User ' . $user->user_login . ', Roles: ' . implode(', ', $roles) . ', Redirect: ' . $url); wp_safe_redirect($url); exit; }