Reindirizza la pagina con restrizioni a 404


21

C'è un modo per mostrare una pagina 404 se l'utente attualmente connesso non ha la giusta autorizzazione per visualizzare la pagina? Sto cercando un metodo PHP, qualcosa del genere

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

Ho pensato di utilizzare un reindirizzamento, ma vorrei mantenere lo stesso URL.


Se si sta negando l'accesso a un utente per una pagina esistente, 404 è il codice di errore errato da utilizzare. Un 401 o 403 avrebbe più senso.
Moopet,

1
Hai ragione. Ho avuto l'impressione da parte del cliente che non voleva che nessuno senza l'accesso sapesse nemmeno che la pagina esisteva, lanciando un 401 direi che esiste ma è proibito. Tuttavia, sarebbe facile cambiare invece un 401.
Evan Yeung,

Risposte:


52

Sono stato in grado di visualizzare un errore 404 utilizzando il seguente codice nella mia intestazione.

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

Per
$wp_query->set_404()scomporlo:: dice a wp_query che è un 404, questo cambia il titolo
status_header(): invia un'intestazione HTTP 404
get_template_part(): visualizza il modello 404


Questa è una buona risposta, ma vorrei anche usare http_status_code(404);prima di impostare il modello per assicurarmi che l'intestazione sia corretta (che è significativamente più veloce della status_header( 404 );funzione wordpress ). Se ti preoccupi del ranking delle pagine, dovresti anche inserire una Disallowregola in robots.txt per indicare che non è una risorsa pubblica.
mopsyd,

2

Perché non crei una pagina che mostri un messaggio di errore e quindi reindirizzi l'utente a quella pagina? Ecco un modo semplice per raggiungere questo obiettivo:

Apri il 404.phpfile e aggiungi queste righe all'inizio:

/**
 * Template Name: 404 Page
 */

Crea una pagina con 404 Pagemodello. Quindi reindirizzare gli utenti:

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

Il motivo per cui dovresti usare una pagina per la richiesta 404 è: nella pagina WP 404 in realtà è una pagina che non esiste , WP deve cercare tutto il suo contenuto prima di restituire la pagina 404 e quel lavoro è uno spreco di risorse. Utilizzando una pagina preconfigurata che potrebbe aiutarti a gestire il tuo blog più velocemente.


Ho pensato di usare questo. Ma un paio di inconvenienti che vedo è che due modelli 404 dovrebbero essere creati e mantenuti (pagina e reale). Il client dovrebbe creare una pagina 404. E vorrei mantenere lo stesso URL. Esempio, se vado a example.com/restricted , non verrei reindirizzato a ... / 404 /
Evan Yeung il

In realtà ho appena capito che 404.php è il modello. Errore mio.
Evan Yeung il

No, è un'idea piuttosto terribile se ti piace avere qualsiasi tipo di posizionamento delle pagine. I motori di ricerca considerano solo le pagine che restituiscono un'intestazione dell'intervallo 404 o 4xx come errore del visualizzatore e indicizzano felicemente tutto ciò che restituisce una pagina 200. Se esegui un reindirizzamento, stai dicendo ai crawler che la tua pagina non trovata è una pagina valida e rovinerà male il posizionamento della tua pagina. Tutto quello che devi veramente fare quando ottieni una pagina 404 è farlo http_response_code(404); exit();. Se si desidera una pagina, utilizzare get_template_part( 404 );prima dell'uscita. Questo è anche molto più veloce di qualsiasi funzionalità wordpress.
mopsyd,

0

Puoi scrivere questo codice nel file 404.php nella directory dei temi effettivamente utilizzati (wp-content / themes /..../ 404.php) :

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

Questo codice deve iniziare dall'inizio del file (senza alcun carattere prima) .

Link all'originale: come reindirizzare la tua pagina 404 alla Home Page in WordPress


L'OP sta effettivamente cercando un modo per visualizzare 404 per gli utenti che non soddisfano un determinato criterio, ad esempio "Se l'utente A non dispone della funzionalità" can_edit ", visualizza una pagina 404".
phatskat,

Non reindirizzare 404s. Location: xxximposta un'intestazione 301, che dice ai crawler che esiste effettivamente una risorsa valida e uccide il tuo ranking quando determinano che non lo è.
mopsyd,

0

Avevo un requisito simile in cui non avrei dovuto consentire agli utenti di accedere alla pagina author.php in base al ruolo ricoperto da un utente. Registro l'azione template_redirect per fare i miei controlli e reindirizzare alla pagina 404 anche prima che la pagina effettiva sia caricata.

Registrazione:

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

Se hai scelto di utilizzare solo il seguente frammento di codice nel mezzo della parte del modello, la pagina potrebbe essere già stata renderizzata parzialmente e in realtà non verrai reindirizzato a una pagina 404. Quindi meglio farlo template_redirectnell'azione -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.