Как выйти из системы без подтверждения "Вы действительно хотите выйти?"?

6 окт. 2012 г., 11:46:32
Просмотры: 135K
Голосов: 30

Сейчас, когда я выхожу через:

<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Выйти</a>

меня перенаправляет на страницу, где нужно подтвердить выход.

Как убрать подтверждение и перенаправить на главную страницу после выхода?

0
Все ответы на вопрос 8
3
46

Это происходит потому, что в URL отсутствует необходимый одноразовый код (nonce), который проверяется в файле wp-login.php

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

Используйте функцию wp_logout_url для получения URL с включенным одноразовым кодом. Если вам нужно перенаправить пользователя на произвольный URL, просто передайте его в качестве аргумента.

<a href="<?php echo wp_logout_url('/redirect/url/goes/here') ?>">Выйти</a>

Также можно использовать функцию wp_loginout, которая автоматически генерирует ссылку с учетом перевода:

echo wp_loginout('/redirect/url/goes/here')
6 окт. 2012 г. 13:24:04
Комментарии

echo wp_loginout('/redirect/url/goes/here') работает нормально..

Mayur Devmurari Mayur Devmurari
30 окт. 2015 г. 07:32:47

Я использую wp_logout_url( get_permalink()), но страница подтверждения не пропускается. Nonce генерируется как часть URL, но меня всё равно перенаправляет на страницу подтверждения

Ralphonz Ralphonz
17 дек. 2018 г. 12:42:08

Та же проблема :(

Jarod Thornton Jarod Thornton
14 апр. 2019 г. 09:34:35
9
31

Если вы не можете использовать функцию wp_logout_url(), вы можете отключить эту проверку с помощью следующего кода:

add_action('check_admin_referer', 'logout_without_confirm', 10, 2);
function logout_without_confirm($action, $result)
{
    /**
     * Разрешает выход без подтверждения
     */
    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;
    }
}

Замените 'url-you-want-to-redirect' на URL, на который нужно перенаправить после выхода.

Добавьте этот код в ваш файл functions.php

4 апр. 2016 г. 16:48:27
Комментарии

Это работает для выхода без проверки, но не перенаправляет на нужный мне URL.

Phu Nguyen Phu Nguyen
29 июн. 2017 г. 11:27:36

@PhuNguyen Вам просто нужно добавить URL для перенаправления в запрос, где в коде стоят пустые кавычки ' ', после двоеточия.

NJENGAH NJENGAH
17 дек. 2017 г. 08:01:54

Есть ли какие-то проблемы с безопасностью при отключении этой проверки?

rokpoto.com rokpoto.com
20 мар. 2018 г. 02:21:22

@user1264304 Я считаю, что вредоносный JS, загруженный в браузер, может перенаправить на страницу входа, но это лишь приведёт к выходу пользователя из системы. По-настоящему вредоносный код, вероятно, попытается заменить URL до действительного nonce. Пользователь может перейти на другой сайт, который содержит ссылку на страницу выхода текущего сайта — при условии, что этот сайт знает о связи с пользователем. Опять же, единственным последствием будет выход пользователя из системы. Я никогда не видел такого. Так что отвечая на ваш вопрос, я не считаю, что удаление проверки имеет последствия для безопасности.

TonyG TonyG
4 мая 2018 г. 18:47:16

Ошибка, слишком много перенаправлений...

Solomon Closson Solomon Closson
5 февр. 2019 г. 18:49:49

Отличное решение для меня, особенно потому, что оно не требует дополнительного PHP на моей странице выхода. Я просто использую эту ссылку: wp-login.php?action=logout А для перенаправления я использую home_url(), так что это работает на любом сайте.

Ralf Ralf
28 авг. 2020 г. 09:38:35

Мы можем использовать wp_logout_url. И вот что вам нужно:

$location = str_replace('&', '&', wp_logout_url($redirect_to));

Просто перенаправьте на этот $location, и вы выйдете без подтверждения.

Tuananhcwrs Tuananhcwrs
25 сент. 2020 г. 06:56:33

Это отличное решение для меня, но также обнаружил, что перенаправление не работает. Я просто возвращаюсь на главную страницу...

SolaceBeforeDawn SolaceBeforeDawn
28 окт. 2021 г. 08:41:21

Это идеальное решение для добавления кнопки выхода в меню WordPress.

Kai Qing Kai Qing
10 мар. 2023 г. 05:01:48
Показать остальные 4 комментариев
1
13

Если вы создаете пользовательскую ссылку в меню, установите метку на «Выйти», а URL на http://вашдомен.com/wp-login.php?action=logout. Затем добавьте эту функцию в файл functions.php:

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

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

Если вы хотите перенаправить на страницу входа после выхода, добавьте URL входа следующим образом:

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

Ссылка на источник

** Попробовал это, не сработало. При нажатии на кнопку выходит страница с ошибкой "Что-то пошло не так".

4 мар. 2019 г. 16:38:44
Комментарии

Это полностью сработало для меня, включая редирект. Важно внимательно соблюдать правильное форматирование PHP при добавлении ссылки. Вот мой код для этой строки: $item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.'https://google.com';

Ben Blue Ben Blue
24 авг. 2022 г. 19:35:50
1

Это сработало для меня, добавив /?customer-logout=true в конце.

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

2 авг. 2019 г. 02:55:14
Комментарии

Это также сработало для меня... Но, возможно, это можно использовать только если установлен WooCommerce... Я не уверен...

Aerendir Aerendir
4 февр. 2022 г. 14:23:21
0

Если вы используете стартовую тему WordPress roots/sage или любую другую тему, использующую шаблонизатор Blade из Laravel, убедитесь, что не экранируете URL:

// не делайте так
<a href="{{ wp_logout_url(get_permalink()) }}">выйти</a>

// вместо этого делайте так
<a href="{!! wp_logout_url(get_permalink()) !!}">выйти</a>

Первый пример экранирует все HTML-символы, в то время как второй — нет.

28 мая 2021 г. 10:51:31
0

Я получал URL для выхода из системы с помощью wp_logout_url(), но всё равно отображалось подтверждение. Оказалось, что функция преобразовывала символы типа & в &amp;, что ломало параметры URL. Это исправило проблему:

html_entity_decode( wp_logout_url() )

25 окт. 2024 г. 10:47:21
0

Чтобы обойти подтверждение выхода из системы, определите _wpnonce для действия log-out в URL следующим образом:

$log_out_url = add_query_arg('_wpnonce', wp_create_nonce('log-out'), wp_logout_url());

wp_safe_redirect($log_out_url);
exit;
9 авг. 2022 г. 22:19:14
0

Это довольно сложный взлом. Как насчёт такого варианта: https://wpsandbox.net/wordpress/custom-logout-link-wordpress-p1498

5 сент. 2024 г. 18:46:30