Bei manchen WordPress-Seiten möchte man, daß sich die Nutzer anmelden, um auf bestimmte Inhalte zugreifen zu können. Für den Login gibt es auch schöne und elegante Lösungen – nur beim Logout wird es manchmal ein bisschen unschön. Der Nutzer wird in der Regel auf eine Seite mit einer zusätzlichen Abfrage weitergeleitet und dort erneut gefragt, ob er/sie sich denn nun wirklich abmelden möchte. Von der Benutzerfreundlichkeit her ist das nicht optimal – die UX könnte besser aussehen. Zum Beispiel so: ein Klick auf „Logout“ – und man ist abgemeldet – der Logout ist komplett.
Zunächst benötigen wir das Plugin „If Menu – Visibility control for Menu Items“ oder ein ähnliches Plugin, um zu steuern, welche Menu-Punkte für angemeldete Nutzer sichtbar sind, und welche für unangemeldete. Schließlich wollen wir den Logout-Link nur für angemeldete Nutzer anzeigen – unangemeldete Nutzer bekommen hingegen den Login-Link angezeigt.
Das Plugin ist schnell installiert und konfiguriert – in den Menu-Einstellungen gibt es nun die Möglichkeit, einzelne Menu-Links nach vorgegebenen Bedingungen anzeigen oder verstecken zu lassen. In diesem Falle nutzen wir die Option, den Logout-Link nur für angemeldete Nutzer anzeigen zu lassen. Dementsprechend lassen wir den Login-Link nur für unangemeldete Nutzer anzeigen.
Jetzt müssen wir nur noch den Link anpassen – das geht über die functions.php
Bei Stackexchange fand ich dazu folgenden Vorschlag:
add_action('check_admin_referer', 'logout_without_confirm', 10, 2);
function logout_without_confirm($action, $result)
{
/**
* Allow logout without confirmation
*/
if ($action == "log-out" && !isset($_GET['_wpnonce'])) {
$redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'url-you-want-to-redirect';
$location = str_replace('&', '&', wp_logout_url($redirect_to));
header("Location: $location");
die;
}
}
Leider hat das nicht so funktioniert, wie es sollte. Wo genau das Problem liegt ist mir unklar – der Nutzer wurde jedenfalls nach dem Klick auf „Logout“ weiterhin auf die Bestätigungs-Seite weitergeleitet.Aber der Ansatz war schon ganz richtig: den vorhandenen Logout-Link so zu ergänzen, dass eine erneute Bestätigung übersprungen werden würde.
Dann fand ich auf Github folgende Lösung:
// LOGOUT LINK IN MENU function diww_menu_logout_link( $nav, $args ) { $logoutlink = '<li><a href="'.wp_logout_url().'">Logout</a></li>'; if( $args->theme_location == 'primary' ) { return $nav.$logoutlink ; } else { return $nav; } } add_filter('wp_nav_menu_items','diww_menu_logout_link', 10, 2);
Viel kompakter – allerdings ergänzt diese Funktion das Menu (in diesem Falle „primary“) durch einen zusätzlichen Logout-Link.
Beide Ansätze kombiniert ergaben dann das für mich passende Resultat:
function change_menu($items){ foreach($items as $item){ if( $item->title == "Logout"){ $item->url = wp_logout_url(); } } return $items; } add_filter('wp_nav_menu_objects', 'change_menu');
Die Funktion sucht nach einem Menu-Item mit dem Titel „Logout“ und setzt dann den Link für diesen Menu-Eintrag auf die direkte Lougout-Adresse. Und fertig ist die Hütte.