Redireccionar página restringida a 404

21

¿Hay alguna manera de mostrar una página 404 si el usuario conectado actualmente no tiene la autorización correcta para ver la página? Estoy buscando un método PHP, algo así como

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

He pensado en usar una redirección, pero me gustaría mantener la URL igual.

Evan Yeung
fuente
Si está negando el acceso a un usuario para una página que existe, 404 es el código de error incorrecto para usar. Un 401 o 403 tendría más sentido.
moopet
1
Tienes razón. Tenía la impresión del cliente de que no quería que nadie sin acceso siquiera supiera que la página existía, arrojando un 401 diría que existe pero prohibido. Sin embargo, sería un cambio fácil lanzar un 401 en su lugar.
Evan Yeung

Respuestas:

52

Pude mostrar un error 404 usando el siguiente código en mi encabezado.

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

Para desglosarlo::
$wp_query->set_404()le dice a wp_query que este es un 404, esto cambia el título
status_header(): envía un encabezado HTTP 404
get_template_part(): muestra la plantilla 404

Evan Yeung
fuente
Esta es una buena respuesta, pero también la usaría http_status_code(404);antes de configurar la plantilla para asegurarme de que el encabezado sea correcto (que es significativamente más rápido que la status_header( 404 );función wordpress ). Si le preocupa el rango de la página, también debe poner una Disallowregla en su robots.txt para indicar que no es un recurso público.
mopsyd
2

¿Por qué no crea una página que muestra un mensaje de error y luego redirige al usuario a esa página? Aquí hay una manera simple de lograr eso:

Abra el 404.phparchivo y agregue estas líneas en la parte superior:

/**
 * Template Name: 404 Page
 */

Crea una página con 404 Pageplantilla. Luego redirija a los usuarios:

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

La razón por la que debe usar una página para la solicitud 404 es: en la página WP 404 en realidad es una página que no existe , WP tiene que buscar todo su contenido antes de devolver la página 404 y ese trabajo es una pérdida de recursos. Usar una página preconfigurada que pueda ayudarlo a ejecutar su blog más rápido.

Anh Tran
fuente
He pensado en usar esto. Pero un par de inconvenientes que veo es que se tendrían que crear y mantener dos plantillas 404 (página y real). El cliente tendría que crear una página 404. Y me gustaría mantener la URL igual. Ejemplo, si voy a example.com/restricted , no sería redirigido a ... / 404 /
Evan Yeung
En realidad me acabo de dar cuenta de que el 404.php es la plantilla. Mi error.
Evan Yeung
No, esa es una idea bastante terrible si te gusta tener algún tipo de clasificación de página. Los motores de búsqueda solo consideran las páginas que devuelven un encabezado de rango 404 o 4xx como error del visor, y felizmente indexarán cualquier cosa que devuelva una página de 200. Si realiza un redireccionamiento, le está diciendo a los rastreadores que su página no encontrada es una página válida, y dañará su clasificación de página. Todo lo que realmente necesita hacer cuando obtiene una página 404 es hacer http_response_code(404); exit();. Si quieres una página, úsala get_template_part( 404 );antes de salir. Eso también es mucho más rápido que cualquier funcionalidad de WordPress.
mopsyd
0

Puede escribir este código en el archivo 404.php en el directorio de temas realmente utilizado (wp-content / themes /..../ 404.php) :

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

Este código debe comenzar desde el comienzo del archivo (sin ningún carácter antes) .

Enlace al original: Cómo redirigir su página 404 a la página de inicio en WordPress

Jan Čejka
fuente
El OP realmente está buscando una manera de mostrar 404 para los usuarios que no cumplen con ciertos criterios, por ejemplo, "Si el usuario A no tiene la capacidad 'can_edit', entonces muestre una página 404".
Phatskat 05 de
No redirija los 404. Location: xxxestablece un encabezado 301, que le dice a los rastreadores que realmente hay un recurso válido, y mata su clasificación cuando determinan que no lo hay.
mopsyd
0

Tenía un requisito similar en el que no debía permitir que los usuarios accedieran a la página author.php en función del rol en el que se encontraba el usuario. Registro la acción template_redirect para hacer mis comprobaciones y redirigir a la página 404 incluso antes de que se cargue la página real.

Registro:

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

Si elige usar solo el siguiente fragmento de código en el medio de la parte de la plantilla, es posible que la página ya se haya procesado parcialmente y que en realidad no se lo redirija a una página 404. Así que mejor hacerlo en la template_redirectacción -

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