function flt_objects_listing($results, $src_name, $object_types, $args = array()) { global $wpdb; // it's not currently necessary or possible to log listed revisions from here //if ( isset($wpdb->last_query) && strpos( $wpdb->last_query, "post_type = 'revision'") ) // return $results; // if currently listed IDs are not already in post_cache, make our own equivalent memcache // ( create this cache for any data source, front end or admin ) if ('post' == $src_name) { global $wp_object_cache; } $listed_ids = array(); //if ( ('post' != $src_name) || empty($wp_object_cache->cache['posts']) ) { if (empty($this->scoper->listed_ids[$src_name])) { if ($col_id = $this->scoper->data_sources->member_property($src_name, 'cols', 'id')) { $listed_ids = array(); // In edit.php, WP forces all objects into recordset for hierarchical post types. But for perf enchancement, we need to know IDs of items which are actually listed if ('edit.php' == $GLOBALS['pagenow']) { $post_type = !empty($_GET['post_type']) ? sanitize_key($_GET['post_type']) : 'post'; $determine_listed_ids = !is_content_administrator_rs() && is_post_type_hierarchical($post_type) && !empty($GLOBALS['query_interceptor']->last_request[$src_name]) && !strpos($GLOBALS['query_interceptor']->last_request[$src_name], 'LIMIT '); if ($determine_listed_ids) { // mimic recordset paging used in edit.php $pagenum = isset($_GET['paged']) ? absint($_GET['paged']) : 0; if (empty($pagenum)) { $pagenum = 1; } $edit_per_page = 'edit_' . $post_type . '_per_page'; $per_page = (int) get_user_option($edit_per_page); if (empty($per_page) || $per_page < 1) { $per_page = 20; } $per_page = apply_filters($edit_per_page, $per_page); $per_page = apply_filters('edit_posts_per_page', $per_page, $post_type); if (count($results) <= $per_page) { $determine_listed_ids = false; } } } else { $determine_listed_ids = false; } if ($determine_listed_ids) { // Construct and execute a secondary query (for IDs only) which includes the paging clause that would be used if edit.php did not defeat it $pgstrt = ($pagenum - 1) * $per_page . ', '; $limits = ' LIMIT ' . $pgstrt . $per_page; global $wpdb; $qry = $GLOBALS['query_interceptor']->last_request[$src_name] . $limits; $qry = str_replace("{$wpdb->posts}.*", "{$wpdb->posts}.ID", $qry); $_results = scoper_get_results($qry); foreach ($_results as $row) { if (isset($row->{$col_id})) { $listed_ids[$row->{$col_id}] = true; } } } else { // No secondary query, just buffer all IDs in the results set foreach ($results as $row) { if (isset($row->{$col_id})) { $listed_ids[$row->{$col_id}] = true; } } } if (empty($this->scoper->listed_ids)) { $this->scoper->listed_ids = array(); } $this->scoper->listed_ids[$src_name] = $listed_ids; } } else { return $results; } //} // now determine what restrictions were in place on these results // (currently only for post data source, front end or manage posts/pages) // // possible todo: support other data sources, WP role type if ('edit.php' == $GLOBALS['pagenow']) { if (scoper_get_otype_option('restrictions_column', 'post') || scoper_get_otype_option('term_roles_column', 'post') || scoper_get_otype_option('object_roles_column', 'post')) { global $scoper_role_usage; require_once dirname(__FILE__) . '/role_usage_rs.php'; $scoper_role_usage = new Role_Usage_RS(); $scoper_role_usage->determine_role_usage_rs('post', $listed_ids); } } return $results; }
function is_restricted_rs($id = '', $src_name = 'post', $op_type = 'read', $scope_criteria = '') { global $scoper; if (empty($scoper) || is_home() && is_single() && !$id) { return false; } if ('post' == $src_name && !$id) { global $post; if (empty($post) || !isset($post->ID)) { return false; } $id = $post->ID; } $listed_ids = is_single() || is_page() || empty($scoper->listed_ids[$src_name]) ? array($id => true) : array(); global $scoper_role_usage; require_once dirname(__FILE__) . '/role_usage_rs.php'; $scoper_role_usage = new Role_Usage_RS(); $scoper_role_usage->determine_role_usage_rs($src_name, $listed_ids); if ('object' == $scope_criteria) { return isset($scoper_role_usage->objscoped_ids[$src_name][$id][$op_type]); } elseif ('term' == $scope_criteria) { return isset($scoper_role_usage->termscoped_ids[$src_name][$id][$op_type]); } else { return isset($scoper_role_usage->restricted_ids[$src_name][$id][$op_type]); } }