web-dev-qa-db-fra.com

Plusieurs utilisateurs - ne leur permettent de gérer leurs propres termes pour la taxonomie personnalisée que lorsqu'ils sont connectés

Comment permettre à chaque utilisateur de gérer ses propres termes pour une taxonomie personnalisée lorsqu'il est connecté à la page edit-tags? L'utilisateur affichera et gérera uniquement les termes créés par lui-même et non par d'autres pour une taxonomie personnalisée. Mais l'administrateur et l'éditeur peuvent tout gérer. Comment puis je faire ça?

Toute aide serait appréciée. Merci.

3
mha

Merci pour la solution IMPRESSIONNANTE MikeSchinkel: D

Je viens de faire les mises à jour suivantes dans le code et cela a fonctionné comme un charme:

add_filter('list_terms_exclusions', 'yoursite_list_terms_exclusions', 10, 2);

function yoursite_list_terms_exclusions( $exclusions ) {
    $currentScreen = get_current_screen();

    if( current_user_can( 'my_custom_capability_assigned_to_specific_users' )
            && !current_user_can( 'manage_options' ) // Show everything to Admin
            && is_object( $currentScreen )
            && $currentScreen->id == 'edit-<my_taxonomy>'
            && $currentScreen->taxonomy == '<my_taxonomy>' ) {
        // Get term_id's array that you want to show as per your requirement
        $terms      = implode( ',', $term_id );
        $exclusions = ( empty( $exclusions ) ? '' : $exclusions ) . ' AND' . ' t.`term_id` IN (' . $terms . ')';
    }
    return $exclusions;
}
2
Rashy

Hmmm. Vous allez devoir savoir qui a ajouté les termes que vous pouvez actuellement utiliser dans un champ usermeta sous forme de liste séparée par des virgules (je suppose que vous ne vous attendez pas à plus de ~ 1000 termes par vous inquiétez pas.)

Vous pouvez stocker les identifiants de terme dans le champ usermeta en utilisant le hook 'edited_terms' comme vous le voyez ici:

Fondamentalement, votre code pourrait ressembler à ceci "

add_filter('edited_terms', 'yoursite_edited_terms');
function yoursite_edited_terms($term_id) {
  if($_POST['taxonomy'] == 'your_taxonomy'): {
    $user = wp_get_current_user();
    if ($user->ID) {
      $terms = get_user_meta($user->ID,'users_terms_for_your_taxonomy');
      $terms = (empty($terms) ? $term_id : "{$terms},{$term_id}");
      update_user_meta($user->ID,'users_terms_for_your_taxonomy',$terms);
    }
  }
}

Ensuite, vous devrez utiliser le hook 'list_terms_exclusions' pour limiter vos termes à ceux nécessaires à l'utilisateur actuel, tout en permettant à l'administrateur un éditeur de les voir tous en ajoutant une fonctionnalité 'can_manage_all_terms' avec laquelle vous pouvez utiliser le Membres plugin pour créer:

Voici à quoi cela pourrait ressembler:

add_filter('list_terms_exclusions', 'yoursite_list_terms_exclusions', 10, 2);
function yoursite_list_terms_exclusions( $exclusions, $args ) {
  global $pagenow;
  if (current_user_can('can_manage_all_terms') && 
    $pagenow=='edit-tags.php?taxonomy=your_post_taxonomy') {
    $terms = get_user_meta($user->ID,'users_terms_for_your_taxonomy');
    $exclusions = " {$exclusions} AND t.ID NOT IN ({$terms})";
  }
  return $exclusions;
}

Je n'ai pas testé ce code mais il devrait vous mettre sur la bonne voie. Et assurez-vous de remplacer tout élément du code écrit en 'your_taxonomy' par une référence à votre taxonomie réelle.

3
MikeSchinkel