Redirecționare Pagină Restricționată către 404
Există vreo modalitate de a afișa o pagină 404 dacă utilizatorul curent autentificat nu are permisiunile necesare pentru a vizualiza pagina? Caut o metodă PHP, ceva de genul
if( !current_user_can('administrator') ) { show_404(); exit(); }
M-am gândit să folosesc o redirecționare, dar aș dori să păstrez URL-ul neschimbat.

Am reușit să afișez o eroare 404 folosind următorul cod în header-ul meu.
<?php
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
?>
Pentru a explica:
$wp_query->set_404()
: anunță wp_query că aceasta este o eroare 404, acest lucru modifică titlul
status_header()
: trimite un header HTTP 404
get_template_part()
: afișează șablonul pentru 404

Acesta este un răspuns bun, dar aș folosi și http_status_code(404);
înainte de setarea șablonului pentru a mă asigura că header-ul este corect (care este semnificativ mai rapid decât funcția WordPress status_header( 404 );
). Dacă ești preocupat de clasamentul paginii, ar trebui să adaugi și o regulă Disallow
în robots.txt pentru a indica că nu este o resursă publică.

De ce să nu creezi o pagină care afișează un mesaj de eroare și apoi redirecționează utilizatorul către acea pagină? Iată o metodă simplă de a realiza acest lucru:
Deschide fișierul 404.php
și adaugă aceste linii în partea de sus:
/**
* Template Name: Pagină 404
*/
Creează o pagină cu șablonul Pagină 404
. Apoi redirecționează utilizatorii:
if ( !current_user_can('administrator') ) {
$404_page = get_permalink( $404_page_id );
wp_redirect( $404_page );
exit();
}
Motivul pentru care ar trebui să folosești o pagină pentru cererea 404 este: în WordPress, pagina 404 este de fapt o pagină care nu există, WordPress trebuie să caute întregul conținut înainte de a returna pagina 404 și această activitate este o pierdere de resurse. Folosirea unei pagini preconfigurate te poate ajuta să rulezi blogul mai rapid.

M-am gândit să folosesc asta. Dar câteva dezavantaje pe care le văd sunt că ar trebui create și întreținute două șabloane 404 (pagina și cea reală). Clientul ar trebui să creeze o pagină 404. Și aș dori să păstrez URL-ul același. De exemplu, dacă accesez http://www.example.com/restricted, nu aș vrea să fiu redirecționat către .../404/

Nu, asta este o idee destul de proastă dacă vrei să ai vreun fel de clasament în pagini. Motorele de căutare consideră doar paginile care returnează un header 404 sau orice alt header din gama 4xx ca eroare de vizualizare și vor indexa cu plăcere orice pagină care returnează un cod 200. Dacă faci o redirecționare, atunci le spui crawler-ului că pagina ta negăsită este o pagină validă, iar asta va afecta grav clasamentul paginilor. Tot ce trebuie să faci când ai o pagină 404 este să folosești http_response_code(404); exit();
. Dacă vrei o pagină, atunci folosește get_template_part( 404 );
înainte de exit. Asta este, de asemenea, mult mai rapid decât orice funcționalitate WordPress.

Am avut o cerință similară în care nu trebuia să permit utilizatorilor să acceseze pagina author.php în funcție de rolul utilizatorului. Am înregistrat acțiunea template_redirect pentru a face verificările și a redirecționa către pagina 404 înainte ca pagina să fie încărcată.
Înregistrare:
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();
}
}
}
Dacă alegeți să folosiți doar următorul fragment de cod în mijlocul părții de template, pagina poate fi deja randată parțial și nu sunteți de fapt redirecționat către o pagină 404. Așadar, este mai bine să faceți acest lucru în acțiunea template_redirect
-
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();

Puteți scrie acest cod în fișierul 404.php din directorul temei actual utilizate (wp-content/themes/..../404.php):
<?php
header("HTTP/1.1 301 Mutat Permanent");
header("Location: ".get_bloginfo('url'));
exit();
?>
Acest cod trebuie să înceapă de la începutul fișierului (fără niciun caracter înainte).
Link către original: Cum să redirecționați pagina 404 către Pagina Principală în WordPress

OP este de fapt în căutarea unei modalități de a afișa eroarea 404 pentru utilizatorii care nu îndeplinesc anumite criterii, de exemplu "Dacă utilizatorul A nu are capacitatea 'can_edit', atunci se afișează o pagină 404."
