permissionResolver = $permissionResolver; } /** * @return mixed[] */ public function __invoke(): array { $menus = [ // [ // 'parentSlug' => 'ivyforms', // 'pageTitle' => 'Dashboard', // 'menuTitle' => BackendStrings::getDashboardStrings()['dashboard'], // 'capability' => 'manage_options', // 'menuSlug' => 'ivyforms-dashboard', // ], [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'All Forms', 'menuTitle' => BackendStrings::getCommonStrings()['all_forms'], // WP checks this cap on the admin menu row; fine-grained access uses PermissionResolver below. 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, 'menuSlug' => 'ivyforms-forms', ], [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'New form', 'menuTitle' => BackendStrings::getCommonStrings()['new_form'], 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, 'menuSlug' => 'ivyforms-builder', ], [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'Entries', 'menuTitle' => BackendStrings::getEntriesStrings()['entries'], 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, 'menuSlug' => 'ivyforms-entries', ], // // TODO Add Settings page [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'Settings', 'menuTitle' => BackendStrings::getCommonStrings()['settings'], 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, 'menuSlug' => 'ivyforms-settings', ], [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'Integrations', 'menuTitle' => BackendStrings::getIntegrationsStrings()['integrations'], 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, 'menuSlug' => 'ivyforms-integrations', ], ]; // Add "Upgrade to PRO" menu only if Pro plugin is not installed/activated if (!IvyFormsAPI::isProPluginActive()) { $menus[] = [ 'parentSlug' => 'ivyforms', 'pageTitle' => 'Upgrade to PRO', // phpcs:ignore Generic.Files.LineLength.TooLong 'menuTitle' => '' . __('Upgrade to PRO', 'ivyforms') . '', 'capability' => IvyFormsAccess::CAP_ACCESS_PLUGIN, // phpcs:ignore Generic.Files.LineLength.TooLong 'menuSlug' => 'https://ivyforms.com/pricing?utm_source=ivy-lite&utm_medium=lite-upgrade&utm_content=ivy&utm_campaign=ivy', 'isExternal' => true, ]; } $visibleMenus = []; foreach ($menus as $menu) { if (!$this->canAccessMenu($menu)) { continue; } $visibleMenus[] = $menu; } return $visibleMenus; } /** * @param mixed[] $menu */ private function canAccessMenu(array $menu): bool { if (IvyFormsAccess::hasImplicitElevatedAccess()) { return true; } $resolver = $this->permissionResolver; $user = wp_get_current_user(); if (!$resolver || !$user instanceof \WP_User || (int) $user->ID <= 0) { return false; } $slug = (string) ($menu['menuSlug'] ?? ''); if ($slug === '' || strpos($slug, 'http') === 0) { return true; } return $this->canAccessBySlug($slug, $resolver, $user); } /** * @param list $permissionKeys */ private function userCanAnyOf(PermissionResolver $resolver, \WP_User $user, array $permissionKeys): bool { return $resolver->userCanAnyOf($user, $permissionKeys); } private function canAccessBySlug(string $slug, PermissionResolver $resolver, \WP_User $user): bool { if ($slug === 'ivyforms-forms') { return $this->userCanAnyOf($resolver, $user, [ 'view_forms_list', 'add_edit_forms', 'delete_forms', ]); } if ($slug === 'ivyforms-builder') { return $resolver->userCanIncludingFormScoped('add_edit_forms', $user, null); } if ($slug === 'ivyforms-entries') { return $this->userCanAnyOf($resolver, $user, ['view_entries_admin', 'delete_entries_admin']); } if (in_array($slug, ['ivyforms-settings', 'ivyforms-integrations'], true)) { return $resolver->userCanIncludingFormScoped('access_settings_page', $user, null); } return true; } }