Hmmm. You are going to need to keep track of who added which terms which you can currently best do in a usermeta field as a comma-separated list (I'm assuming you don't expect more than ~1000 terms per user? At lot more than then I'd worry.)
You can store the term IDs in the usermeta field using the 'edited_terms'
hook as you see here:
Basically your code might look like this"
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);
}
}
}
Then you'll need to use the 'list_terms_exclusions'
hook to limit your terms to only the ones needed for the current user, but allowing the Administrator an Editor to see them all by adding a 'can_manage_all_terms'
capability which you can use the Members plugin to create:
Here's what that might look like:
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;
}
I haven't tested this code but it should get you on the right track. And be sure to replace anything in the code written as 'your_taxonomy'
with a reference to your actual taxonomy.