Redirecionar página restrita para 404

21

Existe uma maneira de mostrar uma página 404 se o usuário conectado no momento não tiver a permissão certa para exibir a página? Estou procurando um método PHP, algo como

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

Pensei em usar um redirecionamento, mas gostaria de manter o URL da mesma forma.

Evan Yeung
fonte
Se você está negando acesso a um usuário para uma página que existe, 404 é o código de erro errado a ser usado. Um 401 ou 403 faria mais sentido.
moopet
11
Você está certo. Fiquei com a impressão do cliente de que ele não queria que ninguém sem acesso sequer soubesse que a página existia, jogar um 401 diria que existe, mas é proibido. No entanto, seria uma mudança fácil lançar um 401.
Evan Yeung

Respostas:

50

Consegui exibir um erro 404 usando o seguinte código no meu cabeçalho.

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

Para dividir
$wp_query->set_404():: diz ao wp_query que este é um 404, isso altera o título
status_header(): envia um cabeçalho HTTP 404
get_template_part(): exibe o modelo 404

Evan Yeung
fonte
Esta é uma boa resposta, mas eu também usaria http_status_code(404);antes de definir o modelo para garantir que o cabeçalho esteja correto (o que é significativamente mais rápido que a status_header( 404 );função wordpress ). Se você está preocupado com a classificação da página, também deve colocar uma Disallowregra no seu robots.txt para indicar que não é um recurso público.
Mpsyd
2

Por que você não cria uma página que mostra mensagem de erro e redireciona o usuário para essa página? Aqui está uma maneira simples de conseguir isso:

Abra o 404.phparquivo e adicione estas linhas na parte superior:

/**
 * Template Name: 404 Page
 */

Crie uma página com 404 Pagemodelo. Em seguida, redirecione os usuários:

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

O motivo pelo qual você deve usar uma página para solicitação 404 é: na página WP 404, na verdade, é uma página que não existe , o WP precisa procurar todo o seu conteúdo antes de retornar a página 404 e esse trabalho é um desperdício de recursos. Usando uma página pré-configurada que pode ajudá-lo a executar seu blog mais rapidamente.

Anh Tran
fonte
Eu pensei em usar isso. Mas algumas falhas que vejo é que dois modelos 404 teriam que ser criados e mantidos (página e real). O cliente teria que criar uma página 404. E eu gostaria de manter o URL igual. Exemplo, se eu for para example.com/restricted , não seria redirecionado para ... / 404 /
Evan Yeung
Na verdade, acabei de perceber que o 404.php é o modelo. Meu erro.
Evan Yeung
Não, é uma péssima ideia se você gosta de ter algum tipo de ranking de página. Os mecanismos de pesquisa consideram apenas as páginas que retornam um cabeçalho 404 ou qualquer cabeçalho 4xx como erro do visualizador e indexam com prazer qualquer coisa que retorne uma página 200. Se você redirecionar, estará dizendo aos rastreadores que sua página não encontrada é uma página válida e isso prejudicará muito a classificação da sua página. Tudo o que você realmente precisa fazer quando obtém uma página 404 é fazer http_response_code(404); exit();. Se você deseja uma página, use get_template_part( 404 );antes de sair. Isso também é muito mais rápido do que qualquer funcionalidade wordpress.
Mpsyd
0

Você pode escrever esse código no arquivo 404.php no diretório de temas realmente usado (wp-content / themes /..../ 404.php) :

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

Esse código deve começar do início do arquivo (sem caracteres antes) .

Link para o original: Como redirecionar sua página 404 para a Home Page no WordPress

Jan Čejka
fonte
O OP está realmente procurando uma maneira de exibir 404 para usuários que não atendem a um determinado critério, por exemplo, "Se o usuário A não tiver o recurso 'can_edit', exiba uma página 404".
phatskat
Não redirecione 404s. Location: xxxdefine um cabeçalho 301, que informa aos rastreadores que há realmente um recurso válido e mata sua classificação quando eles determinam que não existe.
Mpsyd
0

Eu tinha um requisito semelhante no qual não deveria permitir que os usuários acessassem a página author.php com base na função em que ele estava. Registro a ação template_redirect para fazer minhas verificações e redirecionar para a página 404, mesmo antes de a página real ser carregada.

Cadastro:

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

Manipulador:

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 você optar por usar apenas o seguinte snippet de código no meio da parte do modelo, a página já poderá ter sido renderizada parcialmente e você não será realmente redirecionado para uma página 404. Tão melhor fazê-lo na template_redirectação -

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