function add_meta_boxes()
 {
     // ========= register WP-rendered metaboxes ============
     global $typenow;
     $taxonomy = isset($_REQUEST['taxonomy']) ? pp_sanitize_key($_REQUEST['taxonomy']) : '';
     if (!in_array($taxonomy, pp_get_enabled_taxonomies())) {
         return;
     }
     $tt_id = !empty($_REQUEST['tag_ID']) ? pp_termid_to_ttid((int) $_REQUEST['tag_ID'], $taxonomy) : 0;
     $post_type = !empty($_REQUEST['pp_universal']) ? '' : $typenow;
     $hidden_types = apply_filters('pp_hidden_post_types', array());
     $hidden_taxonomies = apply_filters('pp_hidden_taxonomies', array());
     if (!empty($hidden_taxonomies[$taxonomy]) || $post_type && !empty($hidden_types[$post_type])) {
         return;
     }
     //TODO: selectively enable role assignment by non-administrator
     if (!current_user_can('pp_assign_roles') || apply_filters('pp_disable_exception_ui', false, 'term', $tt_id, $post_type)) {
         return;
     }
     //if ( ! $this->_roles_editable( $src_name, $object_type ) )
     //	return;
     $tx = get_taxonomy($taxonomy);
     $type_obj = get_post_type_object($post_type);
     $register_type = $post_type ? $post_type : 'post';
     $ops = _pp_can_set_exceptions('read', $post_type, array('via_item_source' => 'term', 'via_item_type' => $taxonomy, 'for_item_source' => 'post')) ? array('read' => true) : array();
     $operations = apply_filters('pp_item_edit_exception_ops', $ops, 'post', $taxonomy, $post_type);
     $boxes = array();
     foreach (array_keys($operations) as $op) {
         if ($op_obj = pp_get_op_object($op, $post_type)) {
             if ('assign' == $op) {
                 $title = $post_type ? sprintf(__('%1$s %2$s %3$s Exceptions', 'pp'), $type_obj->labels->singular_name, $tx->labels->singular_name, $op_obj->noun_label) : sprintf(__('%1$s %2$s Exceptions (all post types)', 'pp'), $tx->labels->singular_name, $op_obj->noun_label);
             } elseif (in_array($op, array('read', 'edit'))) {
                 $title = $post_type ? sprintf(__('%1$s %2$s Exceptions (all post statuses)', 'pp'), $type_obj->labels->singular_name, $op_obj->noun_label) : sprintf(__('%1$s Exceptions (all post types, statuses)', 'pp'), $op_obj->noun_label);
             } else {
                 $title = $post_type ? sprintf(__('%1$s %2$s Exceptions', 'pp'), $type_obj->labels->singular_name, $op_obj->noun_label) : sprintf(__('%1$s Exceptions (all post types)', 'pp'), $op_obj->noun_label);
             }
             pp_set_array_elem($boxes, array($op, "pp_{$op}_{$post_type}_exceptions"));
             $boxes[$op]["pp_{$op}_{$post_type}_exceptions"]['for_item_type'] = $post_type;
             $boxes[$op]["pp_{$op}_{$post_type}_exceptions"]['title'] = $title;
         }
     }
     $boxes = apply_filters('pp_term_exceptions_metaboxes', $boxes, $taxonomy, $post_type);
     foreach ($boxes as $op => $boxes) {
         foreach ($boxes as $box_id => $_box) {
             // $screen = null, $context = 'advanced', $priority = 'default', $callback_args = null
             add_meta_box($box_id, $_box['title'], array(&$this, 'draw_exceptions_ui'), $register_type, 'normal', 'default', array('for_item_type' => $_box['for_item_type'], 'op' => $op));
         }
     }
 }
 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;
         }
     }
 }
Esempio n. 3
0
 function get_exception_terms($operation, $mod_type, $post_type, $taxonomy, $args = array())
 {
     $status = isset($args['status']) ? $args['status'] : '';
     if ($post_type) {
         $for_item_src = post_type_exists($post_type) ? 'post' : 'term';
         if ('post' == $for_item_src && $taxonomy && !in_array($taxonomy, pp_get_enabled_taxonomies(array('object_type' => $post_type)))) {
             return array();
         }
     } else {
         $for_item_src = 'post';
     }
     // nullstring post_type means all post types
     if (!isset($this->except["{$operation}_{$for_item_src}"])) {
         $this->retrieve_exceptions($operation, $for_item_src);
     }
     $args['via_item_source'] = 'term';
     $args['via_item_type'] = $taxonomy;
     $args['status'] = true;
     // prevent filter from flattening exceptions array, since we will do it below
     $type_restricts = apply_filters('pp_get_exception_items', false, $operation, $mod_type, $post_type, $args);
     if (false === $type_restricts) {
         $type_restricts = isset($this->except["{$operation}_{$for_item_src}"]['term'][$taxonomy][$mod_type][$post_type]) ? $this->except["{$operation}_{$for_item_src}"]['term'][$taxonomy][$mod_type][$post_type] : array();
     }
     if ($post_type && !empty($args['merge_universals'])) {
         $universal_restricts = apply_filters('pp_get_exception_items', false, $operation, $mod_type, '', $args);
         if (false === $universal_restricts) {
             $universal_restricts = isset($this->except["{$operation}_{$for_item_src}"]['term'][$taxonomy][$mod_type]['']) ? $this->except["{$operation}_{$for_item_src}"]['term'][$taxonomy][$mod_type][''] : array();
         }
         foreach (array_keys($universal_restricts) as $_status) {
             pp_set_array_elem($type_restricts, array($_status));
             $type_restricts[$_status] = array_unique(array_merge($type_restricts[$_status], $universal_restricts[$_status]));
         }
     }
     if (!$type_restricts) {
         return array();
     }
     if (true === $status) {
         return $type_restricts;
     } else {
         $tt_ids = pp_array_flatten(array_intersect_key($type_restricts, array($status => true)));
     }
     if (!empty($args['return_term_ids'])) {
         return pp_ttid_to_termid($tt_ids, $taxonomy);
     } else {
         return array_unique($tt_ids);
     }
 }