示例#1
0
 function get_usergroups_clause($table_alias, $args = array())
 {
     $table_alias = $table_alias ? "{$table_alias}." : '';
     $arr = array();
     $arr[] = "{$table_alias}agent_type = 'user' AND {$table_alias}agent_id = '{$this->ID}'";
     foreach (pp_get_group_types(array(), 'names') as $agent_type) {
         $apply_groups = $this->groups[$agent_type];
         if ('pp_group' == $agent_type && pp_get_option('netwide_groups')) {
             foreach (array_keys($apply_groups) as $k) {
                 if (empty($apply_groups[$k]->metagroup_type)) {
                     unset($apply_groups[$k]);
                 }
             }
         }
         if (!empty($apply_groups)) {
             $arr[] = "{$table_alias}agent_type = '{$agent_type}' AND {$table_alias}agent_id IN ('" . implode("', '", array_keys($apply_groups)) . "')";
         }
     }
     if (!empty($args['user_clause'])) {
         $arr[] = "{$table_alias}agent_type = 'user' AND {$table_alias}agent_id = '{$this->ID}'";
     }
     $clause = pp_implode(' OR ', $arr);
     if (count($arr) > 1) {
         $clause = "( {$clause} )";
     }
     if ($clause) {
         return " AND {$clause}";
     } else {
         return ' AND 1=2';
     }
 }
 public static function get_exceptions($args = array())
 {
     $defaults = array('operations' => array(), 'inherited_from' => '', 'for_item_source' => false, 'via_item_source' => false, 'assign_for' => 'item', 'for_item_status' => false, 'post_types' => true, 'taxonomies' => true, 'item_id' => false, 'agent_type' => '', 'agent_id' => 0, 'query_agent_ids' => array(), 'ug_clause' => '', 'return_raw_results' => false, 'extra_cols' => array(), 'cols' => array());
     $args = array_merge($defaults, $args);
     extract($args, EXTR_SKIP);
     global $wpdb;
     $except = array();
     $operations = (array) $operations;
     if ($operations) {
         $operations = array_intersect($operations, pp_get_operations());
     } else {
         $operations = pp_get_operations();
     }
     if (!is_array($post_types)) {
         $post_types = pp_get_enabled_post_types();
     }
     if (!is_array($taxonomies)) {
         $taxonomies = pp_get_enabled_taxonomies();
     }
     $default_arr = array('include', 'exclude');
     if (!defined('PP_NO_ADDITIONAL_ACCESS')) {
         $default_arr[] = 'additional';
     }
     $valid_src_types = array('post' => array('post' => array('' => array_fill_keys($default_arr, array_fill_keys($post_types, array()))), 'term' => array()), 'term' => array('term' => array()), 'pp_group' => array('pp_group' => array()));
     if ($add_source_types = apply_filters('pp_add_exception_source_types', array())) {
         // valid return array is arr[for_item_source] = arr[via_item_src][via_item_type] = array('include', 'exclude' )
         $valid_src_types = array_merge($valid_src_types, $add_source_types);
     }
     if ($for_item_source) {
         $for_item_source = array_flip((array) $for_item_source);
         if (!($for_item_sources = array_intersect_key($for_item_source, $valid_src_types))) {
             return array();
         }
     } else {
         $for_item_sources = $valid_src_types;
     }
     $for_item_clauses = array();
     foreach (array_keys($for_item_sources) as $for_src_name) {
         if (isset($valid_src_types[$for_src_name])) {
             foreach ($operations as $op) {
                 $except["{$op}_{$for_src_name}"] = $valid_src_types[$for_src_name];
             }
             $for_types = array();
             foreach (array_keys($valid_src_types[$for_src_name]) as $via_src_name) {
                 if ('post' == $via_src_name) {
                     foreach (array_keys($valid_src_types[$for_src_name][$via_src_name]) as $via_type) {
                         foreach (array_keys($valid_src_types[$for_src_name][$via_src_name][$via_type]) as $mod_type) {
                             $for_types = array_merge($for_types, array_keys($valid_src_types[$for_src_name][$via_src_name][$via_type][$mod_type]));
                         }
                     }
                 } elseif ('term' == $via_src_name) {
                     if ('term' == $for_src_name) {
                         $for_types = $taxonomies;
                     } else {
                         $for_types = $post_types;
                     }
                 } else {
                     $for_types = false;
                 }
             }
             if (false === $for_types) {
                 $for_item_clauses[] = "e.for_item_source = '{$for_src_name}'";
             } else {
                 $for_item_clauses[] = "e.for_item_source = '{$for_src_name}' AND e.for_item_type IN ('', '" . implode("','", array_unique($for_types)) . "')";
             }
         }
     }
     if ($type_clause = pp_implode('OR', $for_item_clauses)) {
         $type_clause = "AND ( {$type_clause} )";
     }
     if ($via_item_source) {
         $type_clause .= $wpdb->prepare("AND e.via_item_source = '{$via_item_source}'", $via_item_source);
     }
     if ($agent_type && !$ug_clause) {
         $ug_clause = $wpdb->prepare(" AND e.agent_type = %s AND e.agent_id IN ('" . implode("','", array_map('intval', (array) $agent_id)) . "')", $agent_type);
     }
     $operation_clause = "AND e.operation IN ('" . implode("','", $operations) . "')";
     $mod_clause = defined('PP_NO_ADDITIONAL_ACCESS') ? "AND e.mod_type != 'additional'" : '';
     $assign_for_clause = $assign_for ? $wpdb->prepare("AND i.assign_for = %s", $assign_for) : '';
     $inherited_from_clause = $inherited_from !== '' ? $wpdb->prepare("AND i.inherited_from = %d", $inherited_from) : '';
     $status_clause = false !== $for_item_status ? $wpdb->prepare("AND e.for_item_status = %s", $for_item_status) : '';
     if (!$status_clause && !defined('PPS_VERSION')) {
         $status_clause = "AND e.for_item_status IN ('','post_status:private','post_status:draft')";
     }
     // exceptions for other statuses will not be applied correctly without custom statuses extension
     if (!$cols) {
         $cols = "e.operation, e.for_item_source, e.for_item_type, e.mod_type, e.via_item_source, e.via_item_type, e.for_item_status, i.item_id, i.assign_for";
     }
     $extra_cols_clause = $extra_cols ? ', ' . implode(",", $extra_cols) : '';
     $id_clause = false !== $item_id ? $wpdb->prepare("AND i.item_id = %d", $item_id) : '';
     $results = $wpdb->get_results("SELECT {$cols}{$extra_cols_clause} FROM {$wpdb->ppc_exceptions} AS e INNER JOIN {$wpdb->ppc_exception_items} AS i ON e.exception_id = i.exception_id WHERE ( 1=1 {$operation_clause} {$assign_for_clause} {$inherited_from_clause} {$mod_clause} {$type_clause} {$status_clause} {$id_clause} ) {$ug_clause}");
     if ($return_raw_results) {
         return $results;
     }
     foreach ($results as $row) {
         // note: currently only additional access can be status-specific
         $except["{$row->operation}_{$row->for_item_source}"][$row->via_item_source][$row->via_item_type][$row->mod_type][$row->for_item_type][$row->for_item_status][] = $row->item_id;
     }
     return $except;
 }
 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']);
     }
     $agents_clause = array();
     if (!empty($args['agent_type']) && 'user' != $args['agent_type']) {
         $agents_clause[] = "( e.agent_type = '" . $args['agent_type'] . "' )";
     }
     if ($query_users) {
         $agents_clause[] = "( e.agent_type = 'user' AND e.agent_id IN ('" . implode("','", $query_users) . "') )";
     }
     $agents_clause = $agents_clause ? pp_implode(' OR ', $agents_clause) : '1=1';
     $_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;
         }
     }
 }
 public static function add_exception_clauses($where, $required_operation, $post_type, $args = array())
 {
     $defaults = array('source_alias' => '', 'apply_term_restrictions' => true, 'append_post_type_clause' => true, 'additions_only' => false);
     extract(array_merge($defaults, $args), EXTR_SKIP);
     global $wpdb, $pp_current_user;
     $src_table = $source_alias ? $source_alias : $wpdb->posts;
     $exc_post_type = apply_filters('pp_exception_post_type', $post_type, $required_operation, $args);
     if (!$additions_only) {
         if ($where) {
             // where clause already indicates sitewide caps for one or more statuses (or just want the exceptions clause generated)
             if ($append_clause = apply_filters('pp_append_query_clause', '', $post_type, $required_operation, $args)) {
                 $where .= $append_clause;
             }
             $post_blockage_priority = pp_get_option('post_blockage_priority');
             $post_blockage_clause = '';
             foreach (array('include' => 'IN', 'exclude' => 'NOT IN') as $mod => $logic) {
                 if ($ids = $pp_current_user->get_exception_posts($required_operation, $mod, $exc_post_type)) {
                     $_args = array_merge($args, compact('mod', 'ids', 'src_table', 'logic'));
                     $clause_var = $post_blockage_priority ? 'post_blockage_clause' : 'where';
                     ${$clause_var} .= " AND " . apply_filters('pp_exception_clause', "{$src_table}.ID {$logic} ('" . implode("','", $ids) . "')", $required_operation, $post_type, $_args);
                     break;
                     // don't use both include and exclude clauses
                 }
             }
             // term restrictions which apply only to this post type
             if ($apply_term_restrictions) {
                 $where .= self::add_term_restrictions_clause($required_operation, $post_type, $src_table);
             }
         } else {
             $where = '1=2';
         }
     }
     $additions = array();
     $additional_ids = $pp_current_user->get_exception_posts($required_operation, 'additional', $exc_post_type, array('status' => true));
     foreach ($additional_ids as $_status => $_ids) {
         if ($_status) {
             // db storage is with "post_status:" prefix to allow for implementation of other attributes
             if (0 === strpos($_status, 'post_status:')) {
                 $_status = str_replace('post_status:', '', $_status);
             } else {
                 continue;
             }
         }
         if (!isset($additions[$_status])) {
             $additions[$_status] = array();
         }
         // facilitates user-add on post edit form without dealing with status caps
         $in_clause = "IN ('" . implode("','", $_ids) . "')";
         $additions[$_status][] = apply_filters('pp_additions_clause', "{$src_table}.ID {$in_clause}", $required_operation, $post_type, array('via_item_source' => 'post', 'status' => $_status, 'in_clause' => $in_clause, 'src_table' => $src_table));
     }
     $additional_ttids = array();
     foreach (pp_get_enabled_taxonomies(array('object_type' => $post_type)) as $taxonomy) {
         $tt_ids = $pp_current_user->get_exception_terms($required_operation, 'additional', $post_type, $taxonomy, array('status' => true, 'merge_universals' => true));
         // merge this taxonomy exceptions with other taxonomies
         foreach (array_keys($tt_ids) as $_status) {
             if (!isset($additional_ttids[$_status])) {
                 $additional_ttids[$_status] = array();
             }
             $additional_ttids[$_status] = array_merge($additional_ttids[$_status], $tt_ids[$_status]);
         }
     }
     if ($additional_ttids) {
         foreach ($additional_ttids as $_status => $_ttids) {
             if ($_status) {
                 if (0 === strpos($_status, 'post_status:')) {
                     $_status = str_replace('post_status:', '', $_status);
                 } else {
                     continue;
                 }
             }
             if (!isset($additions[$_status])) {
                 $additions[$_status] = array();
             }
             $in_clause = "IN ( SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN ('" . implode("','", $_ttids) . "') )";
             $additions[$_status][] = apply_filters('pp_additions_clause', "{$src_table}.ID {$in_clause}", $required_operation, $post_type, array('via_item_source' => 'term', 'status' => $_status, 'in_clause' => $in_clause, 'src_table' => $src_table));
         }
     }
     foreach (array_keys($additions) as $_status) {
         switch ($_status) {
             case '':
                 $_status_clause = '';
                 break;
             case '{unpublished}':
                 if ('read' != $required_operation) {
                     // sanity check
                     $_stati = array_merge(pp_get_post_stati(array('public' => true, 'post_type' => $post_type)), pp_get_post_stati(array('private' => true, 'post_type' => $post_type)));
                     $_status_clause = "{$src_table}.post_status NOT IN ('" . implode("','", $_stati) . "') AND ";
                     break;
                 }
             default:
                 $_status_clause = "{$src_table}.post_status = '{$_status}' AND ";
                 break;
         }
         $additions[$_status] = $_status_clause . pp_implode(' OR ', $additions[$_status]);
     }
     if ($additions = apply_filters('pp_apply_additions', $additions, $where, $required_operation, $post_type, $args)) {
         $where = "( {$where} ) OR ( " . pp_implode(' OR ', $additions) . " )";
         if ($post_blockage_clause) {
             $post_blockage_clause = "AND ( ( 1=1 {$post_blockage_clause} ) OR ( " . pp_implode(' OR ', $additions) . " ) )";
         }
         /*
         $additions = pp_implode( ' OR ', $additions );
         
         if ( $append_post_type_clause )
         	$where = "$src_table.post_type = '$post_type' AND ( ( $where ) OR ( $additions ) )";
         else
         	$where = "( $where ) OR ( $additions )";
         		
         		} elseif ( $append_post_type_clause ) {
         $where = "$src_table.post_type = '$post_type' AND $where";
         */
     }
     if ($post_blockage_priority) {
         $where = "( {$where} ) {$post_blockage_clause}";
     }
     if ($append_post_type_clause) {
         $where = "{$src_table}.post_type = '{$post_type}' AND ( {$where} )";
     }
     return $where;
 }
示例#5
0
 function get_posts_where($args)
 {
     $defaults = array('post_types' => array(), 'source_alias' => false, 'src_table' => '', 'apply_term_restrictions' => true, 'include_trash' => 0, 'required_operation' => '', 'limit_statuses' => false, 'skip_teaser' => false, 'query_contexts' => array(), 'force_types' => false);
     $args = array_merge($defaults, (array) $args);
     extract($args, EXTR_SKIP);
     //d_echo ("<br /><strong>get_posts_where:</strong> <br />");
     global $wpdb;
     if (!$src_table) {
         $src_table = $source_alias ? $source_alias : $wpdb->posts;
         $args['src_table'] = $src_table;
     }
     if (!$force_types) {
         $post_types = array_intersect((array) $post_types, pp_get_enabled_post_types());
     }
     $tease_otypes = array_intersect($post_types, $this->_get_teaser_post_types($post_types, $args));
     if (!$required_operation) {
         $required_operation = pp_is_front() && !is_preview() ? 'read' : 'edit';
         $args['required_operation'] = $required_operation;
     }
     if ($query_contexts) {
         $query_contexts = (array) $query_contexts;
     }
     $meta_cap = "{$required_operation}_post";
     if ('read' == $required_operation) {
         $use_statuses = array_merge(pp_get_post_stati(array('public' => true, 'post_type' => $post_types), 'object'), pp_get_post_stati(array('private' => true, 'post_type' => $post_types), 'object'));
         foreach ($use_statuses as $key => $obj) {
             if (!empty($obj->exclude_from_search)) {
                 // example usage is bbPress hidden status
                 unset($use_statuses[$key]);
             }
         }
     } else {
         $use_statuses = pp_get_post_stati(array('internal' => false, 'post_type' => $post_types), 'object');
     }
     if (in_array('attachment', $post_types)) {
         $use_statuses['inherit'] = (object) array();
     }
     if (is_array($limit_statuses)) {
         $use_statuses = array_intersect_key($use_statuses, $limit_statuses);
     }
     if (empty($skip_teaser) && !array_diff($post_types, $tease_otypes)) {
         // All object types potentially returned by this query will have a teaser filter applied to results, so we don't need to use further query filtering
         $status_clause = "AND {$src_table}.post_status IN ('" . implode("','", array_keys($use_statuses)) . "')";
         return $status_clause;
     }
     if (!is_bool($include_trash)) {
         if (!empty($_REQUEST['post_status']) && 'trash' == $_REQUEST['post_status']) {
             $include_trash = true;
         }
     }
     $where_arr = array();
     global $pp_current_user;
     global $pp_meta_caps;
     $flag_meta_caps = !empty($pp_meta_caps);
     foreach ($post_types as $post_type) {
         if (in_array($post_type, $tease_otypes) && empty($skip_teaser)) {
             $where_arr[$post_type] = "{$src_table}.post_type = '{$post_type}' AND 1=1";
         } else {
             $have_site_caps = array();
             $type_obj = get_post_type_object($post_type);
             foreach (array_keys($use_statuses) as $status) {
                 if ('private' == $status) {
                     $cap_property = "{$required_operation}_private_posts";
                     if (empty($type_obj->cap->{$cap_property})) {
                         continue;
                     }
                 }
                 if ($flag_meta_caps) {
                     $pp_meta_caps->do_status_cap_map = true;
                 }
                 $reqd_caps = pp_map_meta_cap($meta_cap, $pp_current_user->ID, 0, compact('post_type', 'status', 'query_contexts'));
                 if ($flag_meta_caps) {
                     $pp_meta_caps->do_status_cap_map = false;
                 }
                 if ($reqd_caps) {
                     // note: this function is called only for listing query filters (not for user_has_cap filter)
                     if ($missing_caps = apply_filters('pp_query_missing_caps', array_diff($reqd_caps, array_keys($pp_current_user->allcaps)), $reqd_caps, $post_type, $meta_cap)) {
                         $owner_reqd_caps = $this->get_base_caps($reqd_caps, $post_type);
                         // remove "others" and "private" cap requirements for post author
                         if ($owner_reqd_caps != $reqd_caps && $pp_current_user->ID) {
                             // && ! $omit_owner_clause
                             if (!array_diff($owner_reqd_caps, array_keys($pp_current_user->allcaps))) {
                                 $have_site_caps['owner'][] = $status;
                             }
                         }
                     } else {
                         $have_site_caps['user'][] = $status;
                     }
                 }
             }
             $have_site_caps = apply_filters('pp_have_site_caps', $have_site_caps, $post_type, $args);
             if ($include_trash) {
                 if ($type_obj = get_post_type_object($post_type)) {
                     if ('edit_post' == $meta_cap && !empty($pp_current_user->allcaps[$type_obj->cap->edit_posts]) || 'delete_post' == $meta_cap && !empty($pp_current_user->allcaps[$type_obj->cap->delete_posts])) {
                         if (!isset($type_obj->cap->delete_others_posts) || !empty($pp_current_user->allcaps[$type_obj->cap->delete_others_posts])) {
                             $have_site_caps['user'][] = 'trash';
                         } else {
                             $have_site_caps['owner'][] = 'trash';
                         }
                     }
                 }
             }
             $where_arr[$post_type] = array();
             if (!empty($have_site_caps['user'])) {
                 $where_arr[$post_type]['user'] = "******" . implode("','", array_unique($have_site_caps['user'])) . "')";
             }
             //dump($have_site_caps);
             if (!empty($have_site_caps['owner'])) {
                 $parent_clause = '';
                 // PPCE may be set to "ID IN (...) OR " to enable post revisors to edit their own pending revisions
                 $args['post_type'] = $post_type;
                 $_vars = apply_filters('pp_generate_where_clause_force_vars', null, 'post', $args);
                 if (is_array($_vars)) {
                     extract($_vars);
                     // possible @todo: intersect keys as with pp_has_cap_force_vars
                 }
                 if (!empty($args['skip_stati_usage_clause']) && !$limit_statuses && !array_diff_key($use_statuses, array_flip($have_site_caps['owner']))) {
                     $where_arr[$post_type]['owner'] = "{$parent_clause} ( {$src_table}.post_author = {$pp_current_user->ID} )";
                 } else {
                     $where_arr[$post_type]['owner'] = "{$parent_clause} ( {$src_table}.post_author = {$pp_current_user->ID} ) AND {$src_table}.post_status IN ('" . implode("','", array_unique($have_site_caps['owner'])) . "')";
                 }
             }
             if (is_array($where_arr[$post_type])) {
                 if ($where_arr[$post_type]) {
                     $where_arr[$post_type] = pp_implode('OR', $where_arr[$post_type]);
                     $where_arr[$post_type] = "1=1 AND ( " . $where_arr[$post_type] . " )";
                 } else {
                     $where_arr[$post_type] = '1=2';
                 }
             }
             if ($modified = apply_filters('pp_adjust_posts_where_clause', false, $where_arr[$post_type], $post_type, $args)) {
                 $where_arr[$post_type] = $modified;
             }
             if ('attachment' == $post_type) {
                 if ('read' == $required_operation || apply_filters('pp_force_attachment_parent_clause', false, $args)) {
                     //if ( ( 'read' == $required_operation ) || ( defined('DOING_AJAX') && DOING_AJAX && ( false != strpos( $_SERVER['REQUEST_URI'], 'async-upload.php' ) ) ) || apply_filters( 'pp_force_attachment_parent_clause', false, $args ) ) {
                     $where_arr[$post_type] = "( " . $this->append_attachment_clause("{$src_table}.post_type = 'attachment'", array(), $args) . " )";
                 }
             }
             if ('delete' == $required_operation) {
                 $const = "PP_EDIT_EXCEPTIONS_ALLOW_" . strtoupper($post_type) . "_DELETION";
                 if (defined('PP_EDIT_EXCEPTIONS_ALLOW_DELETION') || defined($const)) {
                     $required_operation = 'edit';
                 }
             }
             $where_arr[$post_type] = PP_Exceptions::add_exception_clauses($where_arr[$post_type], $required_operation, $post_type, $args);
         }
     }
     // end foreach post_type
     if (!($pp_where = pp_implode('OR', $where_arr))) {
         $pp_where = '1=1';
     }
     // term restrictions which apply to any post type
     if ($apply_term_restrictions) {
         if ($term_exc_where = PP_Exceptions::add_term_restrictions_clause($required_operation, '', $src_table, array('merge_universals' => true, 'merge_additions' => true, 'exempt_post_types' => $tease_otypes))) {
             $pp_where = "( {$pp_where} ) {$term_exc_where}";
         }
     }
     if ($pp_where) {
         $pp_where = " AND ( {$pp_where} )";
     }
     return $pp_where;
 }