Agregue el enlace "Cerrar sesión" al menú de navegación

16

¿Cómo puedo agregar un enlace al menú de navegación principal con el class="right"atributo?

Intenté agregar un enlace estático example.com/wp-logout.php?action=logoutpero eso lleva a una página de confirmación de cierre de sesión. ¿Hay alguna forma de convertirlo en un enlace de cierre de sesión?

Zach Russell
fuente
1
¿Has visto preguntas y respuestas existentes como esta ?
fuxia
¿Has visto wp_loginout()?
kaiser
2
He eliminado la respuesta aceptada, porque fue plagiada de este sitio sin atribución.
fuxia
Terminé usando algo similar; al menos usando la función loginout (). Publicaré exactamente lo que hice la próxima vez que esté frente a mi computadora. Gracias @toscho
Zach Russell
Puede usar este complemento gratuito wordpress.org/plugins/login-logout-register-menu para lograr lo mismo fácilmente.
Vinod Dalvi

Respuestas:

39

Puedes lograr esto usando el wp_nav_menu_itemsgancho. Echemos un vistazo al siguiente fragmento de código que muestra el enlace de inicio / cierre de sesión en la primaryubicación del menú.

add_filter( 'wp_nav_menu_items', 'wti_loginout_menu_link', 10, 2 );

function wti_loginout_menu_link( $items, $args ) {
   if ($args->theme_location == 'primary') {
      if (is_user_logged_in()) {
         $items .= '<li class="right"><a href="'. wp_logout_url() .'">'. __("Log Out") .'</a></li>';
      } else {
         $items .= '<li class="right"><a href="'. wp_login_url(get_permalink()) .'">'. __("Log In") .'</a></li>';
      }
   }
   return $items;
}

Esto es lo que hemos implementado en el ejemplo anterior.

  1. Primero agregó un filtro para wp_nav_menu_itemshook y le asignó una función.
  2. Después de verificar la primaryubicación del tema, hemos verificado si el usuario inició sesión o no.
  3. Si ha iniciado sesión, hemos mostrado el Log Outenlace; de ​​lo contrario, el Log In enlace.
  4. Hemos pasado el enlace permanente de la página que está viendo actualmente a la URL de inicio de sesión para que el usuario sea redirigido a la página actual después de iniciar sesión correctamente.
  5. Hemos utilizado el class="right"código anterior para cumplir con sus requisitos.

Puede encontrar una explicación detallada en este blog .

Chittaranjan
fuente
@ timo-s En el tema Twenty Diecisiete (niño) sólo funcionará con una topubicación del menú: if ($args->theme_location == 'top').
Iurie Malai
ubicación debe ser para míprimary-menu
Toskan
2

Intente agregar un enlace personalizado con http://example.com/wp-login.php?action=logout ¡ Funcionó para mí!

Marcelo Oliveira
fuente
1
Esto le presenta al usuario el mensaje "¿Está seguro de que desea cerrar sesión?" pronto, debido al hecho de que falta el nonce.
cale_b
0

Mi menú de pie de página es un widget , por lo tanto, tuve dificultades para usar el código de Chittaranjan. La siguiente versión editada me funciona. También cambié los enlaces y los hice "dinámicos": el inicio de sesión lleva a una página de su elección, el cierre de sesión permanecerá en la página actual o se enviará a inicio, si la página actual es su página de inicio de sesión (privada). Lo ideal sería verificar si su página de inicio de sesión es realmente privada, pero no sé cómo hacerlo, lo siento.

add_filter( 'wp_nav_menu_items', 'wti_loginout_menu_link', 10, 2 );

function wti_loginout_menu_link( $items, $args ) {
    //var_dump($args);
    if (($args->menu->slug == 'footer')) {
        if (is_user_logged_in()) {
            $loginlink = '/your-private-page';
            $logoutlink = get_permalink();
            if (strpos($logoutlink, $loginlink) !== false) {
                $logoutlink = '/';
            }
            $items .= '<li class="right"><a href="'. wp_logout_url($logoutlink) .'">'. __("Log Out") .'</a></li>';
        } else {
            $items .= '<li class="right"><a href="'. wp_login_url($loginlink) .'">'. __("Log In") .'</a></li>';
        }
    }
    return $items;
}
Ralf
fuente
-2
add_filter( 'wp_nav_menu_items', 'add_loginout_link', 15, 5 );

function add_loginout_link( $menus, $args ) {

  if (is_user_logged_in() && $args->theme_location == 'primary') {

   $menus .= '<li><a href="'. wp_logout_url( get_permalink( woocommerce_get_page_id( 'myaccount' ) ) ) .'">Log Out</a></li>';
    }

  elseif (!is_user_logged_in() && $args->theme_location == 'primary') {

   $menus .= '<li><a href="' . get_permalink( woocommerce_get_page_id( 'myaccount' ) ) . '">Log In</a></li>';
  }

  return $menus;
}
Ankush Samyal
fuente
Debe formatear su código usando 4 espacios al comienzo de cada línea (consulte la ayuda).
Peter HvD
Por favor no anuncie su sitio web. Edite su respuesta con una explicación sobre cómo este bloque de código responde la pregunta en cuestión, dónde agregarla y qué hace específicamente.
Howdy_McGee