WordPress: publier des articles et des pages privés (part 1)
J’ai eu aujourd’hui besoin de faire une maquette pour un nouveau site, destiné à un public à accès restreint et authentifié. Voyons voir ce que WordPress propose en standard…
De la visibilité des articles et des pages
Pour commencer, je me suis intéressé à la propriété de publication des articles et des pages : la visibilité.
Les articles étant par défaut en « public« , essayons tout d’abord « Protégé par mot de passe« . Bon, autant vous dire que c’est totalement inutilisable.
Passons à la suite, « Privé« . Ça s’annonce mieux dans l’esprit. l’article marqué ainsi est invisible lorsque l’on est pas connecté.
L’administrateur le voit bien sûr, mais quid d’un membre du site non administrateur ?
Mais avant d’aller plus loin, je tombe sur un os de taille. En fait un blocage rédhibitoire : passez une page en mode « privé » et CRACK! le site est cassé, un superbe redirection vers Free.fr avec la classique page « Erreur 500« … Mais que s’est -il passé ? Et bien le fait d’enregistrer une page avec le statut « privé » à tout simplement généré un fichier .htaccess à la racine du site, et le code généré n’est pas autorisé chez Free.fr.
Donc retour à la sauvegarde – fin des tests en mode « privé« ….
Faites ce que je dis, pas ce que je fais…
En parallèle je me suis mis à tester les rôles proposés par WordPress, associé à un article marqué comme « Privé ». Oui, je sais, je viens de dire que c’est inutilisable, mais bon, je voulais connaitre la corrélation avec les rôles WordPress.
Voici un petit tableau récapitulatif des rôles et de leurs effets sur un article « privé »
Permission – Rôle |
Effet |
Aucun rôle dans ce blog |
L’utilisateur peut s’authentifier, mais il arrive sur |
Abonné | Les articles privés sont invisibles |
Contributeur |
Les articles privés sont invisibles |
Auteur |
Les articles privés sont invisibles |
Editeur |
Les articles privés sont visibles, mais les droits sont trop élevés et avec ce rôle les membres peuvent modifier vos articles. |
Administrateur | Heu… il faut être inconscient pour mettre ses membres administrateur, non ? |
Visiblement, la solution n’est pas là.
Essayons de voir se qui se fait ailleurs…
Pourquoi réinventer la roue ? Voici une extension qui permet de masquer tout ou partie d’un article, visible seulement pour les membres connectés:
http://wordpress.org/extend/plugins/hidepost/
Pas mal, mais elle est très rudimentaire : ajout d’une balise dans le texte des articles.
Eurêka !
J’ai trouvé mon bonheur dans cette extension: wpnamedusers.
http://wordpress.org/extend/plugins/wpnamedusers/
Elle ajoute deux réglages dans l’administration du site :la création de groupe de permission, et l’ajout d’utilisateur (déjà existants) dans ces groupes.
Pour l’utiliser, il suffit ensuite de créer/modifier un article ou une page, et en bas des propriétés se trouve deux propriétés qui, si elles ne sont pas utilisées, laissent l’article ou la page en mode « public » classique. Si par contre vous choisissez de cocher un groupe d’utilisateur précédemment créé, l’article ou la page devient visible uniquement à ce groupe (et point de .htaccess sauvage en vue ;-)). Même une recherche ne montrera pas l’article.
Seule petite modification est à apporter manuellement, afin d’empêcher les commentaires sur ces articles/pages à accès restreint d’apparaitre dans les commentaires récents du site à un visiteur anonyme. L’auteur l’a décrit dans son blog : http://wordpress.sundskard.dk/archives/119/comment-page-1
Dernier point, la désactivation de l’extension ne supprimera pas les trois tables qu’elle a créé à l’installation. Il vous faudra les supprimer manuellement dans l’administration SQL.
La suite ?
Comme la dicussion associée le montre, cette extension à quelques lacunes, notamment lorsque de nouveaux articles sont publiés, il faut appliquer les permissions. De même, de nouveaux utilisateurs abonnés ne seront pas pris en compte automatiquement.
Mais il existe une alternative ! User Access Management, qui est détaillée dans ce second article à venir prochainement : WordPress: gérer un contenu privé pour ses abonnés (part 2)
Salut,
wpnamedusers c’est exactement ce que je cherchais merci 😉
Magnifique,
Cela fait quelques jours que je recherchais une technique similaire
Merci beaucoup de nous faire partager ton experience
Fantastique !! 😀
Bonjour,
As-tu francisé le module ?
@Denis je l’ai utilisé tel quel, avec l’interface d’administration en anglais, désolé. Mais le plugin est fourni avec les fichiers .PO, il est alors facile d’en faire une copie et de l’éditer avec POEDIT, que tu peux télécharger ici : http://www.poedit.net/download.php
Bonjours, ce plugin fonctionne t’il aussi pour les commentaires ?
Je m’explique, j’utilise hidepost, pour cacher certains de mes postes, mais les utilisateur enregistré laisse des commentaires et ceci sont visible. Une question, est-il possible de cacher ces commentaires au visiteurs non enregistrer. Ce qui me conviendrais le mieux, ce serais de privatisé une catégorie complète, mais j’ai toujours rien trouvé sur le sujet.
Merci
Oui, ce plugin permet aussi de masquer les commentaires sur des articles privés. Mais il faut cependant faire une manipulation décrite ici : http://wordpress.sundskard.dk/archives/119/comment-page-1
merci beaucoup du renseignement^^
bonne continuation.
Hello!
Dis moi tu as l’air de bien t’y connaitre… moi je cherche un moyen de vérouiller une catégorie par un mot de passe…
peux u m’aider?
Salut Auri! Je pense que pour protéger simplement les articles d’une catégorie, le plugin wpnamedusers fera l’affaire. C’est plus simple qu’il n’y parait : installer le plugin, créer un groupe de permission (MesAbonnés), placer dans ce groupe tes utilisateurs enregistrés, et lorsque tu publies un article, tu précises pour l’article (ou la page) que l’accès n’est autorisé que pour ce groupe.
Mais pour protéger directement une catégorie par mot de passe, il n’existe pour l’instant à priori rien (http://www.wordpress-fr.net/support/sujet-9474-protection-categorie-mot-passe)
Exactement, ce je cherchais.
Un grand merci
Merci ! Cette extension va m’être très utile.
Bravo pour cet article qui résout mon problème de visibilité de certaines pages. Mais une question : chaque fois qu’on crée un utilisateur, il faut lui ajouter explicitement des permissions pour qu’il puisse accéder à des pages protégées. Y a-t-il moyen de restreindre l’accès d’une page simplement à tout utilisateur identifié, sans qu’il soit besoin d’une manipulation supplémentaire pour lui attribuer des droits ?
Merci d’avance.
@Gilbert Effectivement, si on place des permissions d’accès par exemple sur des pages existantes, associé à un groupe « mes Membres », tout nouvel utilisateur inscrit ne fera pas automatiquement partie de ce groupe et donc ne verra pas les pages limitées à ce groupe.
Il faut ensuite aller dans l’administration de wpnamedusers, faire « Show Group members » et repérer les les nouveaux membres qu’il faut ajouter – à priori ceux qui ne sont pas sélectionnés.
J’ai posé la question à l’auteur de ce plug-in, Andrias Sundskarð :
http://wordpress.sundskard.dk/archives/119/comment-page-1#comment-353
Pour aller plus loin, et notamment personnaliser la page de login, cacher le tableau de bord ou maîtriser la redirection après connexion, je te conseille de consulter cet article (qui utilise aussi wpnamedusers, entre autres)
http://www.kpdesign.net/wordpress/allowing-limiting-user-access-in-wordpress/
Voici également un article récent qui présente deux plugins pour masquer des articles ou des pages. Il s’agit juste de les masquer à l’affichage sur la page d’accueil ou des archives, en les laissant apparaitre dans les flux RSS. Donc pas de restrictions liées à des permissions.
http://www.geekeries.fr/articles/gerer-visibilite-articles-pages-blog-wordpress/
Bonjour et merci pour ton article, c’est excatement ce que je cherchais. J’ai juste un problème concernant les commentaires récents associés aux articles privés. je ne sais pas trop ou copier le texte de Andrias Sundskarð dans ma page widget.php. Je ne trouve pas la fonction “wp_widget_recent_comments » dans mon fichier ! Peux tu m’aider STP ?
Un grand merci encore
Laurent
@Laurent Tu trouveras la fonction dans le fichier default-widgets.php qui se trouve dans le répertoire /wp-includes de ton installation WordPress
Bonjour,désolé encore de te déranger, mais pourrais tu m’inserer le code au bon endroit, car j’ai une erreur de mon coté ? Voici mon code :
class WP_Widget_Recent_Comments extends WP_Widget {
function wp_widget_recent_comments($args) {
global $wpdb, $comments, $comment, $current_user;
extract($args, EXTR_SKIP);
$options = get_option(’widget_recent_comments’);
$title = empty($options[‘title’]) ? __(’Recent Comments’) : apply_filters(’widget_title’, $options[‘title’]);
if ( !$number = (int) $options[‘number’] )
$number = 5;
else if ( $number 15 )
$number = 15;
if ( !$comments = wp_cache_get( ‘recent_comments’, ‘widget’ ) ) {
$comments = $wpdb->get_results(« SELECT * FROM $wpdb->comments WHERE comment_approved = ‘1′ AND comment_post_ID NOT IN (SELECT post_id FROM » . $wpdb->prefix . « named_users WHERE (user_id » . $current_user->ID . » OR group_id NOT IN (SELECT group_id FROM » . $wpdb->prefix . « named_users_groups_relations WHERE user_id = » . $current_user->ID . « ))) ORDER BY comment_date_gmt DESC LIMIT $number »);
wp_cache_add( ‘recent_comments’, $comments, ‘widget’ );
}
?>
<?php
if ( $comments ) : foreach ( (array) $comments as $comment) :
echo ‘’ . sprintf(__(’%1$s on %2$s’), get_comment_author_link(), ‘comment_ID) . ‘ »>’ . get_the_title($comment->comment_post_ID) . ‘’) . ‘’;
endforeach; endif;?>
<?php
}
Merci beaucoup de ton aide.
Laurent
Désolé j’ai inséré le mauvais code, voici ce que j’ai dans mon default-widget.php :
class WP_Widget_Recent_Comments extends WP_Widget {
function WP_Widget_Recent_Comments() {
$widget_ops = array(‘classname’ => ‘widget_recent_comments’, ‘description’ => __( ‘The most recent comments’ ) );
$this->WP_Widget(‘recent-comments’, __(‘Recent Comments’), $widget_ops);
$this->alt_option_name = ‘widget_recent_comments’;
if ( is_active_widget(false, false, $this->id_base) )
add_action( ‘wp_head’, array(&$this, ‘recent_comments_style’) );
add_action( ‘comment_post’, array(&$this, ‘flush_widget_cache’) );
add_action( ‘transition_comment_status’, array(&$this, ‘flush_widget_cache’) );
}
Quand je remplace tout ça par le code de Andrias Sundskarð, j’ai une erreur en ligne 605 : $title = empty($options[‘title’]) ? __(’Recent Comments’) : apply_filters(’widget_title’, $options[‘title’]);
Merci vraiment beaucoup si tu peux m’aider
Laurent
@Laurent Après test, effectivement ce qui est préconisé dans le blog de l’auteur ne marche (plus) pas.
Après quelques essais j’ai fini par faire fonctionner le filtre sur les commentaires. Voici comment.
– édite le fichier default-widgets.php et cherche la fonction function widget( $args, $instance ) {
– dans cette fonction, repère la commande qui va chercher dans la base de données les commentaires if ( !$comments = wp_cache_get( ‘recent_comments’, ‘widget’ ) ) {
– modifie la ligne $comments = $wpdb->get_results… en ajoutant à la fin le code : … AND comment_post_ID NOT IN (SELECT post_id FROM » . $wpdb->prefix . « named_users WHERE (user_id » . wp_get_current_user()->ID . » OR group_id NOT IN (SELECT group_id FROM » . $wpdb->prefix . « named_users_groups_relations WHERE user_id = » . wp_get_current_user()->ID . « ))) ORDER BY comment_date_gmt DESC LIMIT 15 »);
(attention aux apostrophes doubles qui sont converties dans l’éditeur de commentaires).
Donc la ligne complète est : $comments = $wpdb->get_results(`SELECT $wpdb->comments.* FROM $wpdb->comments JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID WHERE comment_approved = `1` AND post_status = publish’ AND comment_post_ID NOT IN (SELECT post_id FROM » . $wpdb->prefix . « named_users WHERE (user_id » . wp_get_current_user()->ID . » OR group_id NOT IN (SELECT group_id FROM » . $wpdb->prefix . « named_users_groups_relations WHERE user_id = » . wp_get_current_user()->ID . « ))) ORDER BY comment_date_gmt DESC LIMIT 15 »);
Salut, merci beaucoup pour ton aide, je viens de faire la modif et j’ai une erreur en ligne 655 :
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /homepages/14/d298932328/htdocs/wp-includes/default-widgets.php on line 655
la ligne correspondante est : $instance[‘title’] = strip_tags($new_instance[‘title’]);
Puis je t’envoyer mon fichier complet ?
Merci encore
Laurent
@Laurent Voici le fichier default-widget.php corrigé : http://fanta78.lasnespace.com/wp-content/download/miscellanous/default-widgets(corrig%c3%a9).zip
C’est celui que j’ai utilisé pour vérifier, il devrait donc fonctionner 🙂
Tu es un Génie, impeccable !!!
Merci beaucoup de ton aide.
Bonne journée
Cordialement
Laurent
Article intéressant !
Je suis actuellement à la recherche d’un plugin similaire afin de pouvoir éditer la visibilité des articles suivant le niveau d’utilisateur (défini par Role Manager ou encore Capability Manager)
Aurais tu fais des découvertes dans ce domaine ?
Je n’ai pas utilisé Role Manager, juste les groupes par défaut de Worpdress. Du coup je ne sais pas si la combinaison wp-namedusers + Role-manager fonctionne, mais je doute, car wp-namedusers génère ses propres groupes.
A l’occasion je regarderai de plus près la combinaison de ces plugins et je te tiens au courant.
@fanta78
Sympa de ta part ! Car il est vrai qu’il serait tellement plus simple de regler le niveau minimum requis pour l’affichage de l’article/page directement sur le page d’édition !
Si ce plugin n’existe pas, dommage que mes connaissances en php soient au ras du sol afin de le créer !
Je ne vais pas non plus développer l’extension, mais par contre je vais fouiller 😉
Je vais tester cette extension, je te tiens au courant.
http://www.gm-alex.de/projects/wordpress/plugins/user-access-manager/
@fanta78
Nickel ! j’attends ton retour, je vais tester également de mon coté …
@The Alien User Access Manager me semble très complet et correspondre à ton besoin.
Il m’a l’air mieux que wp-nameduser, car il intègre les rôles standards et prend en compte les utilisateurs, articles, catégories et pages déjà existantes. Idéal quand tu installes de la sécurité sur un blog qui à déjà un bon vécu !
Je vais avoir besoin de temps pour comprendre et tester en détail cette extension – article à venir 😉
@fanta78
Il semblerait effectivement que cette extension réponde à mes attentes, je l’ai installé sur un de mes sites, et ne manquerait pas de te faire un feedback une fois que j’en aurais fait le tour, faut aussi que je vois si elle ne rentre pas en conflit avec Capability Manager… comme tu le dis : Affaire à suivre !
Pour le coup, je place ton lien sur mon site public !
@The Alien Je galère pour l’instant, Free ne fonctionne pas , ni Xamp avec cette extension… Je vais devoir employer les grands moyens…
J’en profite pour te faire passer le lien de la traduction du plugin wpNamedUsers : http://ramenetascience.com/wordpress/traduction-wpnamedusers/
Bonne journée à toi !
Bonjour et merci pour cet article qui donne exactement l’info que je cherchais.
Un problème rencontré néanmoins, après des tests en local (avec Xampp) : la page protégée affiche une erreur 404 lorsque logé avec les rôles « abonné », « contributeur » et « auteur » (pour éditeur et admin, pas de problème). Une explication ?
Je n’ai pas fait d’essai sur xampp mais directement sur un hébergeur. J’essaie à l’occasion et je te fais un retour sur ce point.
Bonjour,
Ce plugin est top le seule souci est lorsque l’on clique sur un lien du site renvoyant vers une page protégée (et que l’on est pas autorisé à voir la page). L’internaute dans mon cas est renvoyé sur la page Blog alors que je souhaiterais le renvoyer vers un formulaire d’enregistrement ! Je n’ai pas trouvé où paramétrer la redirection…
Si tu places une permission d’accès à une page pour un/des utilisateurs, le widget d’affichage des pages va masquer la page protégée tant que l’utilisateur n’est pas un de ceux qui sont autorisés.
Si par contre tu as mis un lien « en dur » vers un contenu protégé, via le widget de lien par exemple, tu devrais obtenir une page vide en lieu et place de l’adresse cliquée. En tout cas c’est le comportement que j’ai constaté.
Tu pourrais peut-être remplacer le lien direct vers la page privée par un lien passant par la page de connexion. Exemple, remplacer http://tonblog.com/index.php/pageprivee/ par http://tonblog.com/wp-login.php?redirect_to=http://tonblog.com/index.php/pageprivee/
Inconvénient, même déjà connecté un utilisateur repassera par la case login.
Autre possibilité, c’est de faire une page « publique » dans laquelle tu expliques que l’accès est privé et tu y places ton formulaire d’enregistrement. Ensuite, tu places toutes tes pages « privées » enfants de cette page publique.
Résultat, non connecté un utilisateur voit la page « publique » d’avertissement. Une fois connecté il voit les autres pages.