$allcaps * @param array $caps * @param array $args * @return array */ public function grant(array $allcaps, array $caps, array $args, \WP_User $user): array { if (!in_array(self::USE, $caps, true) && !in_array(self::MANAGE, $caps, true)) { return $allcaps; } $manager = !empty($allcaps['manage_options']); if ($manager) { $allcaps[self::MANAGE] = true; $allcaps[self::USE] = true; return $allcaps; } if (array_intersect((array) $user->roles, $this->allowedRoles()) !== []) { $allcaps[self::USE] = true; } return $allcaps; } /** * The roles allowed to chat; administrators always are. * * @since 0.1.0 * @return list */ public function allowedRoles(): array { return array_values(array_unique(['administrator', ...(array) $this->settings->get('allowed_roles')])); } /** * The site's roles, for the Access tab. * * @since 0.1.0 * @return list */ public static function roles(): array { $roles = []; foreach (wp_roles()->get_names() as $slug => $name) { $roles[] = ['slug' => (string) $slug, 'name' => translate_user_role((string) $name)]; } return $roles; } }