Eingeschränkte Seite auf 404 umleiten

20

Gibt es eine Möglichkeit, eine 404-Seite anzuzeigen, wenn der aktuell angemeldete Benutzer nicht über die erforderliche Berechtigung zum Anzeigen der Seite verfügt? Ich suche nach einer PHP-Methode, so ähnlich

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

Ich habe überlegt, eine Weiterleitung zu verwenden, möchte die URL jedoch beibehalten.

Evan Yeung
quelle
Wenn Sie einem Benutzer den Zugriff auf eine vorhandene Seite verweigern, ist 404 der falsche Fehlercode. Ein 401 oder 403 wäre sinnvoller.
Moopet
1
Du hast recht. Ich hatte vom Kunden den Eindruck, dass er nicht wollte, dass jemand ohne Zugriff wusste, dass die Seite existiert. Ein 401 würde sagen, dass sie existiert, aber verboten ist. Dennoch wäre es eine einfache Änderung, stattdessen eine 401 zu werfen.
Evan Yeung

Antworten:

50

Ich konnte einen 404-Fehler anzeigen, indem ich den folgenden Code in meinem Header verwendete.

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

Um es aufzuschlüsseln
$wp_query->set_404():: teilt der wp_query mit, dass es sich um eine 404 handelt, ändert den Titel
status_header(): sendet einen HTTP-404-Header
get_template_part(): zeigt die 404-Vorlage an

Evan Yeung
quelle
Dies ist eine gute Antwort, aber ich würde auch http_status_code(404);vor dem Einstellen der Vorlage verwenden, um sicherzustellen, dass der Header korrekt ist (was erheblich schneller ist als die WordPress- status_header( 404 );Funktion). Wenn Sie mit dem Seitenrang befasst sind, sollten Sie auch eine DisallowRegel in Ihre robots.txt einfügen, um anzuzeigen, dass es sich nicht um eine öffentliche Ressource handelt.
Mopsyd
2

Warum erstellen Sie keine Seite, auf der eine Fehlermeldung angezeigt wird, und leiten den Benutzer dann zu dieser Seite weiter? Hier ist ein einfacher Weg, dies zu erreichen:

Öffnen Sie die 404.phpDatei und fügen Sie diese Zeilen oben hinzu:

/**
 * Template Name: 404 Page
 */

Erstellen Sie eine Seite mit 404 PageVorlage. Leiten Sie dann Benutzer weiter:

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

Der Grund, warum Sie eine Seite für eine 404-Anforderung verwenden sollten, ist: In WP 404-Seite ist tatsächlich eine Seite, die nicht vorhanden ist , WP muss vor dem Zurückgeben der 404-Seite nach dem gesamten Inhalt suchen, und diese Arbeit ist eine Verschwendung von Ressourcen. Verwenden Sie eine vorkonfigurierte Seite, mit der Sie Ihr Blog möglicherweise schneller ausführen können.

Anh Tran
quelle
Ich habe darüber nachgedacht. Aber ein paar Nachteile, die ich sehe, sind, dass zwei 404-Vorlagen erstellt und gepflegt werden müssten (page und real). Der Client müsste eine 404-Seite erstellen. Und ich möchte die URL gleich halten. Beispiel: Wenn ich auf example.com/restricted gehe , werde ich nicht weitergeleitet zu ... / 404 /
Evan Yeung
Eigentlich habe ich gerade gemerkt, dass die 404.php die Vorlage ist. Mein Fehler.
Evan Yeung
Nein, das ist eine ziemlich schreckliche Idee, wenn Sie irgendeine Art von Seitenrang möchten. Suchmaschinen berücksichtigen nur Seiten, die einen 404- oder 4xx-Bereichsheader als Anzeigefehler zurückgeben, und indizieren glücklich alles, was 200 Seiten zurückgibt. Wenn Sie eine Weiterleitung durchführen, teilen Sie den Crawlern mit, dass Ihre nicht gefundene Seite eine gültige Seite ist, und es wird Ihr Seitenranking stark durcheinander bringen. Alles, was Sie wirklich tun müssen, wenn Sie eine 404-Seite erhalten, ist do http_response_code(404); exit();. Wenn Sie eine Seite möchten, verwenden Sie diese get_template_part( 404 );vor dem Beenden. Das ist auch viel schneller als jede WordPress-Funktionalität.
Mopsyd
0

Sie können diesen Code in die Datei 404.php im aktuell verwendeten Theme-Verzeichnis (wp-content / themes /..../ 404.php) schreiben :

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

Dieser Code muss am Anfang der Datei beginnen (ohne vorherige Zeichen) .

Link zum Original: So leiten Sie Ihre 404-Seite auf die Homepage in WordPress um

Jan Čejka
quelle
Das OP sucht nach einer Möglichkeit, 404 für Benutzer anzuzeigen, die bestimmte Kriterien nicht erfüllen, z. B. "Wenn Benutzer A nicht über die Funktion 'can_edit' verfügt, wird eine 404-Seite angezeigt."
Phatskat
Leiten Sie 404s nicht um. Location: xxxSetzt einen 301-Header, der Crawlern mitteilt, dass tatsächlich eine gültige Ressource vorhanden ist, und beendet Ihr Ranking, wenn sie feststellen, dass keine vorhanden ist.
Mopsyd
0

Ich hatte eine ähnliche Anforderung, bei der Benutzer nicht auf die Seite author.php zugreifen dürfen, basierend auf der Rolle, in der sich ein Benutzer befindet. Ich registriere die Aktion template_redirect, um meine Prüfungen durchzuführen und zur Seite 404 umzuleiten, noch bevor die eigentliche Seite geladen wird.

Anmeldung:

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

Handler:

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();
        }
    }
}

Wenn Sie nur das folgende Codefragment in der Mitte des Vorlagenteils verwenden, wurde die Seite möglicherweise bereits teilweise gerendert und Sie werden nicht auf eine 404-Seite umgeleitet. Also besser, es in der template_redirectAktion zu tun -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
Kalyan
quelle