Accueil > Wordpress > WordPress: publier des articles et des pages privés (part 1)

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é.

public_prive

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
une page d’erreur : « Vous n’avez aucun droit ».

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/

reglagewp1Elle 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.

nouvelles_tables

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)

  1. 27/05/2009 à 13:40 | #1

    Salut,
    wpnamedusers c’est exactement ce que je cherchais merci 😉

  2. darksonic
    01/06/2009 à 11:46 | #2

    Magnifique,

    Cela fait quelques jours que je recherchais une technique similaire
    Merci beaucoup de nous faire partager ton experience

  3. MrYapados
    31/07/2009 à 17:46 | #3

    Fantastique !! 😀

  4. Denis L
    28/08/2009 à 17:10 | #4

    Bonjour,
    As-tu francisé le module ?

  5. 28/08/2009 à 22:04 | #5

    @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

  6. 18/09/2009 à 17:23 | #6

    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

  7. 18/09/2009 à 17:49 | #7

    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

  8. 18/09/2009 à 18:09 | #8

    merci beaucoup du renseignement^^
    bonne continuation.

  9. 28/09/2009 à 10:53 | #9

    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?

  10. 28/09/2009 à 17:28 | #10

    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)

  11. pascal
    31/10/2009 à 11:22 | #11

    Exactement, ce je cherchais.

    Un grand merci

  12. 05/11/2009 à 23:49 | #12

    Merci ! Cette extension va m’être très utile.

  13. Gilbert Tordeur
    03/01/2010 à 14:09 | #13

    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.

  14. 08/01/2010 à 13:17 | #14

    @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/

  15. Laurent
    11/02/2010 à 17:33 | #15

    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

  16. 11/02/2010 à 20:52 | #16

    @Laurent Tu trouveras la fonction dans le fichier default-widgets.php qui se trouve dans le répertoire /wp-includes de ton installation WordPress

  17. laurent
    13/02/2010 à 00:52 | #17

    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

  18. laurent
    13/02/2010 à 01:03 | #18

    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

  19. 16/02/2010 à 15:04 | #19

    @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 »);

  20. Laurent
    18/02/2010 à 17:54 | #20

    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

  21. 19/02/2010 à 11:29 | #21

    @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 🙂

  22. Laurent
    19/02/2010 à 13:13 | #22

    Tu es un Génie, impeccable !!!
    Merci beaucoup de ton aide.
    Bonne journée
    Cordialement
    Laurent

  23. 18/03/2010 à 07:01 | #23

    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 ?

  24. 18/03/2010 à 13:01 | #24

    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.

  25. 18/03/2010 à 20:45 | #25

    @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 !

  26. 19/03/2010 à 15:12 | #26

    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/

  27. 20/03/2010 à 17:44 | #27

    @fanta78
    Nickel ! j’attends ton retour, je vais tester également de mon coté …

  28. 21/03/2010 à 20:44 | #28

    @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 😉

  29. 22/03/2010 à 10:09 | #29

    @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 !

  30. 23/03/2010 à 21:56 | #30

    @The Alien Je galère pour l’instant, Free ne fonctionne pas , ni Xamp avec cette extension… Je vais devoir employer les grands moyens…

  31. 05/04/2010 à 01:47 | #31

    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 !

  32. PH
    25/04/2010 à 16:55 | #32

    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 ?

  33. 28/04/2010 à 23:20 | #33

    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.

  34. Sam
    10/05/2010 à 08:17 | #34

    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…

  35. 10/05/2010 à 09:13 | #35

    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.

  1. 05/04/2010 à 01:36 | #1
  2. 11/03/2013 à 15:36 | #2
  3. 12/12/2013 à 18:46 | #3
  4. 05/02/2014 à 23:43 | #4