web-dev-qa-db-fra.com

Rediriger la page restreinte vers 404

Existe-t-il un moyen d’afficher une page 404 si l’utilisateur actuellement connecté n’a pas le droit de lire la page? Je cherche une méthode PHP, quelque chose comme

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

J'ai envisagé d'utiliser une redirection, mais j'aimerais que l'URL reste identique.

20
Evan Yeung

J'ai pu afficher une erreur 404 en utilisant le code suivant dans mon en-tête.

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

Pour le décomposer:
$wp_query->set_404(): dit à la wp_query qu'il s'agit d'un 404, cela change le titre
status_header(): envoie un en-tête HTTP 404
get_template_part(): affiche le modèle 404

47
Evan Yeung

Pourquoi ne créez-vous pas une page qui affiche un message d'erreur, puis redirigez l'utilisateur vers cette page? Voici un moyen simple d'y parvenir:

Ouvrez le fichier 404.php et ajoutez ces lignes en haut de celui-ci:

/**
 * Template Name: 404 Page
 */

Créez une page avec le modèle 404 Page. Puis redirigez les utilisateurs:

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

La raison pour laquelle vous devez utiliser une page pour la requête 404 est la suivante: dans WP, la page 404 est en fait une page que n'existe pas, WP doit rechercher tout son contenu avant de retourner la page 404 et que le travail est un gaspillage de ressources. Utiliser une page préconfigurée qui pourrait vous aider à exécuter votre blog plus rapidement.

2
Anh Tran

J'avais une exigence similaire: je ne devais pas laisser les utilisateurs accéder à la page author.php en fonction du rôle d'un utilisateur. J'enregistre l'action template_redirect pour effectuer mes vérifications et rediriger vers la page 404 avant même le chargement de la page.

Enregistrement:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

Gestionnaire:

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 vous avez choisi d'utiliser uniquement l'extrait de code suivant au milieu du modèle, la page a peut-être déjà été rendue partiellement et vous n'êtes pas redirigé vers une page 404. Donc, mieux vaut le faire dans l'action template_redirect -

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

Vous pouvez écrire ce code dans le fichier 404.php dans le répertoire de thèmes réellement utilisé (wp-content/themes /..../ 404.php)}:

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

Ce code doit commencer au début du fichier (sans aucun caractère avant)} _.

Lien vers l'original: Comment rediriger votre page 404 vers la page d'accueil dans WordPress

0
Jan Čejka