web-dev-qa-db-fra.com

Comment déconnecter un utilisateur avec wp_logout?

Je peux obtenir que wp_logout fonctionne, mais non sans générer de nombreux avertissements ('Avertissement de PHP: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés').

wp_logout appelle wp_clear_auth_cookie, qui appelle setcookie, et les cookies doivent être associés aux en-têtes HTTP. J'appelle wp_logout à l'intérieur de la page (dans l'en-tête ou le pied de page), d'où le problème.

Alors, comment je veux exactement déconnecter un utilisateur par programme? Je pourrais le faire en réponse à une demande ajax, mais cela semble aller au-delà. Merci.

EDIT

Code actuel comme suit:

add_action('wp_footer', 'fp_onload_php2');
function fp_onload_php2() {
   $slug = basename(get_permalink());
   if($slug != 'club-login')
      return;

   $jsmsg    = '';
   $loggedin = false;
   if(is_user_logged_in()) {
      $current_user = wp_get_current_user();
      $loggedin = $current_user->has_cap('customer');
   }

   if($loggedin && isset($_GET['logout'])) {
      wp_logout();
      $jsmsg    = 'You have been logged out.';
      $loggedin = false;
   } else if(!$loggedin && isset($_GET['logout']))
      $jsmsg = "You are not logged in.";

   if(!$loggedin)
      echo
         "<script type='text/javascript'> fp_onload_js2(0, '" . $jsmsg .
         "'); </script>\n";
   else
      echo
         "<script type='text/javascript'> fp_onload_js2(1, '" . $jsmsg .
         "'); </script>\n";
}  // fp_onload_php2()
1
EML

Si vous utilisez wp_logout dans votre propre code, il vaut probablement mieux utiliser exit ou wp_redirect immédiatement après.

Vous pouvez appeler wp_set_current_user(0) après wp_logout() pour déconnecter manuellement l'utilisateur instantanément, si vous devez continuer à exécuter PHP mais ne souhaitez pas que l'utilisateur soit connecté.

2
Vasim Shaikh

Ce n'est pas génial, mais semble fonctionner. Ce n'est pas aussi simple que d'appeler wp_logout avant d'envoyer du contenu, car l'utilisateur peut ne pas être déconnecté avant le chargement du reste de la page (je ne le comprends pas). Dans mon cas, le contenu de la page dépend du fait que l'utilisateur soit effectivement connecté ou non (les menus changent et un code JS est appelé pour afficher le contenu différemment).

pour ce code, une demande de déconnexion redirige vers la page de connexion, avec un paramètre GET de logout=1. Ceci est testé sur la page de connexion, qui appelle ensuite wp_logout et redirige vers la page de connexion avec un paramètre GET de logout=0, pour forcer une actualisation.

add_action('init', 'check_logout');

function check_logout() {
   if(!isset($_GET['logout']) || ($_GET['logout'] != '1'))
      return;

   // get_permalink() and $post are not available here, so:
   $path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
   if($path != "/login/")
      return;

   if(is_user_logged_in()) {
      wp_logout();
      header("Location: http://fubar.com/login/?logout=0");
      exit();
   } 
}  // check_logout()
0
EML