Как выйти из системы с помощью wp_logout?

1 мая 2015 г., 20:38:59
Просмотры: 20.9K
Голосов: 2

Я могу заставить wp_logout работать, но не без множества предупреждений ('PHP warning: Cannot modify header information - headers already sent').

wp_logout вызывает wp_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    = 'Вы вышли из системы.';
      $loggedin = false;
   } else if(!$loggedin && isset($_GET['logout']))
      $jsmsg = "Вы не авторизованы.";

   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() - функция для обработки выхода из системы
3
Комментарии

Где/как вы используете wp_logout()? Пожалуйста, опубликуйте код.

s_ha_dum s_ha_dum
1 мая 2015 г. 20:46:17

вы в основном ответили на свой собственный вопрос - вам нужно вызвать wp_logout до того, как какой-либо контент будет отправлен в браузер.

Milo Milo
1 мая 2015 г. 23:55:23

Возможно, delete_user_meta($user_id, 'session_tokens'); может помочь? Это также может заблокировать конкретного пользователя. Как только сессия пользователя будет удалена и этот пользователь (или даже ваш пользователь) перезагрузит страницу, WordPress автоматически завершит его сеанс.

vee vee
24 дек. 2023 г. 16:10:37
Все ответы на вопрос 2
1

Если вы используете wp_logout в своём коде, лучше всего сразу после него вызвать exit или wp_redirect.

Вы можете вызвать wp_set_current_user(0) после wp_logout(), чтобы вручную мгновенно разлогинить пользователя, если вам нужно продолжить выполнение PHP, но не хотите, чтобы пользователь оставался авторизованным.

31 янв. 2016 г. 11:34:05
Комментарии

Начиная с WP 5.3, после исправления issue 35488, функция wp_logout() включает вызов wp_set_current_user(0)

itinerant itinerant
10 февр. 2023 г. 18:52:17
0

Это не идеально, но работает. Недостаточно просто вызвать wp_logout до отправки контента, потому что пользователь может быть или не быть разлогинен до загрузки остальной части страницы (я не совсем понимаю, почему). В моем случае содержимое страницы зависит от того, авторизован ли пользователь (меню меняется, и некоторый JS-код вызывается для отображения контента по-разному).

В этом коде запрос на выход перенаправляет на страницу входа с GET-параметром logout=1. Это проверяется на странице входа, которая затем вызывает wp_logout и перенаправляет обратно на страницу входа с GET-параметром logout=0, чтобы принудительно обновить страницу.

add_action('init', 'check_logout');

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

   // get_permalink() и $post здесь недоступны, поэтому:
   $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()
5 мая 2015 г. 16:58:47