web-dev-qa-db-ja.com

どのようにしてwp_logoutでユーザーをログアウトさせますか?

私はwp_logoutを動作させることができますが、たくさんの警告を出さずには動作しません( 'PHPの警告:ヘッダ情報は変更できません - ヘッダはすでに送信されています')。

wp_logoutwp_clear_auth_cookieを呼び出し、これはsetcookieを呼び出します。クッキーはHTTPヘッダーと一緒に使用する必要があります。私はページの内側(ヘッダーまたはフッター)でwp_logoutを呼び出しているので、問題があります。

それで、プログラム的にユーザーをログアウトさせることを、正確にどのように意味するのでしょうか。私はajaxのリクエストに応えてこれを行うことができましたが、それはトップを超えた方法のようです。ありがとう。

_編集_

現在のコードは次のとおりです。

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

自分のコードでwp_logoutを使用している場合は、その直後におそらくexitまたはwp_redirectを使用することをお勧めします。

PHPを実行し続ける必要があるがユーザーをログインさせたくない場合は、wp_set_current_user(0)の後にwp_logout()を呼び出してユーザーを即座に手動でログアウトさせることができます。

2
Vasim Shaikh

これは素晴らしいことではありませんが、うまくいくようです。コンテンツが送信される前にwp_logoutを呼び出すのと同じくらい簡単ではありません。なぜなら、残りのページがロードされる前にユーザーがログアウトされているかもしれないし、そうでないかもしれないからです。私の場合、ページの内容は、ユーザーが実際にログインしているかどうかによって異なります(メニューが変わり、内容の表示方法が異なるJSコードが呼び出されます)。

このコードでは、ログアウト要求はログインページにリダイレクトされ、GETパラメータはlogout=1です。これはログインページでテストされ、次にwp_logoutが呼び出され、更新を強制するためにlogout=0のGETパラメータでログインページにリダイレクトされます。

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