Jak się wylogować bez potwierdzenia „Czy naprawdę chcesz się wylogować?”?

13

Właśnie teraz, gdy wylogowuję się przez:

<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Log out</a>

przekierowuje mnie do strony, na której muszę potwierdzić wylogowanie.

Jak wyeliminować potwierdzenie i przekierować na stronę główną po wylogowaniu?

Derfder
źródło

Odpowiedzi:

31

Dzieje się tak, ponieważ brakuje niezbędnej wartości jednorazowej w adresie URL, który jest sprawdzany wp-login.php

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

Użyj wp_logout_urlw celu odzyskania adresu URL wraz z wartością jednorazową. Jeśli chcesz przekierować na niestandardowy adres URL, po prostu przekaż go jako argument.

<a href="<?php echo wp_logout_url('/redirect/url/goes/here') ?>">Log out</a>

Możesz również użyć, wp_loginoutktóry generuje link do Ciebie, w tym tłumaczenie:

echo wp_loginout('/redirect/url/goes/here')
ndm
źródło
1
echo wp_loginout ('/ redirect / url / idzie / tutaj') działa dobrze ..
Mayur Devmurari
1
Używam, wp_logout_url( get_permalink())a strona potwierdzenia nie jest pomijana. Kod jednorazowy jest generowany jako część adresu URL, ale wciąż jestem wysyłany na stronę z potwierdzeniem
Ralphonz,
Ten sam problem tutaj :(
Jarmerson
15

Jeśli nie możesz użyć wp_logout_url()funkcji, możesz wyłączyć tę weryfikację za pomocą tego kodu:

add_action('check_admin_referer', 'logout_without_confirm', 10, 2);
function logout_without_confirm($action, $result)
{
    /**
     * Allow logout without confirmation
     */
    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;
    }
}

Zastąp 'url-you-want-to-redirect'adres URL, który chcesz przekierować po wylogowaniu.

Dodaj to do swojego functions.php

Дмитрий Шишов
źródło
Działa to przy wylogowywaniu bez sprawdzania poprawności, ale nie przekierowuje do adresu URL, który chcę.
Phu Nguyen,
@PhuNguyen Wystarczy dodać adres URL przekierowania do żądania przekierowania w tym kodzie, w którym znajdują się cudzysłowy, po dwukropku.
NJENGAH,
czy są jakieś konsekwencje dla bezpieczeństwa związane z usunięciem tej weryfikacji?
rok
@ user1264304 Uważam, że złośliwy JS w jakiś sposób załadowany do przeglądarki może przekierować na stronę logowania, ale wystarczy wylogować użytkownika. Naprawdę złośliwy kod prawdopodobnie próbowałby zastąpić adres URL przed prawidłową wartością jednorazową. Użytkownik może przejść do innej witryny, która następnie ma link do strony wylogowania bieżącej witryny - zakładając, że druga strona wie, że użytkownik jest w związku. Ponownie, nie ma żadnej innej konsekwencji poza wylogowaniem użytkownika. Nigdy tego nie widziałem. Tak więc, aby odpowiedzieć na twoje pytanie, nie sądzę, aby usunięcie weryfikacji było związane z bezpieczeństwem.
TonyG
Błąd, zbyt wiele przekierowań ...
Solomon Closson
3

Jeśli utworzysz niestandardowy link w menu, ustaw etykietę na “Logout”i ustaw adres URL na http://yourdomain.com/wp-login.php?action=logout. Następnie dodaj tę funkcję do swojego functions.phppliku:

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

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

Jeśli chcesz się przekierować na stronę logowania po wylogowaniu, dołącz adres URL logowania jako:

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

Link referencyjny

Gufran Hasan
źródło
-2

To działało dla mnie, dodając /?customer-logout=truena końcu.

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

Stanley Tan
źródło