--- old/category-visibility.php	2005-06-30 21:22:39.000000000 +0200
+++ new/category-visibility.php	2005-06-30 21:22:52.000000000 +0200
@@ -231,11 +231,13 @@
 	$wpdb->query("DELETE FROM $cat_visibility WHERE cat_ID = '$cat_ID'");
 }
 
-function cv_posts_join($join) {
+function cv_join($join) {
 	global $wpdb;
 	global $cat_visibility;
 	global $wp_query;
-	if (!isset($wp_query->query_vars['category_name'])) // Avoid collissionss
+	// Avoid collissions
+	if (!strstr($join, 'post2cat'))
+	#if (!isset($wp_query->query_vars['category_name'])) 
 		$join .= " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id)";
 	$join .= " LEFT JOIN $cat_visibility ON ($wpdb->post2cat.category_id = $cat_visibility.cat_ID)";
 	return $join;
@@ -272,11 +274,25 @@
 	return $where;
 }
 
+function cv_archive_where($where) {
+	global $user_level;
+	global $cat_visibility;
+
+	get_currentuserinfo();
+	if (!is_numeric($user_level)) $user_level = -1;
+
+	return $where .
+			" AND $cat_visibility.archives=1" .
+			" AND $cat_visibility.user_level<=$user_level";
+}
+
 add_action('admin_menu', 'category_vis_menu');
 add_action('add_category', 'add_cat_visibility');
 add_action('delete_category', 'delete_cat_visibility');
-add_filter('posts_join', 'cv_posts_join');
+add_filter('posts_join', 'cv_join');
+add_filter('archive_join', 'cv_join');
 add_filter('posts_where', 'cv_posts_where');
+add_filter('archive_where', 'cv_archive_where');
 add_filter('list_cats', 'alter_vis_catlist');
 
 ?>

