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_redirect
acción -
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();