getName(); }, $userGroups ); return array_flip($userGroupNames); } private function getUserGroupIdAndType(array $namesMap, string $identifier, ?string &$type = ''): int|string { $type = (is_numeric($identifier) === true) ? 'id' : 'name'; return $namesMap[$identifier] ?? $identifier; } /** * @throws ExitException * @throws UserGroupTypeException */ private function getAddRemoveUserGroups( string $operation, string $objectType, int|string $objectId, array $userGroupIds, array $userGroups, ?array &$addUserGroups = [], ?array &$removeUserGroups = [] ): bool { $addUserGroups = []; $namesMap = $this->getUserGroupNameMap($userGroups); // find the UserGroup object for the ids or strings given on the commandline foreach ($userGroupIds as $identifier) { $userGroupId = $this->getUserGroupIdAndType($namesMap, $identifier, $type); if (isset($userGroups[$userGroupId]) !== true) { $this->wordpressCli->error("There is no group with the $type: $identifier"); return false; } $addUserGroups[$userGroupId] = $userGroups[$userGroupId]; } $removeUserGroups = ($operation === self::ACTION_UPDATE) ? $this->userGroupHandler->getUserGroupsForObject($objectType, $objectId) : []; if ($operation === self::ACTION_REMOVE) { $removeUserGroups = $addUserGroups; $addUserGroups = []; } return true; } /** * update groups for an object * ## OPTIONS * : 'add', 'remove' or 'update' * : 'page', 'post', 'user', 'role', 'category' or any other term type * : the id of the object (string for role) * : comma separated list of group names or ids to add, remove of update to for the object * ## EXAMPLES * wp uam object add user 1 fighters,losers * wp uam object remove role author fighters * wp uam object update category 5 controller * @param array $arguments * @param array $assocArguments * @throws ExitException * @throws UserGroupTypeException * @throws Exception */ public function __invoke(array $arguments, array $assocArguments): void { if (count($arguments) < 4) { $this->wordpressCli->error(', , and are required'); return; } $operation = $arguments[0]; $messages = [ self::ACTION_ADD => 'Groups %1$s successfully added to %2$s %3$s', self::ACTION_UPDATE => 'Successfully updated %2$s %3$s with groups %1$s', self::ACTION_REMOVE => 'Successfully removed groups: %1$s from %2$s %3$s' ]; // check that an operation is valid if (isset($messages[$operation]) === false) { $this->wordpressCli->error("Operation is not valid: $operation"); return; } $objectType = $arguments[1]; $objectId = $arguments[2]; $userGroupIds = array_unique(explode(',', $arguments[3])); $userGroups = $this->userGroupHandler->getUserGroups(); $success = $this->getAddRemoveUserGroups( $operation, $objectType, $objectId, $userGroupIds, $userGroups, $addUserGroups, $removeUserGroups ); if ($success === false) { return; } foreach ($userGroups as $groupId => $userGroup) { if (isset($removeUserGroups[$groupId]) === true) { $userGroup->removeObject($objectType, $objectId); } if (isset($addUserGroups[$groupId]) === true) { $userGroup->addObject($objectType, $objectId); } $userGroup->save(); } $this->wordpressCli->success( sprintf($messages[$operation], implode(', ', $userGroupIds), $objectType, $objectId) ); } }