Redirigir página restringida a 404
¿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.

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

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.

¿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.

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/

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

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.

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

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

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."
