Redirigir página restringida a 404

4 ago 2011, 09:01:43
Vistas: 79K
Votos: 34

¿Hay alguna manera de mostrar una página 404 si el usuario actual conectado no tiene los permisos adecuados para ver la página? Estoy buscando un método PHP, algo como

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

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

2
Comentarios

Si estás denegando el acceso a un usuario para una página que existe, 404 es el código de error incorrecto. Un 401 o 403 tendría más sentido.

moopet moopet
12 jul 2013 12:18:55

Tienes razón. Tenía la impresión del cliente de que no quería que nadie sin acceso supiera siquiera que la página existía, lanzar un 401 indicaría que existe pero está prohibida. Sin embargo, sería un cambio fácil lanzar un 401 en su lugar.

Evan Yeung Evan Yeung
12 jul 2013 22:11:57
Todas las respuestas a la pregunta 4
1
79

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

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

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

28 ago 2011 17:40:37
Comentarios

Esta es una buena respuesta, pero también usaría http_status_code(404); antes de establecer la plantilla para asegurarme de que la cabecera sea correcta (lo cual es significativamente más rápido que la función de WordPress status_header( 404 );). Si te preocupa el posicionamiento en buscadores, también deberías agregar una regla Disallow en tu archivo robots.txt para indicar que no es un recurso público.

mopsyd mopsyd
15 mar 2018 04:12:59
3

¿Por qué no creas una página que muestre un mensaje de error y luego redirija al usuario a esa página? Aquí hay una forma sencilla de lograrlo:

Abre el archivo 404.php y agrega estas líneas al principio:

/**
 * Plantilla Nombre: Página 404
 */

Crea una página con la plantilla Página 404. Luego redirige 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 deberías usar una página para las solicitudes 404 es: en WP, la página 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 un desperdicio de recursos. Usar una página preconfigurada podría ayudarte a que tu blog funcione más rápido.

4 ago 2011 09:39:22
Comentarios

He pensado en usar esto. Pero un par de desventajas que veo es que habría 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 misma URL. Por ejemplo, si voy a http://www.example.com/restricted, no quiero que me redirija a .../404/

Evan Yeung Evan Yeung
4 ago 2011 10:02:51

De hecho, acabo de darme cuenta de que el 404.php es la plantilla. Error mío.

Evan Yeung Evan Yeung
4 ago 2011 10:24:05

No, esa es una idea bastante terrible si te importa tener algún tipo de ranking en las páginas. Los motores de búsqueda solo consideran las páginas que devuelven un encabezado 404 o cualquier rango 4xx como error del visor, y indexarán felizmente cualquier cosa que devuelva una página 200. Si haces una redirección, entonces le estás diciendo a los rastreadores que tu página no encontrada es una página válida, y eso arruinará tu ranking de página. Todo lo que realmente necesitas hacer cuando obtengas una página 404 es usar http_response_code(404); exit();. Si quieres una página, entonces usa get_template_part( 404 ); antes de exit. Eso también es mucho más rápido que cualquier funcionalidad de WordPress.

mopsyd mopsyd
15 mar 2018 04:05:02
0

Tuve un requisito similar donde no debía permitir que los usuarios accedieran a la página author.php según el rol que tuvieran. Registro la acción template_redirect para hacer mis verificaciones 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']);

Manejador:

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 decides usar solo el siguiente fragmento de código en medio de una parte de la plantilla, es posible que la página ya se haya renderizado parcialmente y no se redirija realmente a una página 404. Por lo tanto, es mejor hacerlo en la acción template_redirect -

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
26 sept 2017 19:52:46
2

Puedes escribir este código en el archivo 404.php dentro del directorio del tema actualmente en uso (wp-content/themes/..../404.php):

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

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

Enlace al original: Cómo Redirigir tu página 404 a la Página de Inicio en WordPress

5 jun 2017 17:39:09
Comentarios

El OP realmente está buscando una forma de mostrar un 404 para usuarios que no cumplan cierto criterio, por ejemplo "Si el usuario A no tiene la capacidad 'can_edit', entonces mostrar una página 404."

phatskat phatskat
5 jun 2017 18:18:45

No redirecciones los errores 404. Location: xxx establece una cabecera 301, lo que le indica a los rastreadores que hay un recurso válido, y afectará tu posicionamiento cuando determinen que no lo hay.

mopsyd mopsyd
15 mar 2018 04:10:38