Спасибо!
Я всё перепутал: мне нужно было всё-таки в локальные группы курсов записывать, а не в глобальные.
Проверил запись в глобальные группы: при наличии прав с помощью метода core_cohort_external::add_cohort_members(array($cohort)) происходит запись в группу и на тот курс, в котором есть элементы, у которых указана данная группа в качестве ограничения доступа к элементу (тесту в моём случае).
Я всё перепутал: мне нужно было всё-таки в локальные группы курсов записывать, а не в глобальные.
Проверил запись в глобальные группы: при наличии прав с помощью метода core_cohort_external::add_cohort_members(array($cohort)) происходит запись в группу и на тот курс, в котором есть элементы, у которых указана данная группа в качестве ограничения доступа к элементу (тесту в моём случае).
РЕШЕНО:
В чём была ошибка - я пытался вызвать метод на странице, на которой вначале присутствует вывод шапки (echo $OUTPUT->header();).
Как и указывалось в исключении: "Cannot call moodle_page::add_body_class after output has been started."
Если вызывать метод до первого использования $OUTPUT или на станице, на которой он вообще не используется, то пользователь/пользователи успешно добавляются в группы.
Рабочий пример:
require("$CFG->dirroot/group/externallib.php");
core_group_external::add_group_members([
'members' => [
'groupid' => 1075,
'userid' => 12487,
]
]);
или
require("$CFG->dirroot/group/externallib.php");
$members = Array(
'members' => [
'groupid' => 1075,
'userid' => 12487,
],
[
'groupid' => 1075,
'userid' => 12488,
],
);
core_group_external::add_group_members($members);
Причём, если пользователь уже записан в группу, ошибок при выполнении не возникает.