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',
],
[
'parentSlug' => 'ivyforms',
'pageTitle' => 'Payments',
'menuTitle' => BackendStrings::getPaymentStrings()['payments'],
'capability' => 'manage_options',
'menuSlug' => 'ivyforms-payments',
],
[
'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',
],
];
// Payments page stays hidden while Stripe and PayPal are turned off
if (!PaymentsFeature::isEnabled()) {
$menus = array_values(array_filter(
$menus,
static fn(array $menu): bool => $menu['menuSlug'] !== 'ivyforms-payments'
));
}
// 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;
}
}