Pas de mot de passe de page privée pour les admins et les auteurs
Découvrez la méthode qui permet aux administrateurs et aux auteurs de ne pas préciser le mot de passe en cas d’article ou de page privé.
Comme je l’ai expliqué récemment dans cette astuce, il est possible de rendre une page ou un article privé en ajoutant un mot de passe. Ce qui me dérange, c’est que lorsque je suis administrateur et connecté, on me demande quand même le mot de passe. De même si je suis l’auteur de l’article, on me demande le mot de passe pour accéder à mon article !
Je vous propose une solution pour ne plus avoir à préciser le mot de passe si vous êtes l’auteur ou administrateur.
Copier le code ci-dessous dans le fichier functions.php
présent à la racine de votre thème :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
function bawnopass_template_redirect() {
global $post, $current_user;
// Si un utilisateur est connecté, et qu'il est admin ou l'auteur du post
// et que le post contient un pass et que le pass n'a pas été entré ...
if( is_user_logged_in()
&& !empty( $post )
&& ( current_user_can( 'administrator' ) || $current_user->ID==$post->post_author )
&& !empty( $post->post_password ) && post_password_required($post)
) :
// On crée un hash pour le cookie avec l'api des hasher WP
global $wp_hasher;
if ( empty( $wp_hasher ) ):
require_once( ABSPATH . 'wp-includes/class-phpass.php' );
$wp_hasher = new PasswordHash( 8, true );
endif;
// Je crée le cookie avec le pass du post
setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $post->post_password ) ), time() + 864000, COOKIEPATH );
// Je le redirige vers sa page de provenance
wp_safe_redirect( wp_get_referer() );
// Toujours die() après une redirection.
die();
endif;
}
add_action('template_redirect', 'bawnopass_template_redirect' );
[/pastacode]
J’utilise le hook template_redirect
car il n’y a encore eu aucun caractère imprimé. Etant donné que le post et l’utilisateur sont connus, je vais pouvoir faire mes tests et rediriger si besoin.
Maintenant, il vous suffit d’être connecté en tant qu’administrateur ou être l’auteur du post visité. Si c’est le cas, je crée le cookie correspondant au mot de passe comme si je l’avais tappé et je rafraichis la page. Cela passe inaperçu et c’est rapide, la page (ou article) s’affiche normalement !
6 Commentaires
Bravo Julio ! Encore bravo (je l’ai pensé plusieurs fois mais je ne l’ai pas écrit). Quel perfectionnisme ! d:-)
Puis moi qui ne connais pas le PHP, qui le lit juste un peu, j’apprécie les commentaires au sein du code, il y en a qui ne se donnent pas la petite peine de le faire…
Merci à toi ! Je trouve ce comportement de code tellement normal que je me demande pourquoi c’est pas déjà dans WordPress. Et puis je me dis “ha mais oui, ça ya est pas car je peux le faire avec un hook” ;)
Sur une 404 ou une recherche sans résultat, tu n’as pas de warning en étant “auteur non administrateur” ?
Je serais tenté de rajouter un !empty($post) au début du if.
En tout cas c’est un truc que je vais certainement rajouter de base dans mon template :)
Thx dude.
Et pan, je confirme : “Trying to get property of non-object”.
ho zut, remplaçons alors :
if( is_user_logged_in()
par
if( is_user_logged_in() && !empty( $post )
Merci !
Bonjour Julio,
Je ne sais plus si c’est encore d’actualité, mais je souhaita permettre à un membre connecté comme abonné de lire côté public un article avec l’option privé (donc même pas l’auteur)
Est-ce adaptable ??
Merci