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

Вопрос или проблема

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

<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('&amp;', '&', 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(), но он все равно показывал подтверждение. Оказалось, что он преобразовывал символы, такие как &, в &amp;, что нарушало параметры 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;amp;', '&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 без подтверждения. Используя встроенные функции и немного кода, вы сможете легко настроить процесс выхода по своему усмотрению, обеспечивая при этом безопасность и избегая лишних подтверждений. Не забудьте протестировать все изменения в безопасной среде, прежде чем развертывать их на вашем сайте.

Оцените материал
Добавить комментарий

Капча загружается...