Как выйти из системы без подтверждения "Вы действительно хотите выйти?"?
Сейчас, когда я выхожу через:
<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Выйти</a>
меня перенаправляет на страницу, где нужно подтвердить выход.
Как убрать подтверждение и перенаправить на главную страницу после выхода?
Это происходит потому, что в 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')
echo wp_loginout('/redirect/url/goes/here') работает нормально..
Mayur Devmurari
Я использую wp_logout_url( get_permalink()), но страница подтверждения не пропускается. Nonce генерируется как часть URL, но меня всё равно перенаправляет на страницу подтверждения
Ralphonz
Если вы не можете использовать функцию 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('&', '&', wp_logout_url($redirect_to));
header("Location: $location");
die;
}
}
Замените 'url-you-want-to-redirect' на URL, на который нужно перенаправить после выхода.
Добавьте этот код в ваш файл functions.php
Это работает для выхода без проверки, но не перенаправляет на нужный мне URL.
Phu Nguyen
@PhuNguyen Вам просто нужно добавить URL для перенаправления в запрос, где в коде стоят пустые кавычки ' ', после двоеточия.
NJENGAH
Есть ли какие-то проблемы с безопасностью при отключении этой проверки?
rokpoto.com
@user1264304 Я считаю, что вредоносный JS, загруженный в браузер, может перенаправить на страницу входа, но это лишь приведёт к выходу пользователя из системы. По-настоящему вредоносный код, вероятно, попытается заменить URL до действительного nonce. Пользователь может перейти на другой сайт, который содержит ссылку на страницу выхода текущего сайта — при условии, что этот сайт знает о связи с пользователем. Опять же, единственным последствием будет выход пользователя из системы. Я никогда не видел такого. Так что отвечая на ваш вопрос, я не считаю, что удаление проверки имеет последствия для безопасности.
TonyG
Отличное решение для меня, особенно потому, что оно не требует дополнительного PHP на моей странице выхода. Я просто использую эту ссылку: wp-login.php?action=logout А для перенаправления я использую home_url(), так что это работает на любом сайте.
Ralf
Мы можем использовать wp_logout_url. И вот что вам нужно:
$location = str_replace('&', '&', wp_logout_url($redirect_to));
Просто перенаправьте на этот $location, и вы выйдете без подтверждения.
Tuananhcwrs
Это отличное решение для меня, но также обнаружил, что перенаправление не работает. Я просто возвращаюсь на главную страницу...
SolaceBeforeDawn
Если вы создаете пользовательскую ссылку в меню, установите метку на «Выйти», а 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();
** Попробовал это, не сработало. При нажатии на кнопку выходит страница с ошибкой "Что-то пошло не так".
Это полностью сработало для меня, включая редирект. Важно внимательно соблюдать правильное форматирование PHP при добавлении ссылки. Вот мой код для этой строки: $item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.'https://google.com';
Ben Blue
Если вы используете стартовую тему WordPress roots/sage или любую другую тему, использующую шаблонизатор Blade из Laravel, убедитесь, что не экранируете URL:
// не делайте так
<a href="{{ wp_logout_url(get_permalink()) }}">выйти</a>
// вместо этого делайте так
<a href="{!! wp_logout_url(get_permalink()) !!}">выйти</a>
Первый пример экранирует все HTML-символы, в то время как второй — нет.
Это довольно сложный взлом. Как насчёт такого варианта: https://wpsandbox.net/wordpress/custom-logout-link-wordpress-p1498