Как выйти из системы без подтверждения "Вы действительно хотите выйти?"?
Сейчас, когда я выхожу через:
<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') работает нормально..

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

Если вы не можете использовать функцию 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.

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

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

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

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

Мы можем использовать wp_logout_url. И вот что вам нужно:
$location = str_replace('&', '&', wp_logout_url($redirect_to));
Просто перенаправьте на этот $location, и вы выйдете без подтверждения.

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

Если вы создаете пользовательскую ссылку в меню, установите метку на «Выйти»
, а 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';

Если вы используете стартовую тему 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
