Logout-Link im Menu der Hauptnavigation (ohne Zusatz-Abfrage)

Logout-Link ohne Bestätigung (Wordpress)

Logout-Link ohne Bestätigung - Screenshot/Montage: T.Bortels/cpu20.de

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.

Das Problem erschien mir zunächst relativ trivial. Bei näherem Hinsehen wird die Lösung dann aber doch ein bisschen komplexer, als zunächst erhofft. Letztendlich benötigt man aber doch nur ein entsprechendes Plugin und ein paar Zeilen zusätzlichen PHP-Code in der functions.php – und schon kann man sich mit nur einem Klick abmelden. Hier mein Lösungsweg:

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.

Logout-Menu WordPress

Screenshot „if menu“ by T.Bortels/cpu20.de

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert