Rediriger la page restreinte vers 404

21

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

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

J'ai pensé à utiliser une redirection, mais je voudrais garder l'URL identique.

Evan Yeung
la source
Si vous refusez l'accès à un utilisateur pour une page qui existe, 404 est le mauvais code d'erreur à utiliser. Un 401 ou 403 aurait plus de sens.
moopet
1
Tu as raison. J'avais l'impression du client qu'il ne voulait pas que quelqu'un sans accès sache même que la page existait, lancer un 401 dirait qu'elle existe mais qu'elle est interdite. Néanmoins, ce serait un changement facile de lancer un 401 à la place.
Evan Yeung

Réponses:

52

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()indique à 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

Evan Yeung
la source
C'est une bonne réponse, mais j'utiliserais également http_status_code(404);avant de définir le modèle pour s'assurer que l'en-tête est correct (ce qui est nettement plus rapide que la status_header( 404 );fonction wordpress ). Si vous êtes préoccupé par le classement des pages, vous devez également mettre une Disallowrègle dans votre robots.txt pour indiquer qu'il ne s'agit pas d'une ressource publique.
mopsyd
2

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

Ouvrez le 404.phpfichier et ajoutez ces lignes en haut:

/**
 * Template Name: 404 Page
 */

Créez une page avec un 404 Pagemodèle. Redirigez ensuite 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 demande 404 est la suivante: dans WP, la page 404 est en fait une page qui n'existe pas , WP doit rechercher tout son contenu avant de renvoyer la page 404 et ce travail est un gaspillage de ressources. Utiliser une page préconfigurée qui pourrait vous aider à exécuter votre blog plus rapidement.

Anh Tran
la source
J'ai pensé à l'utiliser. Mais quelques inconvénients que je vois, c'est que deux modèles 404 devraient être créés et maintenus (page et réel). Le client devra créer une page 404. Et je voudrais garder l'URL identique. Exemple, si je vais sur example.com/restricted , je ne serais pas redirigé vers ... / 404 /
Evan Yeung
En fait, je viens de réaliser que le 404.php est le modèle. Mon erreur.
Evan Yeung
Non, c'est une idée assez terrible si vous aimez avoir n'importe quel type de classement de page. Les moteurs de recherche ne considèrent que les pages qui renvoient un en-tête de plage 404 ou 4xx comme une erreur de visualisation, et indexeront volontiers tout ce qui renvoie une page de 200. Si vous effectuez une redirection, vous dites aux robots d'exploration que votre page non trouvée est une page valide et qu'elle gâchera mal le classement de votre page. Tout ce que vous avez vraiment besoin de faire lorsque vous obtenez une page 404 est de le faire http_response_code(404); exit();. Si vous voulez une page, utilisez-la get_template_part( 404 );avant de quitter. C'est aussi beaucoup plus rapide que n'importe quelle fonctionnalité wordpress.
mopsyd
0

Vous pouvez écrire ce code dans le fichier 404.php dans le répertoire de thème actuellement 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

Jan Čejka
la source
L'OP cherche actuellement un moyen d'afficher 404 pour les utilisateurs qui ne répondent pas à certains critères, par exemple "Si l'utilisateur A n'a pas la capacité 'can_edit', alors affichez une page 404."
phatskat
Ne redirigez pas les 404. Location: xxxdéfinit un en-tête 301, qui indique aux robots d'exploration qu'il existe réellement une ressource valide et tue votre classement lorsqu'ils déterminent qu'il n'y en a pas.
mopsyd
0

J'avais une exigence similaire où 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 faire mes vérifications et rediriger vers la page 404 avant même que la page réelle ne soit chargée.

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 de la partie modèle, la page peut avoir déjà été rendue partiellement et vous n'êtes pas réellement redirigé vers une page 404. Il vaut donc mieux le faire dans l' template_redirectaction -

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