Masquer les articles des autres utilisateur sur WordPress

Publié le 29 décembre 2011 Optimisation technique de WordPress

S’il y a un élément où WordPress peut-être amélioré, c’est la gestion collaborative de son outil. Et c’est toujours aussi vrai malgré les améliorations apportées par la toute dernière version WordPress 3.3.

L’un des problèmes de WP, c’est que n’importe quel utilisateur peut voir tous les articles des autres, au lieu de ne voir que les siens. Heureusement, une simple fonction peut corriger ce problème.

Pourquoi afficher les contenus de tout le monde ?

Cela m’avait déjà choqué auparavant : pourquoi peut-on voir tous les articles des autres utilisateurs ? Cela n’a aucun intérêt.

Quand on est référenceur, cela permet juste en s’inscrivant de trouver des dizaines de sujets d’articles à créer. En d’autres termes, le fait que WordPress affiche la liste complète des articles des autres utilisateurs n’a pas vraiment d’intérêt, et peut même nuire à celui qui gère un site multi-utilisateur. Je pense notamment à ceux qui utilisent le CMS pour gérer un annuaire, un site de communiqués de presse ou de digglike.

WordPress affiche les articles de tous les utilisateurs
WordPress affiche les articles de tous les utilisateurs

Affichez uniquement les articles de l’utilisateur

Comme l’un de vous vient de me demander comment corriger ce problème, je me suis penché sur la question.

La solution a été donnée par Mark/t31os sur le site officiel de WordPress, et rien n’est plus simple à faire. Utilisez tout simplement le fichier functions.php de votre thème WordPress pour y ajouter ce code.

Code mis à jour le 02/04/2013 (code inital par Daniel Roch puis amélioré par Geekpress et Daniel Roch) :

  /**
    Ne montrer que ses posts à l'utilisateur
    *   
    */
  if ( is_admin()) {
  function seomix_adm_user_show_myposts($query) {
    global $user_level;
    if ($user_level < 5){
      global $user_ID;
      $query->set('author',$user_ID);
      unset($user_ID);
      $screen = get_current_screen();
      add_filter('views_'.$screen->id, 'seomix_adm_user_remove_post_counts');}
    return $query;}

  function seomix_adm_user_remove_post_counts($views) {
    $views = array_intersect_key($views, array_flip(array('mine','trash')));
    return $views;}
  add_filter('pre_get_posts', 'seomix_adm_user_show_myposts');
  }

Et voilà : désormais, les utilisateurs de votre blog WordPress ne verront que leurs articles, et pas ceux des autres.

Un auteur ou contributeur ne verra que ses articles WordPress
Un auteur ou contributeur ne verra que ses articles

Les utilisateurs administrateurs et éditeurs verront toujours la liste compète des contenus, tandis que les auteurs et contributeurs de votre blog WordPress ne verront que les leurs.

Source : WordPress.org

Daniel Roch

Fondateur, conférencier, auteur, consultant et expert SEO WordPress

48 Commentaires

Xavier Le 29 décembre 2011 à 9h38
Simple et efficace ! Je me garde ça sous le coude.

Merci d'avoir fait la recherche, je m’étais aussi déjà fait la remarque mais sans aller au fond des choses.
Vincent Le 29 décembre 2011 à 9h57
Super astuce ! C'est sur qu'en termes de gestion collaborative, Wordpress a encore de la marge de progression.

Si je comprends bien ton code, l'admin verra par contre tous les messages ?
Aymeric Le 29 décembre 2011 à 10h03
Merci! c'est vrai que sur certains blogs sur lesquelles j'ai des comptes auteur, le fait de voir les brouillons et ou sujets en attentes de modération m'a toujours étonné...
Gaëtan Le 29 décembre 2011 à 10h51
Je m'apprête justement à lancer un annuaire local en début d'année prochaine...

Super astuce !

Merci et bonnes fêtes !

Gaëtan - @lynkky
Communiqués de Presse Gratuits Le 29 décembre 2011 à 12h57
C'est marrant, j'ai implémenté ça il y a pile 10 jours sur mon blog collaboratif. Comme quoi les grands esprits se rencontrent ;)
Bert Le 29 décembre 2011 à 13h23
Sympa ce hack, faudrait juste pouvoir supprimer les liens du haut (Tous | Publiés | Planifié | Brouillons | En attente de relecture | Corbeille) et ce sera parfait.
Jeff Le 29 décembre 2011 à 15h18
Très bonne astuce qui permet aux curieux de rester dans le brouillard, solution mise en place et fonctionne parfaitement. Merci.

@Vincent : J'ai bien vérifié : l'admin garde tout ses droits.
Puntocano Le 30 décembre 2011 à 10h19
Cette astuce est bien sympa et je vais probablement l'appliquer sur mon site de CP.
Cependant, si on se place du côté des contributeurs, ce hack nous prive à priori d'une information non négligeable : on ne peut plus voir combien d'articles sont en attente de relecture. Et il devient donc difficile d'évaluer si les délais de validation sont rapides ou pas.
Screenfeed Le 31 décembre 2011 à 17h59
Joli!

Je ne savais pas que l'on pouvait encore utiliser les "user levels".
Une chose m'échappe tout de même. Étant donné que les 2 variables $user_level et $user_ID n'ont pas été modifiées, je ne vois pas l'utilité des 2 unset(). A mon sens cela pourrait même être contre-productif, mais je dois rater quelque chose sinon Mark/t31os ne les aurait pas mis.

Merci! :)
Axekap Le 06 janvier 2012 à 20h01
C'est vrai que lorsque MU est passé en natif, cette anomalie aurait pu être corrigée. Modification utile !
Diije Le 13 janvier 2012 à 14h01
Salut Daniel !
Merci pour cette astuce.

Est-ce que le "unset()" est vraiment utile ? Quel est l'avantage de l'utiliser ?

Je dis ça parce que je connaissais pas cette fonction :p
Loic Helias Le 13 janvier 2012 à 14h27
Ca c'est un bon hack pour WP! Merci de l'astuce Daniel.
Pensez à refaire la manipulation à chaque mise à jour!
Loic
Shelko Le 13 janvier 2012 à 15h13
Super ce hack, c'est qu'il y a un petit soucis de discrétion à ce niveau surtout sur les brouillons, car pour le reste une recherche sur le blog avec les mots clés en vue peut aussi être faite pour trouver de l'inspiration.
Daniel Roch Le 13 janvier 2012 à 16h52
@Diije : je pense que c'est pour éviter de garder en mémoire des variables inutiles
accessibilité web Le 17 janvier 2012 à 16h40
Bonjour,
unset() détruit la variable située entre ses parenthèses. Cela évite comme le dit @Daniel de réserver de la mémoire sur le serveur pour quelque chose dont on ne se sert plus.
Le hack est bien pensé en tout cas.
Diije Le 17 janvier 2012 à 17h05
En fait je m'interrogeais sur le fait qu'on "unset" une variable globale, et sur l'intérêt de la chose.

Si je ne m'abuse, PHP a une sorte de garbage collector, non ?

Merci pour vos réponses en tout cas, je tâcherai d'utiliser unset() à l'avenir.
Alain RONK Le 05 février 2012 à 14h00
Bonjour,

Tout d'abord merci pour vos infos précieuses !!!

Dans l'article "Affichez uniquement les articles de l'utilisateur" est-il possible de supprimer les infos regroupant la totalité des articles présents sur le site ?
Dans votre exemple : Tous (245) | Publiés (121) | Brouillons (124)

Par avance, merci !
Cordialement,
Alain RONK
Daniel Roch Le 06 février 2012 à 14h17
Théoriquement, je pense que oui, mais il faudrait chercher un peu pour trouver le hook qui permettrait cela.

Je regarderai cette semaine si c'est faisable ou non.
Alain RONK Le 06 février 2012 à 16h25
Bonjour Daniel et merci pour votre réponse.
J'ai pu contourner le problème, donc ne cherchez pas pour rien, ne perdez pas votre temps, le temps est précieux !

Néanmoins, j'ai une autre question...

Quand on charge une image pour l'insérer dans un article, on ouvre une boite de dialogue qui permet de charger l'image à partir de l'ordinateur, ou du web, ou de la galerie ou enfin, de Nextgen Gallery (quand celui ci est installé).

Est-il possible de charger l'image uniquement à partir de l'ordinateur ou au minimum, de supprimer l'onglet Nextgen Gallery ?

Encore merci pour votre aide précieuse !

Cordialement,
Alain RONK
Daniel Roch Le 06 février 2012 à 19h07
Là aussi, il faut que je creuse pour trouver le bon filtre, mais c'est tout à fait faisable.
Greg Le 06 février 2012 à 19h13
Cherche pas Daniel, j'ai répondu à cette même question sur mon blog ^^
Alain RONK Le 06 février 2012 à 22h02
Oui, Daniel, ne perdez pas votre temps !

Toutes mes excuses, je n'avais pas vu votre réponse...

Cordialement,
Alain
GeekPress Le 08 février 2012 à 2h33
Je viens de mettre l'astuce sur GeekPress et ça marche au poil ! Merci bien pour cette astuce qui me sera très utile. Si j'arrive à trouver un peu de temps libre, j'essayerai de me pencher sur les nombres totaux 'Tous', 'Publiés', etc...

Bon voilà j'ai trouvé (insomnie quand tu nous tiens...). En fait, il n'est pas possible de modifier les résultats totaux des différentes status. WordPress n'a pas fournit de hooks permettant d'agir dessus.

Par contre, on peut gérer la liste des status qui est affiché. Du coup, ils ne nous servent plus à rien si on ne peut pas avoir les décomptes finaux en fonction de l'utilisateur. Voici le code qui permet de supprimer "Les miens", "Publié", etc...

[pastacode lang="bash" provider="manual"]//************* Ne montrez que ses posts à l'utilisateur
function posts_for_current_author($query) {
global $user_level;

if($query->is_admin && $user_level < 5) {
global $user_ID;
$query->set('author', $user_ID);
unset($user_ID);

$screen = get_current_screen();
add_filter('views_'.$screen->id, 'remove_post_counts');

}
unset($user_level);
return $query;
}
add_filter('pre_get_posts', 'posts_for_current_author');

function remove_post_counts($status_links)
{
return unset($status_links);
$status_links;
}
[/pastacode]
Daniel Roch Le 08 février 2012 à 8h50
Bravo Geekpress, et merci pour cet ajout de code que je vais placer directement dans l'article. ;)
krysttof Le 08 février 2012 à 10h59
Ecran blanc avec la modif de GeekPress :(
Daniel Roch Le 08 février 2012 à 11h51
Effectivement, le code plantait. J'ai mise à jour le snippet de l'article pour corriger le bug.
GeekPress Le 08 février 2012 à 12h02
Erreur de ma part ou c'est la balise code qui a planter quelque part ?

J'ai pourtant le code sur mon blog :/
Daniel Roch Le 08 février 2012 à 12h20
A mon avis, simple erreur de copier/coller et d'encodage lors du commentaire. Mais c'est maintenant corrigé.
Julio Potier Le 08 mars 2012 à 10h50
Ho j'ai raté cet astuce !
Allez, j'ajoute mon grain de sel comme j'aime faire dans les astuces :p
Déjà, je vois 2/3 incohérence, Mark/t31os ou pas, ça reste un humain et il a droit à l'erreur.
Invoquer $user_ID et $user_level n'est pas recommandé car cela sera deprecated bientôt, c'est annoncé dans le core.
De plus, en faire un unset rends impossible une future utilisation, c'est tout de même étrange :o
Voici ma version qui utilise "wp_get_current_user()", et j'ai modifié aussi le filtre des liens des compteurs pour tout de même afficher le "Mine".
ps : Pour info, ceci :
[pastacode lang="bash" provider="manual"]unset( $var );
return $var;[/pastacode]
revient à faire
[pastacode lang="bash" provider="manual"]return null;[/pastacode]

Voici don mon grain de sel :
[pastacode lang="bash" provider="manual"] if( is_admin() ){
function postsforcurrentauthor( $query )
{
$user = wp_get_current_user();
if( $user->user_level < 5 ) {
$query->set( 'author', $user->ID );
$screen = get_current_screen();
add_filter( 'views_' . $screen->id, 'remove_post_counts' );
}
return $query;
}
add_filter( 'pre_get_posts', 'postsforcurrentauthor' );

function remove_post_counts( $views )
{
return (array)$views['mine'];
}
}
[/pastacode]

Bonne journée !
Céline - Graphiste Le 19 mars 2012 à 17h20
Est t'il possible de faire la même chose mais pour la bibliothèque média ?
Les auteurs et contributeurs ne vois que leurs images uniquement.
Daniel Roch Le 20 mars 2012 à 10h47
Théoriquement c'est faisable. Il faudrait que je me penche sur le code pour voir comment cacher ces éléments.
Alex Le 27 mars 2012 à 16h16
je vous remercie pour ces informations, je suis novice en wordpress et encore plus en php, le code c'est pas mon truc mais c'est très utile et ma question peut paraître bête mais le code donné doit-être coller après quoi dans fonction.php? car je fait des tests mais ça me met des erreurs ;-((((

merci pour votre aide et dsl c'est mes débuts ;-)
Daniel Roch Le 28 mars 2012 à 14h06
Il faut le coller entre la balise ‹?php du début et la balise ?› de la fin de votre fichier
Alex Le 28 mars 2012 à 16h13
merci super ça fonctionne, et savez vous s'il existe une extension simple qui permettrait de personnaliser l'interface du back office vraiment pour qu'il ne se rende pas forcément compte qu'il est sur WP? je suis un peu perdu au milieu de tous les plugins...

merci bcp
aalex57 Le 24 avril 2012 à 22h33
Merci pour l'astuce, cependant je viens de mettre cette astuce sur le blog, et étant administrateur de mon blog je ne vois plus que mes propres articles :/
ben Le 01 juin 2012 à 12h51
ha parfait le hook, par contre, on voit toujours le nombre d'articles total sur le "Tableau de bord".

Merci pour le partage :)
Pascal Gibert Le 28 mars 2013 à 20h43
Bonsoir, ce Hack pour la dernière version de WordPress ne fonctionne pas :-(
    Daniel Roch Le 02 avril 2013 à 11h46
    Bonjour Pascal : le code vient d'être corrigé et amélioré.
reg Le 04 juin 2013 à 9h33
Bonjour,
ce code est trés trés bien, seul souci il retire les custom fields (advanced custom fields) dans les posts dommage!

si quelqu'un a une solution, je suis preneur
Daniel Roch Le 05 juin 2013 à 8h55
@Reg : Cela vient du code suivant :
[pastacode lang="bash" provider="manual"]add_filter('views_'.$screen->id, 'seomix_adm_user_remove_post_counts');}[/pastacode]
Essaie de supprimer cette ligne.
reg Le 05 juin 2013 à 9h28
bonjour
merci pour ta réponse Daniel, j'ai supprimé ces 2 lignes et tj le même pb, cela doit être à cause du thème particulier que j'utilise.
Toutefois j'ai trouvé une autre solution pour ceux qui rencontrent ce pb
un plug in voici le lien

http://code.mincus.com/41/manage-your-posts-only-in-wordpress/

si quelqu'un a une solution pour ne pas que les utilisateurs voient la bibliothéque et donc les images des autres, je suis aussi preneur, si je trouve je vous en ferai profiter.
merci à vous tous!
    Daniel Roch Le 08 juin 2013 à 14h26
    Fais dans ce cas un essai avec mon code et sans le plugin concerné.
Martin Le 01 août 2013 à 12h11
Merci pour ce code qui est intéressant, seul souci il retire les custom fields (advanced custom fields) dans les posts même après avoir enlevé la ligne add_filter('views_...) .
Comment faire sans utiliser le plugin mentionné par reg?
Orphys Le 12 octobre 2013 à 13h14
Bonjour,
Est-il possible de faire la même chose mais dans le front du site ? C'est à dire qu'un utilisateur enregistré ne voit sur le site, que les articles que lui-même aurait écrit (c'est une demande étrange, mais c'est pour gérer des bibliothèques de classe).
    Daniel Roch Le 20 octobre 2013 à 10h08
    Oui, c'est techniquement faisable. Malheureusement, le code de cet article ne vous aidera pas pour faire cela car c'est un tout autre développement qu'il faudra réaliser
orphys Le 20 octobre 2013 à 10h24
Merci à vous pour la réponse. Je m'en vais chercher cela.
maxita Le 18 juin 2014 à 18h28
Même problème pour moi, il me faudrait cela mais dans le front du site et j ai beau fouiller depuis des jours je ne tombe pas sur le graal! Personne aurait une piste?
Taomas Le 05 août 2015 à 20h33
Superbe astuce, seulement je note un petit hic dans le cas ou l'auteur n'a pas encore posté d'article, celui-ci a alors accès à l'ensemble et peut les modifier à souhait !

J'ai l'impression que le système prend en compte ce hak uniquement à partir d'un article, pas avant ...

: / une amélioration peut-être ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *