Comment se déconnecter sans confirmation "Voulez-vous vraiment vous déconnecter?"?

13

En ce moment, lorsque je me déconnecte via:

<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Log out</a>

il me redirige vers la page où je dois confirmer la déconnexion.

Comment éliminer la confirmation et rediriger vers la page d'accueil après la déconnexion?

Derfder
la source

Réponses:

30

Cela se produit car il manque le non nécessaire dans l'URL, qui est en cours d'archivage wp-login.php

case 'logout' :
    check_admin_referer('log-out');
    ...

Utilisez wp_logout_urlpour récupérer l'URL, y compris le nonce. Si vous souhaitez rediriger vers une URL personnalisée, passez-la simplement comme argument.

<a href="<?php echo wp_logout_url('/redirect/url/goes/here') ?>">Log out</a>

Vous pouvez également utiliser wp_loginoutce qui génère le lien pour vous, y compris la traduction:

echo wp_loginout('/redirect/url/goes/here')
ndm
la source
1
echo wp_loginout ('/ redirect / url / va / ici') fonctionne bien ..
Mayur Devmurari
1
J'utilise wp_logout_url( get_permalink())et la page de confirmation n'est pas contournée. Le nonce est généré dans le cadre de l'URL mais je suis toujours envoyé à la page de confirmation
Ralphonz
Même problème ici :(
Jarmerson
15

Si vous ne pouvez pas utiliser la wp_logout_url()fonction, vous pouvez désactiver cette validation en utilisant ce code:

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('&amp;', '&', wp_logout_url($redirect_to));
        header("Location: $location");
        die;
    }
}

Remplacez 'url-you-want-to-redirect'par l'URL que vous souhaitez rediriger après la déconnexion.

Ajoutez-le dans votre functions.php

Дмитрий Шишов
la source
Cela fonctionne pour se déconnecter sans validation, mais il ne redirige pas vers l'URL que je veux.
Phu Nguyen
@PhuNguyen Vous avez juste besoin d'ajouter l'URL de redirection à la demande de redirection dans ce code où il y a des '' guillemets, après les deux points.
NJENGAH
y a-t-il des implications de sécurité pour la suppression de cette validation?
rok
@ user1264304 Je pense que le JS malveillant chargé dans le navigateur pourrait faire une redirection vers la page de connexion, mais tout ce qu'il va faire est de déconnecter l'utilisateur. Un code vraiment malveillant chercherait probablement à remplacer l'URL avant un nonce valide. L'utilisateur peut naviguer vers un autre site qui a alors un lien vers la page de déconnexion du site actuel - en supposant que l'autre site est conscient que l'utilisateur a une relation. Encore une fois, aucune conséquence autre que la déconnexion de l'utilisateur. Je n'ai jamais vu ça. Donc, pour répondre à votre question, je ne pense pas qu'il y ait une implication de sécurité pour supprimer la validation.
TonyG
Euh, trop de redirections ...
Solomon Closson
3

Si vous créez un lien personnalisé dans votre menu, définissez le libellé sur “Logout”et définissez l'URL sur http://yourdomain.com/wp-login.php?action=logout. Ajoutez ensuite cette fonction à votre functions.phpfichier:

function change_menu($items){
  foreach($items as $item){
    if( $item->title == "Logout"){
         $item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' );
    }
  }
  return $items;

}
add_filter('wp_nav_menu_objects', 'change_menu');

Si vous souhaitez rediriger vers la page de connexion après la déconnexion, vous devez ajouter l'URL de connexion en tant que:

$item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.wp_login_url();

Lien de référence

Gufran Hasan
la source
-2

Cela a fonctionné pour moi en ajoutant /?customer-logout=trueà la fin.

http://www.website.com/?customer-logout=true

Stanley Tan
la source