Reindirizzare una Pagina Riservata a 404
Esiste un modo per mostrare una pagina 404 se l'utente attualmente connesso non ha i permessi necessari per visualizzare la pagina? Sto cercando un metodo PHP, qualcosa come
if( !current_user_can('administrator') ) { show_404(); exit(); }
Ho pensato di utilizzare un reindirizzamento, ma vorrei mantenere lo stesso URL.

Sono riuscito a visualizzare un errore 404 utilizzando il seguente codice nell'header.
<?php
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
?>
Per spiegarlo nel dettaglio:
$wp_query->set_404()
: indica a wp_query che si tratta di un 404, questo modifica il titolo
status_header()
: invia un header HTTP 404
get_template_part()
: mostra il template 404

Questa è una buona risposta, ma userei anche http_status_code(404);
prima di impostare il template per assicurarmi che l'header sia corretto (che è significativamente più veloce della funzione WordPress status_header( 404 );
). Se sei preoccupato per il page rank, dovresti anche inserire una regola Disallow
nel tuo robots.txt per indicare che non si tratta di una risorsa pubblica.

Perché non crei una pagina che mostri un messaggio di errore e poi reindirizzi l'utente a quella pagina? Ecco un modo semplice per farlo:
Apri il file 404.php
e aggiungi queste righe all'inizio:
/**
* Template Name: Pagina 404
*/
Crea una pagina con il template Pagina 404
. Poi reindirizza 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 le richieste 404 è: in WP la pagina 404 in realtà è una pagina che non esiste, WP deve cercare tra tutto il suo contenuto prima di restituire la pagina 404 e quel lavoro è uno spreco di risorse. Usare una pagina preconfigurata potrebbe aiutarti a far funzionare il tuo blog più velocemente.

Ho pensato di usare questo. Ma un paio di svantaggi che vedo è che dovrebbero essere creati e mantenuti due template 404 (pagina e reale). Il cliente dovrebbe creare una pagina 404. E vorrei mantenere lo stesso URL. Ad esempio, se vado su http://www.example.com/restricted, non vorrei essere reindirizzato a .../404/

In realtà mi sono appena reso conto che il 404.php è il template. Mio errore.

No, è un'idea piuttosto terribile se ti interessa avere un buon ranking nelle pagine di ricerca. I motori di ricerca considerano solo le pagine che restituiscono un header 404 o qualsiasi altro nella gamma 4xx come errori, e indicizzeranno volentieri qualsiasi cosa che restituisca una pagina 200. Se fai un reindirizzamento, stai dicendo ai crawler che la tua pagina non trovata è una pagina valida, e questo comprometterà seriamente il tuo ranking. Tutto ciò che devi fare quando hai una pagina 404 è usare http_response_code(404); exit();
. Se vuoi una pagina, allora usa get_template_part( 404 );
prima di exit. Questo è anche molto più veloce di qualsiasi funzionalità di WordPress.

Ho avuto un requisito simile in cui non dovevo permettere agli utenti di accedere alla pagina author.php in base al ruolo dell'utente. Ho registrato l'azione template_redirect per fare i miei controlli e reindirizzare alla pagina 404 ancora prima che la pagina effettiva venga caricata.
Registrazione:
add_action( 'template_redirect', [ $this, 'handle_inactive_users']);
Gestore:
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 scegli di usare solo il seguente frammento di codice nel mezzo di una parte del template, la pagina potrebbe essere già stata renderizzata parzialmente e non verrai effettivamente reindirizzato a una pagina 404. Quindi è meglio farlo nell'azione template_redirect
-
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();

Puoi scrivere questo codice nel file 404.php nella directory del tema attualmente in uso (wp-content/themes/..../404.php):
<?php
header("HTTP/1.1 301 Spostato Permanentemente");
header("Location: ".get_bloginfo('url'));
exit();
?>
Questo codice deve iniziare dall'inizio del file (senza alcun carattere prima).
Link all'originale: Come Reindirizzare la Pagina 404 alla Home Page in WordPress

L'OP sta effettivamente cercando un modo per mostrare un errore 404 agli utenti che non soddisfano determinati criteri, ad esempio "Se l'utente A non ha la capability 'can_edit', allora mostra una pagina 404."
