8768 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,
Ceci est la suite du sujet suivant : http://forum.alsacreations.com/topic-20-79767-1.html#p519536

J'ai créé un plugin (encore en cours de développement) afin de pouvoir gérer l'édition de ressources en se basant sur l'appartenance à un groupe. Je sais, je sais, ça existe déjà, et il y en a pas mal, mais je souhaitais faire quelque chose qui correspondait vraiment aux attentes du client, sans autres fioritures...
L'objectif : pouvoir partager une ressource dans le backend pour les personnes appartenant aux groupes choisis sans prendre en compte leur rôle (contributeur, auteur, éditeur,...).
Concrètement, j'ai créé une page d'options permettant de définir des groupes et l'appartenance à ces groupes pour chaque utilisateur. Voici une copie d'écran :
upload/3069-gestiongrou.png
Ensuite dans chaque post/page j'ajoute une metabox pour pouvoir sélectionner les groupes qui pourront avoir accès à la ressource pour la modifier :
upload/3069-metaboxchoi.png
Ce que je ne sais pas faire : comment "ouvrir" l'accès aux ressources aux différents utilisateurs appartenant aux groupes autorisés à l'éditer ? Je suppose qu'il y a un hook pour vérifier si un utilisateur a le droit d'éditer ou pas, mais je ne sais pas lequel.
J'espère avoir été plus clair que dans le précédent message. Merci pour votre aide/patience.
Smiley smile
Modifié par jojaba (23 Dec 2016 - 20:10)
Modérateur
Décidément, j'ai vraiment du mal à expliquer ce que je souhaite faire Smiley confus !
Merci Lionel en tout cas pour ta réponse.
Je voudrais qu'un utilisateur connecté et dans le backend de WordPress puisse éditer et modifier des pages/articles d'autres utilisateurs s'ils font partie du/des groupes autorisés à le faire (sans prendre en considération son rôle). Concrètement, si un utilisateur connecté au backend se retrouve sur le listing des articles, il doit pouvoir éditer les articles qui ont comme méta son groupe d'appartenance (par exemple, s'il appartient au groupe "chats", il faut qu'il puisse accéder à la fenêtre de composition de tous les articles ayant comme groupe autorisé "chats"). Je vais donner aux utilisateurs très peu de privilèges (contributeurs avec possibilité d'ajouter des images), ils doivent pouvoir modifier des articles d'autres utilisateurs (de rôles différents) s'ils font partie du groupe autorisé.
Modifié par jojaba (24 Dec 2016 - 08:24)
jojaba a écrit :
J'espère avoir été plus clair que dans le précédent message.

Oui Jojaba, pour moi la question est plus claire, mais je serais bien en peine de te conseiller (cf. ton MP).

En effet, je sais restreindre sur une page une capacité d'un utilisateur possédant déjà cette capacité (et encore, de manière imparfaite je pense). Par exemple, un utilisateur déjà rédacteur verra cette capacité restreinte aux pages "neutres" (sans groupe), aux pages de mêmes groupes que le sien, mais ne pourra pas rédiger sur une page possédant un groupe dont il ne fait pas partie.

L'approche inverse d'ajouter une capacité à l'utilisateur pour la page en cours (elle et l'utilisateur faisant partit du même groupe) me semble poser problème : les capacités utilisateurs sont enregistrées en base de donnée, via les fonctions add_role() et remove_role(), chaque modification de ces rôles via ces fonctions modifie donc la BDD. Il faudrait trouver un système pour revenir aux compétences initiales de l'utilisateur en fin de processus. À quel moment ou sur quelles action ? Et que se passerait-il en cas d'échec du script de "reset" une fois la capacité de rédaction ajoutée ? Réponse : l'utilisateur garderait cette capacité de rédaction pour toutes les autres pages du site, et ça, il ne vaux mieux pas l'envisager...
Modifié par Olivier C (24 Dec 2016 - 08:27)
Modérateur
Merci Olivier pour ton analyse.
Effectivement, la fonction proposée par Lionel est trop globale, il me faudrait un moyen de définir des privilèges pour chaque page, c'est bien pour ça que je crée des groupes. Peut-être faudrait-il ajouter les utilisateurs d'un même groupe dans la base de données en tant qu'auteurs des pages dont la méta est le groupe (il y aurait donc dans la colonne post_author des posts plusieurs id de rédacteurs). J'ai déjà utilisé le plugin Co-Authors sur un de mes sites. Il permet de définir plusieurs rédacteurs pour le même billet. Peut-être qu'elle sera une source d'inspiration... J'ai déjà un peu regardé, mais pas facile de trouver mon bonheur dans tous ces fichiers... Smiley ohwell .
**edit***
Peut-être créer une colonne supplémentaire dans wp_posts qui se nommerait par exemple "other_authors"...
**/edit***
Modifié par jojaba (24 Dec 2016 - 08:42)
Hello,

j'aurai créé des capacités avec Add cap et ensuite trié les posts en fonction de ces capacités avec pre get posts, par exemple.

A mon avis c'est plus simple d'enregistrer les "groupes" directement au niveau des fiches utilisateurs, dans les metas, car ensuite tu pourras trier tes posts en récupérant les données de l'utilisateur avec current_user_can('edit_dogs_cap').

Ce ne sont que des idées en vrac, en espérant que ça t'aide.
Modifié par bzh (24 Dec 2016 - 10:03)
bzh a écrit :
j'aurai créé des capacités avec Add cap...

Effectivement c'est déjà plus spécifique que add_role(), mais les problématiques soulevées précédemment restent entières.
Le fait de rajouter/supprimer des capacités à un utilisateur ?

Je ne sais pas si je comprend bien ce dont tu parles dans ton avant dernier message mais je crois qu'il faut créer des capacités différentes que celles qui existent déjà dans wordpress et se servir des hook pour autoriser l'édition ou l'affichage.

Modifier les capacités selon le cas de figure ne me parait pas une bonne piste.
Modérateur
Bonjour à tous,
J'ai finalement trouvé une solution pas trop compliqué à mettre en place, pas tout à fait user-friendly, mais qui fait l'affaire.
Je rappelle qu'il fallait que je puisse donner des permissions d'édition de pages aux auteurs appartenant à des groupes autorisés.
J'ai finalement donné les autorisations à tous les auteurs pour modifier les pages créées par d'autres utilisateurs. Voici ce que j'ai mis dans mon fichier functions.php (j'ai également donné la possibilité aux auteurs de modifier les articles des autres) :
function add_jjb_author_role_caps(){
  global $pagenow;

  // gets the author role
  $role = get_role( 'author' );

  if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){
    // Theme is activated
    $role->add_cap( 'edit_pages' );
    $role->add_cap( 'publish_pages' );
    $role->add_cap( 'edit_published_pages' );
	$role->add_cap( 'edit_others_pages' );
	$role->add_cap( 'edit_others_posts' );
  } else {
    // Theme is deactivated
    // Remove the capacity when theme is deactivated
    $role->remove_cap( 'edit_pages' );
    $role->remove_cap( 'publish_pages' ); 
    $role->remove_cap( 'edit_published_pages' );
	$role->remove_cap( 'edit_others_pages' );
	$role->remove_cap( 'edit_others_posts' );
  }
}
add_action( 'load-themes.php', 'add_jjb_author_role_caps' );

Ensuite, le truc est de laisser éditer tout le monde toutes les ressources mais de vérifier au chargement de la page d'édition si l'utilisateur courant est bien autorisé à le faire (se trouve dans un des groupes autorisés). S'il n'est pas autorisé à éditer la ressource, on envoie un "wp_die" (avec un lien de retour dans l'exemple ci-dessous).
<?php
function jjbum_edit_check() {
	if (isset($_GET['action']) && $_GET['action'] == 'edit') {
	$post_id = $_GET['post'];
	 $c_user = wp_get_current_user();
	 // checking only for authors
	 if ($c_user->roles[0] == 'author') {
		 // let's check if the author has the right to access this page/post (must be in a allowed post group)
		$current_user_id = $c_user->ID;
		$post_author_id = get_post_field( 'post_author', $post_id );
		$post_groups = (null != get_post_meta($post_id, 'jjbum_p_groups')) ? get_post_meta($post_id, 'jjbum_p_groups') : array(array()) ;
		$user_groups = (null != get_user_meta($current_user_id, 'jjbum_u_groups')) ? get_user_meta($current_user_id, 'jjbum_u_groups') : array(array()) ;
		$array_same_values = array_intersect($post_groups[0], $user_groups[0]);
		// No edition if not in the right group and author is not the original author
		if ($post_author_id != $current_user_id && count($array_same_values) == 0) {
			wp_die( __('Sorry, you are not allowed to edit this page! Please contact the <a href="#">Authorisation Service</a> to get edition access to this resource.', 'jjb-user-management'), __('No permission', 'jjb-user-management'), array('response' => 500, 'back_link' => true));
		}
	 }
	}
}
add_action('load-post.php', 'jjbum_edit_check');
?>

Je ne vous explique pas en détail le code, c'est pas la panacée mais ça fonctionne et c'est relativement simple à comprendre... Smiley cligne
Merci encore à tous pour votre aide.
Modifié par jojaba (15 Jan 2017 - 06:45)