/** * Maps predefinied capabilities to specific post_type or taxonomy capability. * * Example in case of Page post type: * edit_post => edit_page * * @param type $context * @param type $name * @param type $cap * @return type */ function wpcf_access_predefined_to_wp_caps($context = 'post_type', $name = 'post', $cap = 'read') { // Get WP type object data $data = $context == 'taxonomy' ? get_taxonomy($name) : get_post_type_object($name); if (empty($data)) { return array(); } // Get defined capabilities $caps = $context == 'taxonomy' ? wpcf_access_tax_caps() : wpcf_access_types_caps(); // Set mapped WP capabilities $caps_mapped = array(); foreach ($caps as $_cap => $_data) { if ($_data['predefined'] == $cap) { if (!empty($data->cap->{$_cap})) { $caps_mapped[$data->cap->{$_cap}] = $data->cap->{$_cap}; } } } return array_keys($caps_mapped); }
/** * Admin page form. */ function wpcf_access_admin_edit_access($enabled = true) { $roles = get_editable_roles(); $output = ''; $output .= '<form id="wpcf_access_admin_form" method="post" action="">'; // Types $types = get_option('wpcf-custom-types', array()); // Merge with other types $settings_access = get_option('wpcf-access-types', array()); $types_other = get_post_types(array('show_ui' => true), 'objects'); foreach ($types_other as $type_slug => $type_data) { if (isset($types[$type_slug])) { continue; } $types[$type_slug] = (array) $type_data; unset($types[$type_slug]->labels, $types[$type_slug]->cap); $types[$type_slug]['labels'] = (array) $type_data->labels; $types[$type_slug]['cap'] = (array) $type_data->cap; if (isset($settings_access[$type_slug])) { $types[$type_slug]['_wpcf_access_capabilities'] = $settings_access[$type_slug]; } } if (!empty($types)) { $output .= '<h3>' . __('Custom Types', 'wpcf') . '</h3>'; foreach ($types as $type_slug => $type_data) { if ($type_data['public'] === 'hidden') { continue; } // Set data $mode = isset($type_data['_wpcf_access_capabilities']['mode']) ? $type_data['_wpcf_access_capabilities']['mode'] : 'predefined'; // For built-in set default to 'not_managed' if (in_array($type_slug, array('post', 'page'))) { $mode = isset($type_data['_wpcf_access_capabilities']['mode']) ? $type_data['_wpcf_access_capabilities']['mode'] : 'not_managed'; } $predefined_data = wpcf_access_types_caps_predefined(); if (isset($type_data['_wpcf_access_capabilities']['predefined'])) { foreach ($type_data['_wpcf_access_capabilities']['predefined'] as $cap_slug => $cap_data) { $predefined_data[$cap_slug]['role'] = $cap_data['role']; $predefined_data[$cap_slug]['users'] = isset($cap_data['users']) ? $cap_data['users'] : array(); } } $custom_data = wpcf_access_types_caps(); if (isset($type_data['_wpcf_access_capabilities']['custom'])) { foreach ($type_data['_wpcf_access_capabilities']['custom'] as $cap_slug => $cap_data) { $custom_data[$cap_slug]['role'] = $cap_data['role']; $custom_data[$cap_slug]['users'] = isset($cap_data['users']) ? $cap_data['users'] : array(); } } $output .= '<div class="wpcf-access-type-item">'; $output .= '<strong>' . $type_data['labels']['name'] . '</strong>'; if ($mode == 'not_managed') { $output .= ' ' . __('(not managed)', 'wpcf_access'); } $output .= ' <a href="javascript:void(0);" ' . 'class="button-secondary wpcf-access-edit-type">' . __('Edit') . '</a>'; $output .= '<div class="wpcf-access-mode" style="display:none;">'; $output .= '<p>' . __('How do you want to manage access control for this type?', 'wpcf_access') . '</p>'; $output .= '<label><input type="radio" name="types[' . $type_slug . '][mode]" value="predefined" class="wpcf-access-switch-mode"'; $output .= $mode == 'predefined' ? ' checked="checked" />' : ' />'; $output .= __('Simple settings', 'wpcf_access') . '</label> '; $output .= '<label><input type="radio" name="types[' . $type_slug . '][mode]" value="custom" class="wpcf-access-switch-mode"'; $output .= $mode == 'custom' ? ' checked="checked" />' : ' />'; $output .= __('Advanced settings', 'wpcf_access') . '</label> '; $output .= '<label><input type="radio" name="types[' . $type_slug . '][mode]" value="not_managed" class="wpcf-access-switch-mode"'; $output .= $mode == 'not_managed' ? ' checked="checked" />' : ' />'; $output .= __('Not managed by Types Access', 'wpcf_access') . '</label>'; $output .= '<div class="wpcf-access-mode-predefined"'; $output .= $mode == 'predefined' ? '>' : ' style="display:none;">'; $output .= wpcf_access_admin_predefined($type_slug, $roles, 'types[' . $type_slug . '][predefined]', $predefined_data, $enabled); $output .= '</div>'; $output .= '<div class="wpcf-access-mode-custom"'; $output .= $mode == 'custom' ? '>' : ' style="display:none;">'; $output .= wpcf_access_admin_edit_access_types_item($type_slug, $roles, 'types[' . $type_slug . '][custom]', $custom_data, $enabled); $output .= '</div>'; $output .= '<div class="wpcf-access-mode-not_managed"'; $output .= $mode == 'not_managed' ? '>' : ' style="display:none;">'; $output .= '</div>'; $output .= '<a href="javascript:void(0);" ' . 'class="button-primary wpcf-access-edit-type-done">' . __('Done') . '</a>'; $output .= '</div><!-- wpcf-access-mode -->'; $output .= '<div style="clear:both;"></div></div><!-- wpcf-access-type-item -->'; } } // Taxonomies $taxonomies = get_option('wpcf-custom-taxonomies', array()); // Merge with other taxonomies $settings_access = get_option('wpcf-access-taxonomies', array()); $taxonomies_other = get_taxonomies(array('show_ui' => true), 'objects'); foreach ($taxonomies_other as $tax_slug => $tax_data) { if (isset($taxonomies[$tax_slug])) { continue; } $taxonomies[$tax_slug] = (array) $tax_data; unset($taxonomies[$tax_slug]->labels, $taxonomies[$tax_slug]->cap); $taxonomies[$tax_slug]['labels'] = (array) $tax_data->labels; $taxonomies[$tax_slug]['cap'] = (array) $tax_data->cap; $taxonomies[$tax_slug]['supports'] = array_flip($tax_data->object_type); if (isset($settings_access[$tax_slug])) { $taxonomies[$tax_slug]['_wpcf_access_capabilities'] = $settings_access[$tax_slug]; } } // See if taxonomies are shared between types with different settings if ($enabled) { $supports_check = array(); foreach ($taxonomies as $tax_slug => $tax_data) { $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'follow'; // Only check if in 'follow' mode if ($mode != 'follow' || empty($tax_data['supports'])) { continue; } foreach ($tax_data['supports'] as $supports_type => $true) { if (!isset($types[$supports_type]['_wpcf_access_capabilities']['mode'])) { continue; } $mode = $types[$supports_type]['_wpcf_access_capabilities']['mode']; if (!isset($types[$supports_type]['_wpcf_access_capabilities'][$mode])) { continue; } $supports_check[$tax_slug][md5($mode . serialize($types[$supports_type]['_wpcf_access_capabilities'][$mode]))][] = $types[$supports_type]['labels']['name']; } } } if (!empty($taxonomies)) { $output .= '<h3>' . __('Custom Taxonomies', 'wpcf') . '</h3>'; foreach ($taxonomies as $tax_slug => $tax_data) { if ($tax_data['public'] === 'hidden') { continue; } // Set data $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'follow'; // For built-in set default to 'not_managed' if (in_array($tax_slug, array('category', 'post_tag'))) { $mode = isset($tax_data['_wpcf_access_capabilities']['mode']) ? $tax_data['_wpcf_access_capabilities']['mode'] : 'not_managed'; } $custom_data = wpcf_access_tax_caps(); if (isset($tax_data['_wpcf_access_capabilities']['custom'])) { foreach ($tax_data['_wpcf_access_capabilities']['custom'] as $cap_slug => $cap_data) { $custom_data[$cap_slug]['role'] = $cap_data['role']; $custom_data[$cap_slug]['users'] = isset($cap_data['users']) ? $cap_data['users'] : array(); } } $output .= '<div class="wpcf-access-type-item">'; $output .= '<strong>' . $tax_data['labels']['name'] . '</strong>'; if ($mode == 'not_managed') { $output .= ' ' . __('(not managed)', 'wpcf_access'); } $output .= ' <a href="javascript:void(0);" ' . 'class="button-secondary wpcf-access-edit-type">' . __('Edit') . '</a>'; // Add warning if shared and settings are different if ($enabled && isset($supports_check[$tax_slug]) && count($supports_check[$tax_slug]) > 1) { $txt = array(); foreach ($supports_check[$tax_slug] as $sc_tax_md5 => $sc_tax_md5_data) { $txt = array_merge($txt, $sc_tax_md5_data); } $last_element = array_pop($txt); $warning = '<br /><img src="' . WPCF_EMBEDDED_RES_RELPATH . '/images/warning.png" style="position:relative;top:2px;" /> ' . sprintf(__('Notice: %s belongs to %s and %s, which have different access settings. The WordPress admin menu might appear confusing to some users.'), $tax_data['labels']['name'], implode(', ', $txt), $last_element); $output .= $warning; } $output .= '<div class="wpcf-access-mode" style="display:none;">'; $output .= '<p>' . __('How do you want to manage access control for this taxonomy?', 'wpcf_access') . '</p>'; $output .= '<label><input type="radio" name="tax[' . $tax_slug . '][mode]" value="follow" class="wpcf-access-switch-mode"'; $output .= $mode == 'follow' ? ' checked="checked" />' : ' />'; $output .= __('Same as parent post', 'wpcf_access') . '</label> '; $output .= '<label><input type="radio" name="tax[' . $tax_slug . '][mode]" value="custom" class="wpcf-access-switch-mode"'; $output .= $mode == 'custom' ? ' checked="checked" />' : ' />'; $output .= __('Advanced settings', 'wpcf_access') . '</label> '; $output .= '<label><input type="radio" name="tax[' . $tax_slug . '][mode]" value="not_managed" class="wpcf-access-switch-mode"'; $output .= $mode == 'not_managed' ? ' checked="checked" />' : ' />'; $output .= __('Not managed by Types Access', 'wpcf_access') . '</label>'; $output .= '<div class="wpcf-access-mode-custom"'; $output .= $mode == 'custom' ? '>' : ' style="display:none;">'; $output .= wpcf_access_admin_edit_access_tax_item($tax_slug, $roles, 'tax[' . $tax_slug . '][custom]', $custom_data, $enabled); $output .= '</div>'; $output .= '<br /><br /><a href="javascript:void(0);" ' . 'class="button-primary wpcf-access-edit-type-done">' . __('Done') . '</a>'; $output .= '</div><!-- wpcf-access-mode -->'; $output .= '<div style="clear:both;"></div></div><!-- wpcf-access-type-item -->'; } } $output .= wpcf_access_admin_set_custom_roles_level_form($roles, $enabled); $output .= wp_nonce_field('wpcf-access-edit', '_wpnonce', true, false); if ($enabled) { $output .= get_submit_button(); } else { $output .= get_submit_button(__('Save Changes'), 'primary', 'submit', true, array('disabled' => 'disabled')); } $output .= '</form>'; echo $output; }
/** * Maps rules and settings for post types registered outside of Types. * * @param type $post_type * @param type $args */ function wpcf_access_registered_post_type_hook($post_type, $args) { global $wpcf_access, $wp_post_types; $settings_access = get_option('wpcf-access-types', array()); if (isset($settings_access[$post_type])) { $data = $settings_access[$post_type]; // Mark that will inherit post settings // TODO New types to be added if (!in_array($post_type, array('post', 'page', 'attachment', 'media')) && (empty($wp_post_types[$post_type]->capability_type) || $wp_post_types[$post_type]->capability_type == 'post')) { $wp_post_types[$post_type]->_wpcf_access_inherits_post_cap = 1; } if ($data['mode'] == 'not_managed') { return false; } // Force map meta caps $wp_post_types[$post_type]->capability_type = array(sanitize_title($wp_post_types[$post_type]->labels->singular_name), sanitize_title($wp_post_types[$post_type]->labels->name)); $wp_post_types[$post_type]->map_meta_cap = true; $wp_post_types[$post_type]->capabilities = array(); $wp_post_types[$post_type]->cap = get_post_type_capabilities($wp_post_types[$post_type]); unset($wp_post_types[$post_type]->capabilities); $caps = wpcf_access_types_caps(); $mapped = array(); // Map predefined foreach ($caps as $cap_slug => $cap_spec) { if (isset($data['permissions'][$cap_spec['predefined']])) { $mapped[$cap_slug] = $data['permissions'][$cap_spec['predefined']]; } else { $mapped[$cap_slug] = $cap_spec['predefined']; } } // Set rule settings for post type by pre-defined caps foreach ($args->cap as $cap_slug => $cap_spec) { if (isset($mapped[$cap_slug])) { if (isset($mapped[$cap_slug]['role'])) { $wpcf_access->rules->types[$cap_spec]['role'] = $mapped[$cap_slug]['role']; } else { $wpcf_access->rules->types[$cap_spec]['role'] = 'administrator'; } $wpcf_access->rules->types[$cap_spec]['users'] = isset($mapped[$cap_slug]['users']) ? $mapped[$cap_slug]['users'] : array(); $wpcf_access->rules->types[$cap_spec]['types'][$args->name] = 1; } } // TODO create_posts set manually for now // Monitor WP changes if (!isset($wpcf_access->rules->types['create_posts'])) { $wpcf_access->rules->types['create_posts'] = $wpcf_access->rules->types['edit_posts']; } if (!isset($wpcf_access->rules->types['create_post'])) { $wpcf_access->rules->types['create_post'] = $wpcf_access->rules->types['edit_post']; } } // Check read permissions // Check unlogged user settings $check_read = false; if (isset($settings_access[$post_type])) { $data = $settings_access[$post_type]; $check_read = true; } if ($check_read) { if ($data['mode'] == 'not_managed') { return false; } // Mark post type as hidden if (!empty($data['permissions']['read']['role'])) { wpcf_access_hide_post_type($data['permissions']['read']['role'], $post_type); } else { // Missed setting? Debug that! $wpcf_access->errors['hide_post'][$post_type] = array('data' => $data); } } }
/** * Adds new custom role. */ function wpcf_access_add_role_ajax() { require_once WPCF_ACCESS_INC . '/admin-edit-access.php'; $capabilities = array('level_0' => true, 'read' => true); $caps = wpcf_access_types_caps(); foreach ($caps as $cap => $data) { if ($data['predefined'] == 'read') { $capabilities[$cap] = true; } } $success = add_role(str_replace('-', '_', sanitize_title($_POST['role'])), $_POST['role'], $capabilities); echo json_encode(array('error' => is_null($success) ? 'true' : 'false', 'output' => is_null($success) ? '<div class="error"><p>' . __('Role already exists', 'wpcf_access') . '</p></div>' : wpcf_access_admin_set_custom_roles_level_form(wpcf_get_editable_roles()))); die; }
/** * Main check function. * * @global type $wpcf_access * @global type $post * @global type $pagenow * @staticvar null $current_user * @param type $allcaps * @param type $caps * @param type $args * @param type $parse true|false to return $allcaps or boolean * @return array|boolean */ function wpcf_access_check($allcaps, $caps, $args, $parse = true) { global $wpcf_access; // Set user (changed after noticed WP signon empty user) static $current_user = null; if (is_null($current_user)) { if (isset($_POST['log']) && basename($_SERVER['PHP_SELF']) == 'wp-login.php') { $current_user = get_user_by('login', esc_sql($_POST['log'])); } else { $current_user = new WP_User(get_current_user_id()); } } // Debug if some args[0] is array if (WPCF_ACCESS_DEBUG) { if (empty($args[0]) || !is_string($args[0])) { $wpcf_access->errors['cap_args'][] = array('file' => __FILE__ . ' #' . __LINE__, 'args' => func_get_args(), 'debug_backtrace' => debug_backtrace()); } } if (empty($args[0]) || !is_string($args[0])) { return $allcaps; } // Main capability queried $capability_requested = $capability_original = $args[0]; // Other capabilities required to be true $caps_clone = $caps; // All user capabilities $allcaps_clone = $allcaps; $map = wpcf_access_role_to_level_map(); $allow = null; $parse_args = array('caps' => $caps_clone, 'allcaps' => $allcaps_clone, 'data' => array(), 'args' => func_get_args(), 'role' => ''); // Allow check to be altered list($capability_requested, $parse_args) = apply_filters('types_access_check', array($capability_requested, $parse_args, $args)); // TODO Monitor this // I saw mixup of $key => $cap and $cap => $true filteres by collect.php // Also we're adding sets of capabilities to 'caps' // foreach ($parse_args['caps'] as $k => $v) { // if (is_string($k)) { // $parse_args['caps'][] = $k; // unset($parse_args['caps'][$k]); // } // } // Debug if ($capability_original != $capability_requested) { $wpcf_access->converted[$capability_original][$capability_requested] = 1; } $parse_args['cap'] = $capability_requested; // Allow rules to be altered $wpcf_access->rules = apply_filters('types_access_rules', $wpcf_access->rules, $parse_args); $override = apply_filters('types_access_check_override', null, $parse_args); if (!is_null($override)) { return $override; } // Check post_types($wpcf_access->rules->types) // See if main requested capability ($capability_requested) // is in collected post types rules and process it. if (!empty($wpcf_access->rules->types[$capability_requested])) { $types = $wpcf_access->rules->types[$capability_requested]; $types_role = !empty($types['role']) ? $types['role'] : false; $types_role_mapped = !empty($map[$types_role]) ? $map[$types_role] : false; $types_users = !empty($types['users']) ? $types['users'] : false; $parse_args['role'] = $types_role; // Return true for guest // Presumption that any capability that requires user to be not-logged // (guest) should be allowed. Because other roles have level ranked higher // than guest, means it's actually unrestricted by any means. if ($types_role == 'guest') { return $parse ? wpcf_access_parse_caps(true, $parse_args) : true; } // Set data $parse_args['data'] = wpcf_access_types_caps(); $parse_args['data'] = isset($parse_args['data'][$capability_requested]) ? $parse_args['data'][$capability_requested] : array(); // Set level and user checks $level_needed = $types_role && $types_role_mapped ? $types_role_mapped : false; $user_needed = $types_users ? $types_users : false; $level_passed = false; if ($level_needed || is_array($user_needed)) { $allow = false; // Check level if ($level_needed) { if (!empty($current_user->allcaps[$level_needed])) { $allow = $level_passed = true; } } // Check user if (!$level_passed && is_array($user_needed)) { if (in_array($current_user->ID, $user_needed)) { $allow = true; } } } return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } // Check taxonomies ($wpcf_access->rules->taxonomies) // See if main requested capability ($capability_requested) // is in collected taxonomies rules and process it. if (!empty($wpcf_access->rules->taxonomies[$capability_requested])) { $tax = $wpcf_access->rules->taxonomies[$capability_requested]; $tax_role = !empty($tax['role']) ? $tax['role'] : false; $tax_role_mapped = !empty($map[$tax_role]) ? $map[$tax_role] : false; $tax_users = !empty($tax['users']) ? $tax['users'] : false; $parse_args['role'] = $tax_role; // Check taxonomies 'follow' if (!isset($tax['taxonomy'])) { $wpcf_access->errors['no_taxonomy_recorded'] = $tax; } $shared = wpcf_access_is_taxonomy_shared($tax['taxonomy']); $follow = $shared ? false : $tax['follow']; // Return true for guest (same as for post types) if ($tax_role == 'guest') { return $parse ? wpcf_access_parse_caps(true, $parse_args) : true; } // Set level and user $level_needed = $tax_role && $tax_role_mapped ? $tax_role_mapped : false; $user_needed = $tax_users ? $tax_users : false; $level_passed = false; // Set data $parse_args['data'] = wpcf_access_tax_caps(); $parse_args['data'] = isset($parse_args['data'][$capability_requested]) ? $parse_args['data'][$capability_requested] : array(); // Check if taxonomy use 'Same as parent' setting ('follow'). if (!$follow) { if ($level_needed || is_array($user_needed)) { $allow = false; if ($level_needed) { if (!empty($current_user->allcaps[$level_needed])) { $allow = $level_passed = true; } } if (!$level_passed && is_array($user_needed)) { if (in_array($current_user->ID, $user_needed)) { $allow = true; } } return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } } else { global $post, $pagenow; // Determine post type $post_type = wpcf_access_determine_post_type(); // If no post type determined, return FALSE if (!$post_type) { $allow = false; return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } else { $post_type = get_post_type_object($post_type); $post_type = sanitize_title($post_type->labels->name); $tax_caps = wpcf_access_tax_caps(); foreach ($tax_caps as $tax_cap_slug => $tax_slug_data) { foreach ($tax_slug_data['match'] as $match => $replace) { $level_passed = true; if (strpos($capability_requested, $match) === 0) { $post_type_check = $post_type; if ($post_type_check && !empty($wpcf_access->rules->types[$replace['match'] . $post_type_check])) { $level_needed = !empty($wpcf_access->rules->types[$replace['match'] . $post_type_check]['role']) && isset($map[$wpcf_access->rules->types[$replace['match'] . $post_type_check]['role']]) ? $map[$wpcf_access->rules->types[$replace['match'] . $post_type_check]['role']] : false; $user_needed = !empty($wpcf_access->rules->types[$replace['match'] . $post_type_check]['users']) ? $wpcf_access->rules->types[$replace['match'] . $post_type_check]['users'] : false; if ($level_needed || is_array($user_needed)) { $allow = false; if ($level_needed) { if (!empty($current_user->allcaps[$level_needed])) { $allow = $level_passed = true; } } if (!$level_passed && is_array($user_needed)) { if (in_array($current_user->ID, $user_needed)) { $allow = true; } } return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } } else { if (!empty($allcaps_clone[$replace['default']])) { $allow = true; return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } } } } } } } } // Check 3rd party saved settings (option 'wpcf-access-3rd-party') // After that check on-the-fly registered capabilities to use default data // This is already collected with wpcf_access_hooks_collect if (!empty($wpcf_access->third_party_caps[$capability_requested])) { // check only requested cap not all $data = $wpcf_access->third_party_caps[$capability_requested]; //foreach ($wpcf_access->third_party_caps as $cap => $data) { $wpcf_access->third_party_debug[$capability_requested] = 1; // Set saved role if available if (isset($data['saved_data']['role'])) { $data['role'] = $data['saved_data']['role']; } $parse_args['role'] = $data['role']; // Return true for guest (same as post_types) if ($data['role'] == 'guest') { return $parse ? wpcf_access_parse_caps(true, $parse_args) : true; } // removing level testing for custom 3rd party capabilities $level_needed = isset($map[$data['role']]) ? $map[$data['role']] : false; $user_needed = !empty($data['users']) ? $data['users'] : false; $level_passed = false; if ($level_needed || is_array($user_needed)) { $parse_args['data'] = array(); $allow = false; if ($level_needed) { if (!empty($current_user->allcaps[$level_needed])) { $allow = $level_passed = true; } } if (!$level_passed && is_array($user_needed)) { if (!in_array($current_user->ID, $user_needed)) { $allow = true; } } return $parse ? wpcf_access_parse_caps((bool) $allow, $parse_args) : (bool) $allow; } //} } // $third_party = get_option('wpcf-access-3rd-party', array()); // foreach ($third_party as $areas => $area) { // foreach ($wpcf_access->third_party as $area) { // foreach ($area as $group) { // if (isset($group['permissions']) && is_array($group['permissions'])) { // foreach ($group['permissions'] as $cap => $data) { // if (isset($caps_clone[0]) && $cap == $caps_clone[0]) { // $parse_args['role'] = $data['role']; // // Return true for guest (same as post_types) // if ($data['role'] == 'guest') { // return $parse ? wpcf_access_parse_caps(true, // $parse_args) : true; // } // $level_needed = isset($map[$data['role']]) ? $map[$data['role']] : false; // $user_needed = !empty($data['users']) ? $data['users'] : false; // // $level_passed = false; // // if ($level_needed || is_array($user_needed)) { // $parse_args['data'] = array(); // $allow = false; // if ($level_needed) { // if (!empty($current_user->allcaps[$level_needed])) { // $allow = $level_passed = true; // } // } // if (!$level_passed && is_array($user_needed)) { // if (!in_array($current_user->ID, $user_needed)) { // $allow = true; // } // } // return $parse ? wpcf_access_parse_caps((bool) $allow, // $parse_args) : (bool) $allow; // } // break; // } // } // } // } // } $wpcf_access->debug_all_hooks[$capability_requested][] = $parse_args; return is_null($allow) ? $allcaps : wpcf_access_parse_caps((bool) $allow, $parse_args); }