'/backend-menu', 'toolbar' => '/admin-toolbar', 'metabox' => '/metaboxes', 'widget' => '/widgets', 'capability' => '/capabilities?fields=description,permissions,is_granted', 'post' => '/post_types', 'route' => '/api-routes', 'url' => '/urls', 'ability' => '/abilities', 'policy' => '/policies?fields=permissions,excerpt', 'identity' => '/identity/roles', 'jwt' => '/jwts?fields=claims', 'login_redirect' => '/redirect/login', 'logout_redirect' => '/redirect/logout', '404redirect' => '/redirect/not-found', 'redirect' => '/redirect/access-denied?area=frontend' ]; /** * Register the admin asset enqueue handler * * @return void * @access public * * @version 8.0.0 */ public static function boot() { add_action('admin_enqueue_scripts', [__CLASS__, 'enqueue']); } /** * Determine if WordPress supports the React workspace * * @return bool * @access public * * @version 8.0.0 */ public static function enabled() { return version_compare(get_bloginfo('version'), '6.2', '>='); } /** * Enqueue assets for the main access workspace * * @return void * @access public * * @version 8.0.0 */ public static function enqueue() { if ( !self::enabled() || !isset($_GET['page']) || $_GET['page'] !== 'aam' || !current_user_can('aam_manager') ) { return; } $base = plugins_url('media/', AAM_BASEDIR . '/aam.php'); // ConfigPress uses the WordPress code editor when syntax highlighting is enabled. $code_editor = wp_enqueue_code_editor([ 'type' => 'text/plain', 'codemirror' => ['mode' => 'aam-ini', 'lint' => false] ]); $dependencies = ['wp-element', 'wp-components', 'wp-api-fetch', 'wp-i18n']; if (false !== $code_editor) { $dependencies[] = 'code-editor'; } $style_version = filemtime(AAM_BASEDIR . '/media/css/react-admin.css') ?: AAM_VERSION; $script_version = filemtime(AAM_BASEDIR . '/media/js/react-admin.js') ?: AAM_VERSION; self::enqueue_confirmation_style(); self::enqueue_error_report_style(); wp_enqueue_style('wp-components'); wp_enqueue_style( 'aam-react', $base . 'css/react-admin.css', ['aam-confirm-dialog'], $style_version ); wp_enqueue_script( 'aam-react', $base . 'js/react-admin.js', $dependencies, $script_version, true ); wp_add_inline_script( 'aam-react', 'window.aamReactIniEditorEnabled = ' . (false !== $code_editor ? 'true' : 'false') . ';', 'before' ); wp_set_script_translations( 'aam-react', 'advanced-access-manager', AAM_BASEDIR . '/lang' ); } /** * Enqueue access controls for the post editor * * @return void * @access public * * @version 8.0.0 */ public static function enqueue_post_metabox() { $base = plugins_url('media/', AAM_BASEDIR . '/aam.php'); self::enqueue_confirmation_style(); $roles = []; if (current_user_can('aam_manage_roles')) { foreach (AAM::api()->roles->get_editable_roles(true) as $slug => $role) { if (AAM::api()->roles->is_editable_role($slug)) { $roles[] = [ 'value' => $slug, 'label' => translate_user_role($role['name']) ]; } } } $bootstrap = [ 'roles' => $roles, 'errorNotifications' => (bool) AAM::api()->config->get('core.settings.ui.error_notifications'), 'blogId' => get_current_blog_id(), 'viewerId' => get_current_user_id(), 'levels' => [ 'role' => current_user_can('aam_manage_roles') && !empty($roles), 'user' => current_user_can('aam_manage_users'), 'visitor' => current_user_can('aam_manage_visitors'), 'default' => current_user_can('aam_manage_default') ] ]; $bootstrap = apply_filters('aam_react_post_metabox_bootstrap_filter', $bootstrap); $style = AAM_BASEDIR . '/media/css/post-access-metabox.css'; $script = AAM_BASEDIR . '/media/js/post-access-metabox.js'; self::enqueue_error_report_style(); wp_enqueue_style('wp-components'); wp_enqueue_style( 'aam-post-access', $base . 'css/post-access-metabox.css', ['wp-components'], filemtime($style) ?: AAM_VERSION ); wp_enqueue_script( 'aam-post-access', $base . 'js/post-access-metabox.js', ['wp-element', 'wp-components', 'wp-api-fetch', 'wp-i18n'], filemtime($script) ?: AAM_VERSION, true ); wp_add_inline_script('aam-post-access', 'window.aamPostAccessBootstrap = ' . wp_json_encode($bootstrap, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) . ';', 'before'); wp_set_script_translations('aam-post-access', 'advanced-access-manager', AAM_BASEDIR . '/lang'); } /** * Enqueue the term editor access controls * * @return void * @access public * * @version 8.0.0 */ public static function enqueue_term_access() { $base = plugins_url('media/', AAM_BASEDIR . '/aam.php'); $roles = []; if (current_user_can('aam_manage_roles')) { foreach (AAM::api()->roles->get_editable_roles(true) as $slug => $role) { if (AAM::api()->roles->is_editable_role($slug)) { $roles[] = [ 'value' => $slug, 'label' => translate_user_role($role['name']) ]; } } } $bootstrap = apply_filters('aam_react_term_access_bootstrap_filter', [ 'roles' => $roles, 'errorNotifications' => AAM::api()->config->get('core.settings.ui.error_notifications'), 'blogId' => get_current_blog_id(), 'viewerId' => get_current_user_id(), 'contentPremium' => self::content_premium_status(), 'levels' => [ 'role' => current_user_can('aam_manage_roles') && !empty($roles), 'user' => current_user_can('aam_manage_users'), 'visitor' => current_user_can('aam_manage_visitors'), 'default' => current_user_can('aam_manage_default') ] ]); self::enqueue_confirmation_style(); self::enqueue_error_report_style(); wp_enqueue_style('wp-components'); wp_enqueue_style( 'aam-term-access-base', $base . 'css/react-admin.css', ['wp-components'], filemtime(AAM_BASEDIR . '/media/css/react-admin.css') ?: AAM_VERSION ); wp_enqueue_style( 'aam-term-access', $base . 'css/term-access.css', ['aam-term-access-base', 'aam-confirm-dialog'], filemtime(AAM_BASEDIR . '/media/css/term-access.css') ?: AAM_VERSION ); wp_enqueue_script( 'aam-term-access', $base . 'js/term-access.js', ['wp-element', 'wp-components', 'wp-api-fetch', 'wp-i18n'], filemtime(AAM_BASEDIR . '/media/js/term-access.js') ?: AAM_VERSION, true ); wp_add_inline_script('aam-term-access', 'window.aamTermAccessBootstrap = ' . wp_json_encode($bootstrap, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) . ';', 'before'); wp_set_script_translations('aam-term-access', 'advanced-access-manager', AAM_BASEDIR . '/lang'); } /** * Get the Premium add-on status for content access controls * * @return array * @access private * * @version 8.0.0 */ private static function content_premium_status() { $active = defined('AAM_COMPLETE_PACKAGE'); $installed = $active; if (!$installed && !function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if (!$installed) { foreach (array_keys(get_plugins()) as $plugin) { if (preg_match('~^aam-complete-package[^/]*/bootstrap\.php$~', $plugin)) { $installed = true; break; } } } return [ 'active' => $active, 'installed' => $installed, 'enabled' => $active && (bool) AAM::api()->config->get( 'service.content.enabled', true ), 'purchaseUrl' => 'https://aamportal.com/premium?ref=content-access', 'pluginsUrl' => current_user_can('activate_plugins') ? admin_url('plugins.php') : null, 'settingsUrl' => current_user_can('aam_manage_settings') ? admin_url('admin.php?page=aam&aam_service=settings') : null ]; } /** * Enqueue styles for confirmation dialogs * * @return void * @access private * * @version 8.0.0 */ private static function enqueue_confirmation_style() { $path = AAM_BASEDIR . '/media/css/confirmation-dialog.css'; wp_enqueue_style( 'aam-confirm-dialog', plugins_url('media/css/confirmation-dialog.css', AAM_BASEDIR . '/aam.php'), ['wp-components'], filemtime($path) ?: AAM_VERSION ); } /** * Enqueue the shared error recovery notice styles * * @return void * @access private * * @version 8.0.0 */ private static function enqueue_error_report_style() { $path = AAM_BASEDIR . '/media/css/error-report.css'; wp_enqueue_style( 'aam-error-report', plugins_url('media/css/error-report.css', AAM_BASEDIR . '/aam.php'), [], filemtime($path) ?: AAM_VERSION ); } /** * Enqueue the policy assignee selector * * @param int $policy_id * * @return void * @access public * * @version 8.0.0 */ public static function enqueue_policy_assignee_metabox($policy_id) { $base = plugins_url('media/', AAM_BASEDIR . '/aam.php'); $style = AAM_BASEDIR . '/media/css/policy-assignee-metabox.css'; $script = AAM_BASEDIR . '/media/js/policy-assignee-metabox.js'; $bootstrap = [ 'levels' => [ 'role' => current_user_can('aam_manage_roles') && current_user_can('aam_list_roles'), 'user' => current_user_can('aam_manage_users'), 'visitor' => current_user_can('aam_manage_visitors'), 'default' => current_user_can('aam_manage_default') ], 'attached' => [ 'visitor' => current_user_can('aam_manage_visitors') ? AAM::api()->policies('visitor')->is_attached($policy_id) : false, 'default' => current_user_can('aam_manage_default') ? AAM::api()->policies('default')->is_attached($policy_id) : false ] ]; self::enqueue_error_report_style(); wp_enqueue_style('wp-components'); wp_enqueue_style( 'aam-policy-assignee', $base . 'css/policy-assignee-metabox.css', ['wp-components'], filemtime($style) ?: AAM_VERSION ); wp_enqueue_script( 'aam-policy-assignee', $base . 'js/policy-assignee-metabox.js', ['wp-element', 'wp-components', 'wp-api-fetch', 'wp-i18n'], filemtime($script) ?: AAM_VERSION, true ); wp_add_inline_script('aam-policy-assignee', 'window.aamPolicyAssigneeBootstrap = ' . wp_json_encode($bootstrap, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) . ';', 'before'); wp_set_script_translations('aam-policy-assignee', 'advanced-access-manager', AAM_BASEDIR . '/lang'); } /** * Validate access to the selected access level * * @param string $type * @param mixed $id * * @return void * @throws RuntimeException * @access public * * @version 8.0.0 */ public static function validate_context($type, $id) { $caps = [ 'role' => 'aam_manage_roles', 'user' => 'aam_manage_users', 'visitor' => 'aam_manage_visitors', 'default' => 'aam_manage_default' ]; if (!current_user_can('aam_manager') || !isset($caps[$type]) || !current_user_can($caps[$type])) { throw new RuntimeException(__('You cannot manage this access level.', 'advanced-access-manager')); } if ($type === 'role' && (!$id || !AAM::api()->roles->is_editable_role($id))) { throw new RuntimeException(__('This role is not editable.', 'advanced-access-manager')); } if ($type === 'user') { $user = apply_filters('aam_get_user', get_user_by('id', absint($id))); if (!$user || is_wp_error($user) || !current_user_can('edit_user', $user->ID)) { throw new RuntimeException(__('This user is not editable.', 'advanced-access-manager')); } } } /** * Render the access workspace * * @return void * @access public * * @version 8.0.0 */ public static function render() { if (!current_user_can('aam_manager')) { wp_die(esc_html__('You cannot manage access settings.', 'advanced-access-manager')); } if (!self::enabled()) { echo '
' . esc_html__('WordPress 6.2 or newer is required for the access workspace.', 'advanced-access-manager') . '
' . esc_html($e->getMessage()) . '