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_redirect
ação -
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();