Вопрос или проблема
Прямо сейчас, когда я выхожу через:
<a href="https://wordpress.stackexchange.com/questions/67336/<?php bloginfo("url'); ?>/wp-login.php?action=logout">Выйти</a>
он перенаправляет меня на страницу, где мне нужно подтвердить выход.
Как устранить подтверждение и перенаправить на главную страницу после выхода?
Это происходит, потому что вам не хватает необходимого nonce в URL, который проверяется в wp-login.php
case 'logout' :
check_admin_referer('log-out');
...
Используйте wp_logout_url
, чтобы получить URL, включая nonce. Если вы хотите перенаправить на пользовательский URL, просто передайте его в качестве аргумента.
<a href="https://wordpress.stackexchange.com/questions/67336/<?php echo wp_logout_url("/redirect/url/goes/here') ?>">Выйти</a>
Вы также можете использовать wp_loginout
, который генерирует ссылку для вас, включая перевод:
echo wp_loginout('/redirect/url/goes/here')
Если вы не можете использовать функцию 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 на http://yourdomain.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();
** пробовал, это не сработало. Действительно хочу, чтобы страница выхода работала, но что-то пошло не так при нажатии кнопки.
Это сработало для меня, добавив /?customer-logout=true
в конце.
http://www.website.com/?customer-logout=true
Если вы используете стартовую тему WordPress roots/sage или любую другую тему с использованием шаблонизатора Laravel Blade, убедитесь, что не экранируете URL:
// не делайте
<a href="{{ wp_logout_url(get_permalink()) }}">выйти</a>
// но вместо этого
<a href="{!! wp_logout_url(get_permalink()) !!}">выйти</a>
Первый пример экранирует все HTML символы, в то время как последний – нет.
Чтобы обойти запрос подтверждения выхода, определите _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;
Это много взломов. Как насчет этого:
https://wpsandbox.net/wordpress/custom-logout-link-wordpress-p1498
Я получал URL для выхода, используя wp_logout_url()
, но он все равно показывал подтверждение. Оказалось, что он преобразовывал символы, такие как &
, в &
, что нарушало параметры URL. Исправив это, я получил:
html_entity_decode( wp_logout_url() )
Ответ или решение
Чтобы выйти из системы WordPress без подтверждения «Вы действительно хотите выйти?», необходимо использовать несколько подходов, чтобы обойти стандартные механизмы проверки, встроенные в WordPress. Рассмотрим детально, как это сделать.
1. Использование функции wp_logout_url()
Наиболее предпочтительным и безопасным способом является использование встроенной функции wp_logout_url()
, которая автоматически генерирует URL для выхода с необходимым _wpnonce
(nonce), чтобы предотвратить CSRF-атаки и обеспечить безопасность.
Пример кода для вашего меню с ссылкой на выход без подтверждения будет выглядеть следующим образом:
<a href="<?php echo wp_logout_url(home_url()); ?>">Выйти</a>
Этот код создаёт ссылку на выход, которая после выхода перенаправляет пользователя на главную страницу вашего сайта.
Если вы хотите перенаправить пользователей на другую страницу, просто передайте нужный URL как параметр:
<a href="<?php echo wp_logout_url('/путь/для/перенаправления'); ?>">Выйти</a>
2. Отключение проверки подтверждения
Если вы хотите отключить проверку подтверждения, вы можете добавить следующий код в файл functions.php
вашей темы:
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-куда-выходит';
$location = str_replace('&amp;', '&', wp_logout_url($redirect_to));
header("Location: $location");
die;
}
}
Эта функция будет обрабатывать запрос на выход, проверяя, не установлен ли nonce. Если он отсутствует, пользователь будет сразу перенаправлен на указанный URL.
3. Добавление в меню
Если вы хотите, чтобы ссылка на выход была доступна в меню, создайте кастомное меню и добавьте следующую функцию в functions.php
для автоматического добавления nonce в URL:
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');
4. Код с полный URL для выхода
Если вам необходимо настроить URL для выхода с добавлением параметров или специальных условий, вы можете использовать следующий код:
$log_out_url = add_query_arg('_wpnonce', wp_create_nonce('log-out'), wp_logout_url());
wp_safe_redirect($log_out_url);
exit;
5. Избежание экранирования в шаблонах
Если вы используете шаблоны такие как Laravel’s Blade, убедитесь, что не экранируете URL. Пример корректного кода:
<a href="{!! wp_logout_url(get_permalink()) !!}">Выйти</a>
Это позволяет правильно формировать ссылку без рассечения на HTML-сущности.
Заключение
Эти подходы помогут вам эффективно организовать выход из системы WordPress без подтверждения. Используя встроенные функции и немного кода, вы сможете легко настроить процесс выхода по своему усмотрению, обеспечивая при этом безопасность и избегая лишних подтверждений. Не забудьте протестировать все изменения в безопасной среде, прежде чем развертывать их на вашем сайте.