self::SLUG] + $args, admin_url('admin.php')); } /** @return array role slug => translated name, administrator excluded */ public static function roles(): array { $names = function_exists('wp_roles') ? (array) wp_roles()->get_names() : []; unset($names['administrator']); $out = []; foreach ($names as $slug => $name) { $out[(string) $slug] = function_exists('translate_user_role') ? translate_user_role((string) $name) : (string) $name; } return $out; } /** @return array */ public static function mode_labels(): array { return [ Access::NONE => __('No access', 'zadex'), Access::CONTENT => __('Content only', 'zadex'), Access::FULL => __('Full access', 'zadex'), ]; } public function render(): void { if (!current_user_can('manage_options')) { return; } $config = Access::roles_config(); $labels = self::mode_labels(); $settings = get_option('zadex_settings', []); $emails = !is_array($settings) || !array_key_exists('notes_emails', $settings) || !empty($settings['notes_emails']); ?>

$name) : $mode = $config[$slug] ?? Access::FULL; ?> $label) : ?>

isset($_POST['roles']) && is_array($_POST['roles']) ? map_deep(wp_unslash($_POST['roles']), 'sanitize_key') : [], 'notes_emails' => isset($_POST['notes_emails']) && sanitize_key(wp_unslash($_POST['notes_emails'])) === '1', ]; $this->save($input); Notices::add(self::SLUG, __('Settings saved.', 'zadex')); wp_safe_redirect(self::url()); exit; } /** * Capability + nonce check, then sanitize and persist (split from handle_save for tests). * * @return array{roles: array, notes_emails: bool} */ public function save(array $input): array { if (!current_user_can('manage_options')) { wp_die(esc_html__('Not allowed.', 'zadex'), 403); } check_admin_referer(self::ACTION); $roles = Access::sanitize_roles(is_array($input['roles'] ?? null) ? $input['roles'] : [], array_keys(self::roles())); update_option(Access::OPTION, $roles); $emails = !empty($input['notes_emails']); $settings = get_option('zadex_settings', []); $settings = is_array($settings) ? $settings : []; $settings['notes_emails'] = $emails; update_option('zadex_settings', $settings); return ['roles' => $roles, 'notes_emails' => $emails]; } }