Przekieruj stronę z ograniczeniami na 404

21

Czy istnieje sposób na wyświetlenie strony 404, jeśli bieżący zalogowany użytkownik nie ma odpowiedniej zgody na wyświetlenie strony? Szukam metody PHP, coś w tym rodzaju

if( !current_user_can('administrator') ) { show_404(); exit(); }

Myślałem o użyciu przekierowania, ale chciałbym zachować ten sam adres URL.

Evan Yeung
źródło
Jeśli odmawiasz dostępu do użytkownika dla istniejącej strony, 404 to zły kod błędu do użycia. 401 lub 403 miałoby większy sens.
moopet
1
Masz rację. Klient miał wrażenie, że nie chce, aby ktokolwiek bez dostępu wiedział nawet, że strona istnieje, rzucanie 401 powiedziałoby, że istnieje, ale jest zabronione. Niemniej jednak rzucenie 401 byłoby łatwą zmianą.
Evan Yeung,

Odpowiedzi:

52

Byłem w stanie wyświetlić błąd 404, używając następującego kodu w nagłówku.

<?php
  global $wp_query;
  $wp_query->set_404();
  status_header( 404 );
  get_template_part( 404 ); exit();
?>

Aby to rozbić::
$wp_query->set_404()informuje wp_query, że to jest 404, to zmienia tytuł
status_header(): wysyła nagłówek HTTP 404
get_template_part(): wyświetla szablon 404

Evan Yeung
źródło
To dobra odpowiedź, ale chciałbym również użyć http_status_code(404);przed ustawieniem szablonu, aby upewnić się, że nagłówek jest poprawny (co jest znacznie szybsze niż status_header( 404 );funkcja wordpress ). Jeśli martwisz się pozycją strony, powinieneś również umieścić Disallowregułę w pliku robots.txt, aby wskazać, że nie jest to zasób publiczny.
mopsyd
2

Dlaczego nie utworzysz strony z komunikatem o błędzie, a następnie przekierujesz użytkownika na tę stronę? Oto prosty sposób na osiągnięcie tego:

Otwórz 404.phpplik i dodaj do niego następujące wiersze:

/**
 * Template Name: 404 Page
 */

Utwórz stronę z 404 Pageszablonem. Następnie przekieruj użytkowników:

if ( !current_user_can('administrator') ) {
    $404_page = get_permalink( $404_page_id );
    wp_redirect( $404_page );
    exit();
}

Powodem, dla którego powinieneś użyć strony do żądania 404 jest: w WP 404 strona tak naprawdę nie istnieje , WP musi wyszukać całą jej zawartość przed zwróceniem strony 404, a ta praca jest marnotrawstwem zasobów. Korzystanie ze wstępnie skonfigurowanej strony, która może pomóc w szybszym prowadzeniu bloga.

Anh Tran
źródło
Myślałem o tym. Ale kilka wad, które widzę, to to, że dwa szablony 404 musiałyby zostać utworzone i utrzymane (stronicowe i rzeczywiste). Klient musiałby utworzyć stronę 404. I chciałbym zachować ten sam adres URL. Przykład, jeśli wejdę na example.com/restricted , nie zostanę przekierowany do ... / 404 /
Evan Yeung
Właśnie zdałem sobie sprawę, że 404.php jest szablonem. Mój błąd.
Evan Yeung,
Nie, to okropny pomysł, jeśli lubisz ranking stron. Wyszukiwarki traktują tylko strony, które zwracają nagłówek zakresu 404 lub dowolnego zakresu 4xx, jako błąd przeglądarki i z przyjemnością indeksują wszystko, co zwraca 200 stron. Jeśli wykonasz przekierowanie, poinformujesz roboty, że nie znaleziono strony, która jest poprawna, i źle wpłynie na pozycję strony. Wszystko, co naprawdę musisz zrobić, gdy otrzymasz stronę 404, to zrobić http_response_code(404); exit();. Jeśli chcesz stronę, użyj get_template_part( 404 );przed wyjściem. Jest to również znacznie szybsze niż jakakolwiek funkcjonalność wordpress.
mopsyd
0

Możesz napisać ten kod do pliku 404.php w faktycznie używanym katalogu motywów (wp-content / themes /..../ 404.php) :

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>

Ten kod musi zaczynać się od początku pliku (bez żadnych znaków wcześniej) .

Link do oryginału: Jak przekierować stronę 404 na stronę główną w WordPress

Jan Čejka
źródło
OP szuka sposobu wyświetlania 404 dla użytkowników, którzy nie spełniają określonych kryteriów, np. „Jeśli użytkownik A nie ma możliwości„ can_edit ”, wyświetl stronę 404”.
phatskat
Nie przekierowuj 404s. Location: xxxustawia nagłówek 301, który informuje przeszukiwacze, że faktycznie istnieje prawidłowy zasób, i zabija twój ranking, gdy stwierdzą, że go nie ma.
mopsyd
0

Miałem podobny wymóg, w którym nie powinienem zezwalać użytkownikom na dostęp do strony autor.php w zależności od roli, w której był użytkownik. Rejestruję akcję template_redirect w celu sprawdzenia i przekierowania na stronę 404 nawet przed załadowaniem strony.

Rejestracja:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

Treser:

public function handle_inactive_users() {
    global $wp_query;
    if ( $wp_query->is_author() ) {
        $user = $wp_query->get_queried_object();
        if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
            $wp_query->set_404();
            status_header( 404 );
            get_template_part( 404 );
            exit();
        }
    }
}

Jeśli zdecydujesz się używać tylko następującego fragmentu kodu w środku części szablonu, strona mogła już być częściowo renderowana i nie zostaniesz przekierowany na stronę 404. Więc lepiej to zrobić w template_redirectakcji -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
Kalyan
źródło