Как выйти из системы с помощью wp_logout?
Я могу заставить 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() - функция для обработки выхода из системы
Если вы используете wp_logout
в своём коде, лучше всего сразу после него вызвать exit
или wp_redirect
.
Вы можете вызвать wp_set_current_user(0)
после wp_logout()
, чтобы вручную мгновенно разлогинить пользователя, если вам нужно продолжить выполнение PHP, но не хотите, чтобы пользователь оставался авторизованным.

Начиная с WP 5.3, после исправления issue 35488, функция wp_logout() включает вызов wp_set_current_user(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()
