Добавить группы и категории (с безопасностью) через WP-Discourse или API?

Мы управляем подпиской через нашу систему WordPress/WooCommerce. Мы уже несколько лет используем Discourse на поддомене с SSO, и всё работает отлично. В файле функций у меня есть код, который добавляет или удаляет доступ к Группе при вступлении или отмене подписки соответственно.

Мы добавили функцию в нашу подписку, позволяющую пользователям объединяться в небольшие группы по 6–8 человек для еженедельных звонков в Zoom.

Для управления этим мы создали тип записи WordPress под названием «Группы» (Cohorts), в котором хранится информация о еженедельных звонках, и привязали эти группы к пользователям через пользовательские поля.

Вот что я хочу сделать:

  1. Создать Группу для каждой из групп (Cohorts).
  2. Создать подкатегорию для каждой из групп (Cohorts), доступ к которой имеют только участники Группы из пункта 1.
  3. Добавить каждого участника в соответствующую Группу, что даст ему доступ к его подкатегории и возможность писать в ней для своей группы (Cohort).

Я знаю, как выполнить пункт 3, но есть ли способ программно добавлять Группы и подкатегории (с настройками безопасности)?

Я не могу найти эту функциональность в утилитах WP-Discourse. Также, изучая API, я вижу, где добавлять категории, но не функции безопасности.

Возможно ли то, что я хочу сделать?

Да, это возможно. Вы можете выполнить любой API-запрос к Discourse из WordPress, используя утилиту discourse_request, например:

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
$args =  array(
   "body" => "",
   "type" => "post"
);
$response = DiscourseUtilities::discourse_request( $path, $args );

Это правильно отформатирует запрос и использует API-ключ и пользователя, указанные в настройках плагина WP Discourse. Для действий, о которых вы упоминаете, вам понадобится глобальный ключ (если вы также используете тот же ключ для обычной функциональности WP Discourse).

Создание группы

Необходимый вам endpoint: Discourse API Docs. В документации по API нет полного списка параметров, но вы найдете их здесь: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Создание категории

Необходимый вам endpoint: Discourse API Docs. Полный список параметров также доступен здесь: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Обратите внимание, что «настройки безопасности» обрабатываются через параметр permissions. Вам нужно передать объект, где ключами будут названия групп, а значениями — целые числа, обозначающие уровень доступа, например:

{
  "cohort1": 2,
  "staff": 1
}

Список целых чисел, соответствующих уровням доступа, вы найдете здесь: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

@Angus, огромное спасибо! Это было именно то, что мне нужно!

Мне удалось создать группы, назначить пользователей в группы и создать категории с правильными настройками безопасности.

Я очень ценю вашу помощь.

Однако у меня есть ещё один вопрос… Когда я попытался выполнить PUT-запрос для обновления категории или группы, я получил эту ошибку:

Фатальная ошибка: Uncaught Error: Call to undefined function wp_remote_put() в […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

Вот мой тестовый код, пытающийся обновить категорию с ID 61 новым именем:

$path = "/categories/61.json";
$args =  array( 
			"type" => "put",
			"body" => array (
				"name" => "Cohorts 1",
			)
   		);
$response = DiscourseUtilities::discourse_request( $path, $args )

Что я делаю не так?

Есть какие-то идеи? Большое спасибо!

Извини, Тим, я был в отъезде последние несколько дней. Похоже, метод discourse_request нужно немного доработать, чтобы поддержать это. На следующей неделе я создам PR, и, вероятно, ещё потребуется неделя на его слияние.

Если тебе нужно это раньше, ты можешь использовать базовые методы WordPress следующим образом:

$api_credentials = DiscourseUtilities::get_api_credentials();
if ( is_wp_error( $api_credentials ) ) {
    return $api_credentials;
}

$headers = array(
    'Api-Key'      => sanitize_key( $api_credentials['api_key'] ),
    'Api-Username' => sanitize_text_field( $api_credentials['api_username'] ),
    'Accept'       => 'application/json',
);
$body = array( /* специфично для используемого эндпоинта */ );
$url = /* Абсолютный URL используемого эндпоинта */;

$opts = array(
   'headers' => $headers,
   'body' => json_encode( $body ),
   'method'  => 'PUT'
);

$result =  wp_remote_request( $url, $opts );

Привет, @timgrahl, не могли бы вы поделиться рабочим кодом функции для WordPress с WooCommerce для добавления/удаления пользователей в группы?

Я использую WooCommerce с членством и пытаюсь настроить это… если у пользователя WordPress есть активное членство в WooCommerce, то пользователь должен быть добавлен в группу X… когда членство отменяется или истекает, пользователь удаляется из группы X

Привет, Том! Для синхронизации групп Discourse с членством в WooCommerce воспользуйтесь подходом, описанным здесь:

Да, я видел это… но всё же слишком тупой, чтобы создать фрагмент кода для этого :confused: