WP-DiscourseまたはAPIでグループとカテゴリ(セキュリティ付き)を追加しますか?

WordPress/WooCommerce システムで会員制度を運営しています。数年前から SSO を使用してサブドメインで Discourse を利用しており、順調に機能しています。人が参加/キャンセルした際にグループアクセスを追加/削除するコードを functions ファイルに入れています。

会員制度に、週次の Zoom 通話のために 6〜8 人の小グループに参加できる機能を追加しました。

これを管理するために、「コホート」という WordPress の投稿タイプを作成し、週次の通話情報をそこに含め、カスタムユーザーフィールドを使用してそれらのコホートをユーザーに割り当てました。

以下を行いたいと考えています。

  1. 各コホートのグループを作成する
  2. #1 のグループのみがアクセスできる、各コホートのサブカテゴリを作成する
  3. 各メンバーをそれぞれのグループに配置し、コホートのサブカテゴリへのアクセス権を付与する

#3 は方法を知っていますが、グループとサブカテゴリ(セキュリティ設定を含む)をプログラムで追加する方法はありますか?

WP-Discourse のユーティリティにはこの機能が見つかりません。API を見ても、カテゴリの追加方法はわかりますが、セキュリティ機能についてはわかりません。

私がやりたいことは可能ですか?

はい、可能です。WordPressからDiscourseへのAPIリクエストは、discourse_requestユーティリティメソッドを使用して行うことができます。たとえば、次のようになります。

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

これにより、リクエストが正しくフォーマットされ、WP Discourseの設定で提供されたAPIキーとユーザーが使用されます。参照しているアクションには、グローバルキーが必要になります(通常のWP Discourse機能にも同じキーを使用している場合)。

グループの作成

必要なエンドポイントは次のとおりです: Discourse API Docs discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

カテゴリの作成

必要なエンドポイントは次のとおりです: 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

「いいね!」 2

@Angus、本当にありがとうございます!まさに必要としていたものでした!

グループを作成し、ユーザーをグループに割り当て、適切なセキュリティでカテゴリを作成することができました。

ご協力に心より感謝いたします。

もう一つ質問があります…カテゴリまたはグループを更新するためにPUTを実行しようとすると、このエラーが発生します。

致命的なエラー:未定義の関数wp_remote_put()への呼び出し Error: Call to undefined function wp_remote_put() in […]/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を作成しますが、マージされるまでさらに1週間かかるでしょう。

それよりも早く必要な場合は、次のようにWPの基盤となるメソッドを使用できます。

$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グループ」から削除されます。

Tomさん、DiscourseグループとWooCommerceメンバーシップを同期するには、こちらで説明されているアプローチを使用してください。

ええ、それを見ましたが、それでもコードスニペットを作成するにはあまりにも愚かです :confused: