function _pp_sseo_groups($group_labels) { $group_labels = array(); $groups = pp_get_groups('pp_group', array('skip_meta_types' => array('wp_role'))); foreach ($groups as $group) { $group_labels[$group->ID] = $group->name; } return $group_labels; }
function load_exceptions($via_item_source, $for_item_source, $via_item_type, $item_id, $args = array()) { global $wpdb, $wp_roles; $this->loaded_item_id = $item_id; if (!isset($this->current_exceptions)) { $this->current_exceptions = array(); $this->agent_info = array(); } $args = array_merge(compact('for_item_source', 'item_id'), array('for_item_type' => '', 'for_item_status' => ''), $args, array('cols' => 'e.agent_type, e.agent_id, e.operation, e.mod_type, i.eitem_id, i.assign_for', 'return_raw_results' => true, 'inherited_from' => '', 'assign_for' => '', 'hierarchical' => false)); $for_item_type = isset($args['for_item_type']) ? $args['for_item_type'] : $via_item_type; extract($args, EXTR_SKIP); if ('term' == $via_item_source && !$for_item_type) { unset($args['for_item_source']); $args['post_types'] = array(''); } //if ( 'term' == $for_item_source ) $args['cols'] .= ', e.for_item_type'; if (!empty($agent_type)) { $agents_by_type = array($agent_type => array()); } else { $agents_by_type = array(); } $exc = ppc_get_exceptions($args); foreach ($exc as $row) { pp_set_array_elem($this->current_exceptions, array($row->for_item_type, $row->operation, $row->agent_type, $row->agent_id, $row->assign_for, $row->mod_type)); $this->current_exceptions[$row->for_item_type][$row->operation][$row->agent_type][$row->agent_id][$row->assign_for][$row->mod_type] = $row->eitem_id; if (!isset($agents_by_type[$row->agent_type])) { $agents_by_type[$row->agent_type] = array(); } $agents_by_type[$row->agent_type][] = $row->agent_id; } foreach (array_keys($agents_by_type) as $agent_type) { $agents_by_type[$agent_type] = array_unique($agents_by_type[$agent_type]); $ids = $agents_by_type[$agent_type]; if (!empty($agent_id)) { $ids = array_merge($ids, (array) $agent_id); } // ajax passes in specific id(s) if ('user' == $agent_type) { $this->agent_info['user'] = $wpdb->get_results("SELECT ID, user_login as name, display_name FROM {$wpdb->users} WHERE ID IN ('" . implode("','", array_map('intval', $ids)) . "') ORDER BY user_login", OBJECT_K); } elseif ('pp_group' != $agent_type) { $args = array('ids' => $ids); $this->agent_info[$agent_type] = pp_get_groups($agent_type, $args); } } // retrieve info for all WP roles regardless of exception storage $_args = array('cols' => "ID, group_name AS name, metagroup_type, metagroup_id"); if (!empty($agent_id)) { // ajax usage $_args['ids'] = (array) $agent_id; } else { $_where = isset($agents_by_type['pp_group']) ? "ID IN ('" . implode("','", $agents_by_type['pp_group']) . "')" : " metagroup_type != 'wp_role'"; if (!($pp_only_roles = pp_get_option('supplemental_role_defs'))) { $pp_only_roles = array(); } $_args['where'] = " AND ( {$_where} OR ( metagroup_type = 'wp_role' AND metagroup_id NOT IN ('" . implode("','", $pp_only_roles) . "') ) )"; } $this->agent_info['pp_group'] = pp_get_groups('pp_group', $_args); $this->agent_info['wp_role'] = array(); // rekey WP role exceptions foreach ($this->agent_info['pp_group'] as $agent_id => $group) { if ('wp_role' == $group->metagroup_type) { /* if ( 'wp_anon' == $group->metagroup_id ) { unset( $this->agent_info['pp_group'][$agent_id] ); continue; } */ $this->agent_info['wp_role'][$agent_id] = (object) $this->agent_info['pp_group'][$agent_id]; if ($role_exists = isset($wp_roles->role_names[$group->metagroup_id])) { $this->agent_info['wp_role'][$agent_id]->name = $wp_roles->role_names[$group->metagroup_id]; } unset($this->agent_info['pp_group'][$agent_id]); if ($role_exists || in_array($group->metagroup_id, array('wp_anon', 'wp_all', 'wp_auth'))) { foreach (array_keys($this->current_exceptions) as $for_item_type) { foreach (array_keys($this->current_exceptions[$for_item_type]) as $op) { if (isset($this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id])) { $this->current_exceptions[$for_item_type][$op]['wp_role'][$agent_id] = (array) $this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id]; unset($this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id]); } } } } } } // don't include orphaned assignments in metabox tab count foreach (array_keys($this->current_exceptions) as $for_item_type) { foreach (array_keys($this->current_exceptions[$for_item_type]) as $op) { foreach (array_keys($this->current_exceptions[$for_item_type][$op]) as $agent_type) { $this->current_exceptions[$for_item_type][$op][$agent_type] = array_intersect_key($this->current_exceptions[$for_item_type][$op][$agent_type], $this->agent_info[$agent_type]); } } } // determine if inclusions are set for any agents $where = 'term' == $via_item_source ? "AND e.via_item_type = '{$via_item_type}'" : ''; $where .= 'term' == $via_item_source ? '' : " AND e.for_item_source = '{$for_item_source}'"; $query_users = isset($this->agent_info['user']) ? array_keys($this->agent_info['user']) : array(); if (!empty($args['agent_type']) && 'user' == $args['agent_type'] && !empty($args['agent_id'])) { $query_users = array_merge($query_users, (array) $args['agent_id']); } $user_clause = $query_users ? "OR ( e.agent_type = 'user' AND e.agent_id IN ('" . implode("','", $query_users) . "') )" : ''; //$agents_clause = "( ( e.agent_type = 'pp_group' AND e.agent_id IN ('" . implode( "','", array_keys($this->agent_info['wp_role']) ) . "') ) $user_clause )"; $agents_clause = "( ( e.agent_type = 'pp_group' ) {$user_clause} )"; $_assignment_modes = $hierarchical ? array('item', 'children') : array('item'); // Populate only for wp roles, groups and users with stored exceptions. Will query for additional individual users as needed. foreach ($_assignment_modes as $_assign_for) { $results = $wpdb->get_results("SELECT DISTINCT e.agent_type, e.agent_id, e.operation, e.for_item_type FROM {$wpdb->ppc_exceptions} AS e INNER JOIN {$wpdb->ppc_exception_items} AS i ON e.exception_id = i.exception_id WHERE {$agents_clause} AND i.assign_for = '{$_assign_for}' AND e.mod_type = 'include' {$where}"); foreach ($results as $row) { //$_agent_type = ( 'pp_group' == $row->agent_type ) ? 'wp_role' : $row->agent_type; if ('pp_group' == $row->agent_type && in_array($row->agent_id, array_keys($this->agent_info['wp_role']))) { $_agent_type = 'wp_role'; } else { $_agent_type = $row->agent_type; } pp_set_array_elem($this->inclusions_active, array($row->for_item_type, $row->operation, $_agent_type, $row->agent_id, $_assign_for)); $this->inclusions_active[$row->for_item_type][$row->operation][$_agent_type][$row->agent_id][$_assign_for] = true; } } }
$omit_users = $wpdb->get_col("SELECT u.ID FROM {$wpdb->users} AS u INNER JOIN {$wpdb->pp_group_members} AS gm ON u.ID = gm.user_id INNER JOIN {$wpdb->pp_groups} AS g ON gm.group_id = g.ID WHERE g.metagroup_type = 'wp_role' AND g.metagroup_id IN ('{$role_csv}')"); } } foreach ($results as $row) { if (!in_array($row->ID, $omit_users)) { if (defined('PP_USER_RESULTS_DISPLAY_NAME')) { $title = $row->user_login != $row->display_name ? " title='" . esc_attr($row->user_login) . "'" : ''; echo "<option value='{$row->ID}' class='pp-new-selection'{$title}>{$row->display_name}</option>"; } else { $title = $row->user_login != $row->display_name ? " title='" . esc_attr($row->display_name) . "'" : ''; echo "<option value='{$row->ID}' class='pp-new-selection'{$title}>{$row->user_login}</option>"; } } } } } else { $reqd_caps = apply_filters('pp_edit_groups_reqd_caps', array('pp_edit_groups')); // determine all currently stored groups (of any status) for user in question (not necessarily logged user) if (!empty($agent_id)) { $omit_groups = pp_get_groups_for_user($agent_id, $agent_type, array('status' => 'any')); } else { $omit_groups = array(); } if ($groups = pp_get_groups($agent_type, array('filtering' => true, 'include_norole_groups' => false, 'reqd_caps' => $reqd_caps, 'search' => $search_str))) { foreach ($groups as $row) { if ((empty($row->metagroup_id) || is_null($row->metagroup_id)) && !isset($omit_groups[$row->ID])) { echo "<option value='{$row->ID}'>{$row->name}</option>"; } } } }
public static function flt_users_custom_column($content = '', $column_name, $id) { switch ($column_name) { case 'pp_groups': global $wp_list_table; //if ( ! $agent_type = apply_filters( 'pp_query_group_type', '' ) ) // $agent_type = 'pp_group'; static $all_groups; static $all_group_types; if (!isset($all_groups)) { $all_groups = array(); $all_group_types = pp_get_group_types(array('editable' => true)); } $all_group_names = array(); foreach ($all_group_types as $agent_type) { if (!isset($all_groups[$agent_type])) { $all_groups[$agent_type] = pp_get_groups($agent_type); } if (empty($all_groups[$agent_type])) { continue; } $group_names = array(); if ($group_ids = pp_get_groups_for_user($id, $agent_type, array('cols' => 'id', 'query_user_ids' => array_keys($wp_list_table->items)))) { foreach (array_keys($group_ids) as $group_id) { if (isset($all_groups[$agent_type][$group_id])) { if (empty($all_groups[$agent_type][$group_id]->metagroup_type) || 'wp_role' != $all_groups[$agent_type][$group_id]->metagroup_type) { $group_names[$all_groups[$agent_type][$group_id]->name] = $group_id; } } } if ($group_names) { uksort($group_names, "strnatcasecmp"); foreach ($group_names as $name => $_id) { if (defined('PP_USERS_UI_GROUP_FILTER_LINK')) { $url = add_query_arg('pp_group', $_id, $_SERVER['REQUEST_URI']); $all_group_names[] = "<a href='{$url}'>{$name}</a>"; } else { $all_group_names[] = "<a href='" . "admin.php?page=pp-edit-permissions&action=edit&agent_type={$agent_type}&agent_id={$_id}'>{$name}</a>"; } } //$group_names = array_merge( $group_names, $this_group_names ); } } } return implode(", ", $all_group_names); break; case 'pp_roles': global $wp_list_table, $wp_roles; static $role_info; $role_str = ''; if (!isset($role_info)) { $role_info = ppc_count_assigned_roles('user', array('query_agent_ids' => array_keys($wp_list_table->items))); } $user_object = new WP_User((int) $id); static $hide_roles; if (!isset($hide_roles)) { $hide_roles = !defined('bbp_get_version') ? array('bbp_participant', 'bbp_moderator', 'bbp_keymaster', 'bbp_blocked', 'bbp_spectator') : array(); $hide_roles = apply_filters('pp_hide_roles', $hide_roles); } $user_object->roles = array_diff($user_object->roles, $hide_roles); $role_titles = array(); foreach ($user_object->roles as $role_name) { if (isset($wp_roles->role_names[$role_name])) { $role_titles[] = $wp_roles->role_names[$role_name]; } } if (isset($role_info[$id]) && isset($role_info[$id]['roles'])) { $role_titles = array_merge($role_titles, array_keys($role_info[$id]['roles'])); } $display_limit = 3; if (count($role_titles) > $display_limit) { $excess = count($role_titles) - $display_limit; $role_titles = array_slice($role_titles, 0, $display_limit); $role_titles[] = sprintf(__('%s more', 'pp'), $excess); } $role_str = '<span class="pp-group-site-roles">' . implode(', ', $role_titles) . '</span>'; if (current_user_can('edit_user', $id) && current_user_can('pp_assign_roles')) { $edit_link = "admin.php?page=pp-edit-permissions&action=edit&agent_id={$id}&agent_type=user"; $role_str = "<a href=\"{$edit_link}\">{$role_str}</a><br />"; } return $role_str; break; case 'pp_exceptions': global $wp_list_table; return ppc_list_agent_exceptions('user', $id, array('query_agent_ids' => array_keys($wp_list_table->items))); break; default: return $content; } }
function pp_nav_menu_item_group_meta_box($object, $post_type) { global $_nav_menu_placeholder, $nav_menu_selected_id; $post_type_name = $post_type['args']->name; // paginate browsing for large numbers of post objects $per_page = 50; $pagenum = isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged']) ? absint($_REQUEST['paged']) : 1; $offset = 0 < $pagenum ? $per_page * ($pagenum - 1) : 0; $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false); if ('attachment' == $post_type_name) { $args['post_status'] = 'inherit'; } /* if ( isset( $post_type['args']->_default_query ) ) $args = array_merge($args, (array) $post_type['args']->_default_query ); $get_posts = new WP_Query; $posts = $get_posts->query( $args ); if ( ! $get_posts->post_count ) { */ if (!($posts = pp_get_groups($post_type_name))) { echo '<p>' . __('No items.') . '</p>'; return; } //$post_type_object = get_post_type_object($post_type_name); $post_type_object = pp_get_group_type_object($post_type_name); //$num_pages = $get_posts->max_num_pages; $num_pages = 1; $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('«'), 'next_text' => __('»'), 'total' => $num_pages, 'current' => $pagenum)); if (!$posts) { $error = '<li id="error">' . $post_type['args']->labels->not_found . '</li>'; } $db_fields = false; /* if ( is_post_type_hierarchical( $post_type_name ) ) { $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' ); } */ $db_fields = array('parent' => 'post_parent', 'id' => 'ID'); $walker = new PP_Walker_Nav_Menu_Checklist($db_fields); $current_tab = 'most-recent'; if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) { $current_tab = pp_sanitize_key($_REQUEST[$post_type_name . '-tab']); } /* if ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) { $current_tab = 'search'; } */ $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce'); ?> <div id="posttype-<?php echo $post_type_name; ?> " class="posttypediv"> <ul id="posttype-<?php echo $post_type_name; ?> -tabs" class="posttype-tabs add-menu-item-tabs"> <li <?php echo 'most-recent' == $current_tab ? ' class="tabs"' : ''; ?> ><a class="nav-tab-link" href="<?php if ($nav_menu_selected_id) { echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args))); } ?> #tabs-panel-posttype-<?php echo $post_type_name; ?> -most-recent"><?php _e('Most Recent'); ?> </a></li> <li <?php echo 'all' == $current_tab ? ' class="tabs"' : ''; ?> ><a class="nav-tab-link" href="<?php if ($nav_menu_selected_id) { echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args))); } ?> #<?php echo $post_type_name; ?> -all"><?php _e('View All'); ?> </a></li> <!-- <li -search </li> --> </ul> <div id="tabs-panel-posttype-<?php echo $post_type_name; ?> -most-recent" class="tabs-panel <?php echo 'most-recent' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive'; ?> "> <ul id="<?php echo $post_type_name; ?> checklist-most-recent" class="categorychecklist form-no-clear"> <?php //$recent_args = array_merge( $args, array( 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) ); //$most_recent = $get_posts->query( $recent_args ); $_args = array('skip_meta_types' => 'wp_role', 'order_by' => 'ug.add_date_gmt DESC'); global $wpdb; $groups_table = apply_filters('pp_use_groups_table', $wpdb->pp_groups, $post_type_name); $group_members_table = apply_filters('pp_use_group_members_table', $wpdb->pp_group_members, $post_type_name); $_args['join'] = "INNER JOIN {$group_members_table} AS ug ON {$groups_table}.ID = ug.group_id"; $most_recent = pp_get_groups($post_type_name, $_args); foreach (array_keys($most_recent) as $key) { $most_recent[$key]->object_id = $posts[$key]->ID; $most_recent[$key]->title = $posts[$key]->name; $most_recent[$key]->post_parent = 0; //$most_recent[$key]->post_type = $post_type_name; $most_recent[$key]->custom_source = $post_type_name; } $args['walker'] = $walker; echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args); ?> </ul> </div><!-- /.tabs-panel --> <!-- search <div class="tabs-panel"> </div> --> <div id="<?php echo $post_type_name; ?> -all" class="tabs-panel tabs-panel-view-all <?php echo 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive'; ?> "> <?php if (!empty($page_links)) { ?> <div class="add-menu-item-pagelinks"> <?php echo $page_links; ?> </div> <?php } ?> <ul id="<?php echo $post_type_name; ?> checklist" class="list:<?php echo $post_type_name; ?> categorychecklist form-no-clear"> <?php $db_fields = array('parent' => 'post_parent', 'id' => 'ID'); $walker = new PP_Walker_Nav_Menu_Checklist($db_fields); $args['walker'] = $walker; /* // kevinB: add "(none)" item for include exceptions $front_page_obj = (object) array( 'ID' => 0, 'post_parent' => 0, 'post_content' => '', 'post_excerpt' => '', 'post_title' => __( '(none)', 'pp' ), 'object_id' => 0, 'title' => __( '(none)', 'pp' ), 'menu_item_parent' => 0, 'db_id' => 0 ); $front_page_obj->_add_to_top = true; $front_page_obj->label = __( '(none)', 'pp' ); array_unshift( $posts, $front_page_obj ); $posts = apply_filters( 'nav_menu_items_'.$post_type_name, $posts, $args, $post_type ); */ $_args = array('skip_meta_types' => 'wp_role'); $posts = pp_get_groups($post_type_name, $_args); foreach (array_keys($posts) as $key) { $posts[$key]->object_id = $posts[$key]->ID; $posts[$key]->title = $posts[$key]->name; $posts[$key]->post_parent = 0; //$posts[$key]->post_type = $post_type_name; $posts[$key]->custom_source = $post_type_name; } $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args); if ('all' == $current_tab && !empty($_REQUEST['selectall'])) { $checkbox_items = preg_replace('/(type=(.)checkbox(\\2))/', '$1 checked=$2checked$2', $checkbox_items); } echo $checkbox_items; ?> </ul> <?php if (!empty($page_links)) { ?> <div class="add-menu-item-pagelinks"> <?php echo $page_links; ?> </div> <?php } ?> </div><!-- /.tabs-panel --> <p class="button-controls"> <span class="list-controls"> <a href="<?php echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args))); ?> #posttype-<?php echo $post_type_name; ?> " class="select-all"><?php _e('Select All'); ?> </a> </span> <span class="add-to-menu"> <img class="waiting" style="display:none" src="<?php echo esc_url(admin_url('images/wpspin_light.gif')); ?> " alt="" /> <input type="submit"<?php disabled($nav_menu_selected_id, 0); ?> class="button-secondary submit-add-<?php echo $post_type_name; ?> -exception" value="<?php esc_attr_e('Add Exceptions', 'pp'); ?> " name="add-post-type-menu-item" id="submit-posttype-<?php echo $post_type_name; ?> " /> </span> </p> </div> <!-- /.posttypediv --> <?php }
public static function _current_exceptions_ui($exc_results, $args = array()) { global $pp_admin, $pp_role_defs, $pp_data_sources; $defaults = array('read_only' => false, 'class' => 'pp-group-roles', 'item_links' => false, 'caption' => '', 'link' => '', 'agent_type' => ''); $args = array_merge($defaults, $args); extract($args); if (!$exc_results) { return; } if (!$caption) { $caption = 'user' == $agent_type ? sprintf(__('Exceptions %1$s(for user)%2$s', 'pp'), '<small>', '</small>') : __('Exceptions', 'pp'); } require_once PPC_ABSPATH . '/lib/ancestry_lib_pp.php'; $can_assign = current_user_can('pp_assign_roles') && pp_bulk_roles_enabled(); $exceptions = array_fill_keys(array_merge(array('term', 'post'), pp_get_group_types()), array()); $item_paths = array_fill_keys(array_keys($exceptions), array(__('(none)', 'pp'))); // support imported include exception with no items included $post_types = pp_get_enabled_post_types(array(), 'names'); $taxonomies = pp_get_enabled_taxonomies(array('object_type' => false), 'names'); foreach ($exc_results as $row) { // object_type not strictly necessary here, included for consistency with term role array switch ($row->via_item_source) { case 'term': if ($row->item_id) { $taxonomy = ''; $term_id = (int) pp_ttid_to_termid($row->item_id, $taxonomy); if ($row->item_id) { $item_paths['term'][$row->item_id] = PP_Ancestry::get_term_path($term_id, $taxonomy); } $via_type = $taxonomy; } else { $via_type = $row->via_item_type; } break; case 'post': if ($row->item_id) { $item_paths['post'][$row->item_id] = PP_Ancestry::get_post_path($row->item_id); } // no break // no break default: if (pp_group_type_exists($row->via_item_source)) { static $groups_by_id; if (!isset($groups_by_id)) { $groups_by_id = array(); } if (!isset($groups_by_id[$row->via_item_source])) { $groups_by_id[$row->via_item_source] = array(); foreach (pp_get_groups($row->via_item_source, array('skip_meta_types' => 'wp_role')) as $group) { $groups_by_id[$row->via_item_source][$group->ID] = $group->name; } } if (isset($groups_by_id[$row->via_item_source][$row->item_id])) { $item_paths[$row->via_item_source][$row->item_id] = $groups_by_id[$row->via_item_source][$row->item_id]; } $via_type = $row->via_item_source; } else { $via_type = $row->via_item_type ? $row->via_item_type : $row->for_item_type; } } if (!isset($exceptions[$row->via_item_source][$via_type])) { $exceptions[$row->via_item_source][$via_type] = array(); } if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type])) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type] = array(); } if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation])) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation] = array(); } if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type])) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type] = array(); } if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status])) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status] = array(); } if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id])) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id] = array(); } $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id][$row->assign_for] = $row->eitem_id; if (!empty($row->inherited_from)) { $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id]['inherited_from'] = $row->inherited_from; } } echo '<div style="clear:both;"></div>' . "<div id='pp_current_exceptions' class='pp-group-box {$class}'>" . '<h3>'; if ($link) { echo "<a href='{$link}'>{$caption}</a>"; } else { echo $caption; } echo '</h3>'; echo '<div>'; echo '<div id="pp_current_exceptions_inner">'; //ksort( $type_roles ); if (empty($_REQUEST['all_types']) && !empty($exceptions['post'])) { $all_types = array_fill_keys(array_merge($post_types, $taxonomies, array('')), true); $all_types = array_diff_key($all_types, array('topic' => true, 'reply' => true)); // hide topic, reply assignments even if they are somehow saved/imported without inherited_from value $exceptions['post'] = array_intersect_key($exceptions['post'], $all_types); foreach (array_keys($exceptions['post']) as $key) { $exceptions['post'][$key] = array_intersect_key($exceptions['post'][$key], $all_types); } } foreach (array_keys($exceptions) as $via_src) { ksort($exceptions[$via_src]); foreach (array_keys($exceptions[$via_src]) as $via_type) { if ($via_type_obj = pp_get_type_object($via_src, $via_type)) { $via_type_caption = $via_type_obj->labels->singular_name; } else { continue; } $any_redundant = false; echo "<div id='pp_current_{$via_src}_{$via_type}_roles' class='pp-current-exceptions'>"; /* if ( 'term' == $via_src ) echo '<h4>' . __( 'Per-Term:', 'pp' ) . '</h4>'; else { if ( $object_type ) echo '<h4>' . sprintf( __( 'Per-%s:', 'pp' ), $type_caption ) . '</h4>'; else echo '<h4>' . sprintf( __( 'Per-object:', 'pp' ), $type_caption ) . '</h4>'; } echo '<h4>' . sprintf( __( '%s Exceptions', 'pp' ), $via_type_caption ) . '</h4>'; */ ksort($exceptions[$via_src][$via_type]); foreach (array_keys($exceptions[$via_src][$via_type]) as $for_type) { if (pp_group_type_exists($for_type)) { $for_src = $for_type; } else { $for_src = taxonomy_exists($for_type) || !$for_type ? 'term' : 'post'; } if (!$for_type) { $for_type_obj = (object) array('labels' => (object) array('singular_name' => __('(all post types)', 'pp'))); } elseif (!($for_type_obj = pp_get_type_object($for_src, $for_type))) { continue; } foreach (array_keys($exceptions[$via_src][$via_type][$for_type]) as $operation) { if (!($operation_obj = pp_get_op_object($operation, $for_type))) { continue; } if ('assign' == $operation) { $op_caption = $for_type ? sprintf(__('%1$s (%2$s: %3$s)', 'pp'), $operation_obj->label, $for_type_obj->labels->singular_name, $via_type_caption) : sprintf(__('%1$s %2$s %3$s', 'pp'), $operation_obj->label, $via_type_caption, $for_type_obj->labels->singular_name); } elseif (in_array($operation, array('manage', 'associate'))) { $op_caption = sprintf(__('%1$s %2$s', 'pp'), $operation_obj->label, $via_type_caption); } else { $op_caption = sprintf(__('%1$s %2$s', 'pp'), $operation_obj->label, $for_type_obj->labels->singular_name); } echo "<div class='type-roles-wrapper'>"; echo '<h4>' . $op_caption . '</h4>'; echo "<div class='pp-current-type-roles'>"; echo '<div class="pp-current-roles-tbl-wrapper"><table>'; // fill table body (item assignments for each role) echo '<tbody>'; foreach (array_keys($exceptions[$via_src][$via_type][$for_type][$operation]) as $mod_type) { if (!($mod_type_obj = pp_get_mod_object($mod_type))) { continue; } foreach (array_keys($exceptions[$via_src][$via_type][$for_type][$operation][$mod_type]) as $status) { if ($status) { $_status = explode(':', $status); if (count($_status) > 1) { $attrib = $_status[0]; $_status = $_status[1]; } else { $attrib = 'post_status'; $_status = $status; } if ('post_status' == $attrib) { if ($status_obj = get_post_status_object($_status)) { $status_label = $status_obj->label; } elseif ('{unpublished}' == $_status) { // @todo: API $status_label = __('unpublished', 'pp'); } else { $status_label = $status; } } else { $status_label = $status; } $mod_caption = sprintf(__('%1$s (%2$s)', 'pp'), $mod_type_obj->label, $status_label); } else { $mod_caption = $mod_type_obj->label; } if ('exclude' == $mod_type && !empty($exceptions[$via_src][$via_type][$for_type][$operation]['include'])) { $tr_class = ' class="pp_faded"'; $mod_caption = sprintf(__('* %s', 'pp'), $mod_caption); $any_faded = true; } else { $tr_class = ''; } echo "<tr{$tr_class}><td class='pp_item_role_caption'>{$mod_caption}</td>"; echo '<td>'; //if ( $item_links ) { // if ( 'term' != $scope ) // $edit_url_base = $pp_data_sources->member_property( $item_source, '_edit_link' ); //} echo "<div class='pp-role-terms-wrapper pp-role-terms-{$via_type}'>"; if ('term' == $via_src && !in_array($operation, array('manage', 'associate'))) { if (taxonomy_exists($via_type)) { // "Categories:" $tx_obj = get_taxonomy($via_type); $tx_caption = $tx_obj->labels->name; } else { $tx_caption = ''; } echo '<div class="pp-taxonomy-caption">' . sprintf(__('%s:', 'pp'), $tx_caption) . '</div>'; //$edit_url_base = ( isset($tx_obj->_edit_link) ) ? $tx_obj->_edit_link : ''; } echo '<div class="pp-role-terms">'; $tx_item_paths = array_intersect_key($item_paths[$via_src], $exceptions[$via_src][$via_type][$for_type][$operation][$mod_type][$status]); uasort($tx_item_paths, 'strnatcasecmp'); // sort by array values, but maintain keys ); foreach ($tx_item_paths as $item_id => $item_path) { //$assignment = $roles[$scope][$role_name][$item_source][$item_type][$item_id]; $assignment = $exceptions[$via_src][$via_type][$for_type][$operation][$mod_type][$status][$item_id]; $classes = array(); if (isset($assignment['children'])) { if (isset($assignment['item'])) { $ass_id = $assignment['item'] . ',' . $assignment['children']; $classes[] = 'role_both'; $any_both = true; } else { $ass_id = '0,' . $assignment['children']; $classes[] = 'role_ch'; $any_child_only = true; } } else { $ass_id = $assignment['item']; } $class = $classes ? "class='" . implode(' ', $classes) . "'" : ''; if ($read_only) { if ($item_links) { //$item_edit_url = sprintf($edit_url_base, $item_id); $item_edit_url = ''; echo "<div><a href='{$item_edit_url}' {$class}>{$item_path}</a></div>"; } else { echo "<div><span {$class}>{$item_path}</span></div>"; } } else { $cb_id = 'pp_edit_exception_' . str_replace(',', '_', $ass_id); if (!empty($assignment['inherited_from'])) { $classes[] = 'inherited'; $classes[] = "from_{$assignment['inherited_from']}"; } if ($tr_class) { // apply fading for redundantly stored exclusions $classes[] = $tr_class; } $lbl_class = $classes ? "class='" . implode(' ', $classes) . "'" : ''; if ('term' == $via_src) { $edit_url = admin_url("edit-tags.php?taxonomy={$via_type}&action=edit&tag_ID=" . pp_ttid_to_termid($item_id, $via_type) . "&post_type={$for_type}"); } else { $edit_url = admin_url("post.php?post={$item_id}&action=edit"); } echo "<div><label for='{$cb_id}' {$lbl_class}><input id='{$cb_id}' type='checkbox' name='pp_edit_exception[]' value='{$ass_id}' {$class}> " . $item_path . '</label><a href="' . $edit_url . '">' . __('edit') . '</a></div>'; } } // end foreach item if (count($tx_item_paths) > 3 && !$read_only) { $cb_id = "pp_check_all_{$via_src}_{$via_type}_{$for_type}_{$operation}_{$status}"; echo "<div><label for='{$cb_id}'><input type='checkbox' id='{$cb_id}' class='pp_check_all'> " . __('(all)', 'pp') . '</label></div>'; } echo '</div></div>'; // pp-role-terms, pp-role-terms-wrapper echo '</td></tr>'; } // end foreach status } // end foreach mod_type echo '</tbody>'; echo '</table></div>'; // pp-current-roles-tbl-wrapper echo '<div class="pp-exception-bulk-edit" style="display:none">'; echo "<select><option value=''>" . __ppw('Bulk Actions', 'pp') . "</option><option value='remove'>" . __ppw('Remove', 'pp') . '</option>'; if ('post' == $via_src && (!$via_type || $via_type_obj->hierarchical)) { echo "<option value='propagate'>" . sprintf(__('Assign for selected and sub-%s', 'pp'), $via_type_obj->labels->name) . '</option>'; echo "<option value='unpropagate'>" . sprintf(__('Assign for selected %s only', 'pp'), $via_type_obj->labels->singular_name) . '</option>'; echo "<option value='children_only'>" . sprintf(__('Assign for sub-%s only', 'pp'), $via_type_obj->labels->name) . '</option>'; } elseif ('term' == $via_src && $via_type_obj->hierarchical) { echo "<option value='propagate'>" . __('Assign for selected and sub-terms', 'pp') . '</option>'; echo "<option value='unpropagate'>" . __('Assign for selected term only', 'pp') . '</option>'; echo "<option value='children_only'>" . __('Assign for sub-terms only', 'pp') . '</option>'; } echo '</select>'; //submit_button( __ppw('Apply'), 'button-secondary submit-edit-item-exception', '', false ); ?> <input type="submit" name="" class="button submit-edit-item-exception" value="<?php _e('Apply', 'pp'); ?> " /> <?php echo '<img class="waiting" style="display:none;" src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" alt="" />'; echo '</div>'; // pp-exception-bulk-edit echo '</div></div>'; // type-roles-wrapper, pp-current-type-roles } // end foreach operation } // end foreach for_type if ($any_redundant) { echo '<div class="pp-current-roles-note">' . __('* = exceptions redundant due to a corresponding "only these" entry', 'pp') . '</div>'; } if (!empty($via_type_obj->hierarchical)) { $_caption = strtolower($via_type_obj->labels->name); if (!empty($any_both) || !empty($any_child_only)) { ?> <div class="pp-current-roles-note"> <?php if (!empty($any_both)) { echo '<span class="role_both" style="padding-right:20px">' . sprintf(__('... = assigned for %1$s and sub-%1$s', 'pp'), $_caption) . '</span>'; } if (!empty($any_child_only)) { echo '<span>' . sprintf(__('* = assigned for sub-%s only', 'pp'), $_caption) . '</span>'; } ?> </div> <?php } $show_all_url = esc_url(add_query_arg('show_propagated', '1', $_SERVER['REQUEST_URI'])); $show_all_link = " <a href='{$show_all_url}'>"; if (empty($_REQUEST['show_propagated'])) { if ('term' == $via_src) { echo '<div class="pp-current-roles-note">' . sprintf(__('note: Exceptions inherited from parent %1$s are not displayed. %2$sshow all%3$s', 'pp'), $_caption, $show_all_link, '</a>') . '</div>'; } else { echo '<div class="pp-current-roles-note">' . sprintf(__('note: Exceptions inherited from parent %1$s or terms are not displayed. %2$sshow all%3$s', 'pp'), $_caption, $show_all_link, '</a>') . '</div>'; } } } echo '</div>'; // pp-current-exceptions } // end foreach via_type } // end foreach via_src echo '</div>'; // pp_current_exceptions_inner echo '</div>'; // no class echo '</div>'; // pp_current_exceptions }
public static function display_ui_user_groups($include_role_metagroups = false, $args = array()) { $defaults = array('initial_hide' => false, 'selected_only' => false, 'hide_checkboxes' => false, 'force_display' => false, 'edit_membership_link' => false, 'user_id' => false); extract(array_merge($defaults, $args), EXTR_SKIP); require_once dirname(__FILE__) . '/permissions-ui_pp.php'; if (!is_numeric($user_id)) { global $profileuser; $user_id = !empty($profileuser) ? $profileuser->ID : 0; } $group_types = pp_get_group_types(array('editable' => true)); foreach ($group_types as $agent_type) { //if ( ! $agent_type = apply_filters( 'pp_query_group_type', '' ) ) // $agent_type = 'pp_group'; if ('pp_group' == $agent_type && in_array('pp_net_group', $group_types)) { continue; } if (!pp_has_group_cap('pp_manage_members', 0, $agent_type)) { continue; } if (!($all_groups = pp_get_groups($agent_type))) { continue; } $reqd_caps = (array) apply_filters('pp_edit_groups_reqd_caps', array('pp_edit_groups')); // @todo: reinstate? //$editable_ids = pp_get_groups( 'pp_group', FILTERED_PP, 'id', compact('reqd_caps') ); if (current_user_can('pp_manage_members')) { $editable_ids = array_keys($all_groups); } else { $editable_ids = array(); } $stored_groups = pp_get_groups_for_user($user_id, $agent_type, array('cols' => 'id')); //$addable_ids = array_diff( $editable_ids, array_keys($stored_groups) ); $locked_ids = array_diff(array_keys($stored_groups), $editable_ids); // can't manually edit membership of WP Roles groups or other metagroups lacking _ed_ suffix $all_ids = array(); foreach ($all_groups as $key => $group) { if ($selected_only && !isset($stored_groups[$group->ID])) { unset($all_groups[$key]); continue; } $all_ids[] = $group->ID; if (!$include_role_metagroups && !empty($group->metagroup_id) && 'wp_role' == $group->metagroup_type) { $editable_ids = array_diff($editable_ids, array($group->ID)); unset($stored_groups[$group->ID]); unset($all_groups[$key]); } elseif (!in_array($group->ID, $editable_ids) && !in_array($group->ID, $locked_ids)) { unset($all_groups[$key]); } } $locked_ids = array_diff(array_keys($stored_groups), $editable_ids); // avoid incorrect eligible count if orphaned group roles are included in editable_ids $editable_ids = array_intersect($editable_ids, $all_ids); if (!$all_groups && !$force_display) { continue; } $style = $initial_hide ? "style='display:none'" : ''; echo "<div id='userprofile_groupsdiv_pp' class='pp-group-box pp-group_members' {$style}>"; echo "<h3>"; if ('pp_group' == $agent_type) { if (defined('GROUPS_CAPTION_RS')) { echo GROUPS_CAPTION_RS; } else { _e('Permission Groups', 'pp'); } } else { $group_type_obj = pp_get_group_type_object($agent_type); echo $group_type_obj->labels->name; } echo "</h3>"; $css_id = $agent_type; $args = array('eligible_ids' => $editable_ids, 'locked_ids' => $locked_ids, 'show_subset_caption' => false, 'hide_checkboxes' => $hide_checkboxes); require_once dirname(__FILE__) . '/agents_ui_pp.php'; $pp_agents_ui = pp_init_agents_ui(); $pp_agents_ui->agents_ui($agent_type, $all_groups, $css_id, $stored_groups, $args); if ($edit_membership_link || !$all_groups && $force_display) { ?> <p> <?php if (!$all_groups && $force_display) { _e('This user is not a member of any Permission Groups.', 'pp'); ?> • <?php } ?> <a href='user-edit.php?user_id=<?php echo $user_id; ?> #userprofile_groupsdiv_pp' title='<?php echo esc_attr(__('Edit this user's group membership', 'pp')); ?> '><?php _e('add / edit membership'); ?> </a> <span class="pp-subtext"> <?php $note = apply_filters('pp_user_profile_groups_note', defined('BP_VERSION') ? __('note: BuddyPress Groups and other externally defined groups are not listed here, even if they modify permissions', 'pp') : '', $user_id, $args); echo $note; ?> </span> </p> <?php } echo '</div>'; } // end foreach agent_type echo "<input type='hidden' name='pp_editing_user_groups' value='1' />"; }