WordPressウェブサイトからメンバーシップに追加されたユーザーをDiscourseフォーラムに追加できません

こんにちは。Discourseフォーラム(https://community.over40connect.com/)で問題が発生しています。このフォーラムは、wp discourseプラグインを使用して私のウェブサイト(https://over40connect.com/staging/)に接続されています。ユーザーの役割が変更されたときにユーザーをDiscourseグループに追加する関数を作成しましたが、ユーザーがDiscourseグループに追加されません。コードは以下のとおりです。

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // 役割の変更がケースに関連しているか確認します
    // 例えば、新しい役割が 's2member_level1' の場合にのみ実行したい場合があります
    //if ($role === 's2member_level1') {
    // Discourse APIエンドポイントを設定します
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // 送信するデータを設定します
    $data = array(
        'usernames' => array('haseebdeveloper'), // 追加するWordPressユーザーのユーザー名
    );

    // APIリクエストを実行します
    $response = wp_remote_post($discourse_endpoint, array(
        'method'      => 'POST',
        'timeout'     => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking'    => true,
        'headers'     => array(
            'Content-Type' => 'application/json',
            'Api-Key'      => 'REDACTED', // ここにDiscourse APIキーを追加します
        ),
        'body'        => json_encode($data),
        'cookies'     => array(),
    ));

    // エラーを確認し、応答を処理します
    if (!is_wp_error($response)) {
        $response_code = wp_remote_retrieve_response_code($response);

        if ($response_code === 200) {
            $response_body = wp_remote_retrieve_body($response);
            error_log('Discourse API Response: ' . $response_body); // 応答をログに記録します
            // 必要に応じて応答を処理します
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // エラーをログに記録します
            // エラーを処理します
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // エラーをログに記録します
        // エラーを処理します
    }
    //}
}
「いいね!」 1

コードスニペットから実際と思われるAPIキーを削除しました @Haseeb_Ahmed。それを無効にし、新しいものを生成することをお勧めします。:+1:

「いいね!」 4

あなたのサイトを訪問したところ、あなたのWordPressサイトがディスコースサイトのディスコースコネクト認証プロバイダーとして機能していると思われます。それが正しい場合、WordPressユーザーをディスコースグループに追加するために add_user_to_discourse_group ヘルパー関数を使用できます: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326。関数の使用方法の詳細はこちらです:

コード例の先頭にある use ステートメントに注意してください:

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

そして、それが(静的)関数を呼び出すためにどのように使用されるか:

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
「いいね!」 3

こんにちは @simon、このコードのみを使用しました。

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

   $group_names = array("volunteers", "moderators");
   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names );
    
}

しかし、ユーザーの役割を変更しても、まだユーザーがディスコースグループに追加されません。

これは配列ではなく、カンマ区切りの文字列であるべきだと思います。

「いいね!」 2

@Firepup650 が正しいです。group_names パラメータは文字列に設定する必要があります。複数のグループにユーザーを追加する場合は、グループ名をコンマで区切ってください(コンマの後にスペースは入れないでください)。

$group_names = "volunteers,moderators";

機能しない場合、または機能している場合でも、$result の値をログに記録して、何が返されているかを確認してみてください。

「いいね!」 3

こんにちは @Firepup650、ご協力ありがとうございます。以下に私のコードを示します。

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// ユーザーの役割が変更されたときに実行されるフック
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

   $group_names = array("volunteers", "moderators");
	$group_names_string = implode(",", $group_names);

   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names_string );

}

ユーザーはボランティアグループに追加されますが、モデレーターグループには追加されません。問題点を教えていただけますか?

「いいね!」 1

この関数呼び出しでは、ユーザーを「モデレーター」、「管理者」、または「スタッフ」グループに追加することはできません。技術的には、このアプローチではどの「自動」グループにもユーザーを追加できません。追加できるのは、自分で作成したカスタムグループのみです。

編集:モデレーターグループにユーザーを追加する必要がある場合は、sync_sso_record 関数を確認してください:https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81。`add_user_to_discourse_group` 関数は、sync_sso_record の便利なラッパーにすぎません。

moderatorboolean)は、SSOパラメータで受け入れられる引数です:discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub パラメータを使用して、追加したいカスタムグループを指定することもできます。これにより、1回のAPI呼び出しでユーザーを「モデレーター」グループと「ボランティアメンバー」グループに追加できます。

編集2:sync_sso_record 関数アプローチを試す場合、moderator パラメータのブール値 true の代わりに文字列 "true" を使用する必要があるかもしれません。PHPは true1 として解釈します。Discourseはこのケースを処理するために文字列 "true" を受け入れると思います。SSOパラメータを設定するために get_sso_params 関数を使用できることに注意してください:https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129。その方法は、`add_user_to_discourse_group` 関数のコードに例があります。

「いいね!」 3

こんにちは、@simon さん。ユーザーをモデレーターグループに追加する方法について、コード例を教えていただけますか?

基本的な考え方はこうです。関数の条件を追加して、役割が変更されたときにすべてのユーザーがモデレーターグループに追加されないようにする必要があると思います。

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id' => $user_id,
		'moderator'   => 'true', // ブーリアン値の 'true' と 'false' は文字列として設定する必要があります!
		'add_groups'  => 'volunteers' // カンマ区切りのリスト。カンマの後にスペースは不要です。
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}
「いいね!」 1

こんにちは、@simon さん。ユーザーの役割が変更されたときに使用しているコードで問題が発生しています。

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// ユーザーの役割が変更されたときに実行されるフック
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {
// 	var_dump($role);
// 	die();
	  if ($role == 's2member_level1') {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
// 	  	$group_names = array("haseeb-group", "moderators");
// 			$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 	  	var_dump($result);
// 	  	die();
		  	
// 			var_dump($result);
        }
		else if($role == 's2member_level2'){
			   $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
		}
		
		else if($role == 's2member_level3'){
			   $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
		}
	
		
		else if($role == 's2member_level4'){
			   $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
		}
		
		else {
    // すべてのレベルグループを収集
    $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
    $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
    $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
    $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

    // すべてのグループを1つの配列に結合
    $s2member_level_groups = array_merge(
        explode(',', $s2member_level_1_groups),
        explode(',', $s2member_level_2_groups),
        explode(',', $s2member_level_3_groups),
        explode(',', $s2member_level_4_groups)
    );

    // 重複を削除
    $s2member_level_groups = array_unique($s2member_level_groups);

    // 収集したすべてのグループからユーザーを削除
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // 必要に応じて $result を処理できます
    }
}


    
}

このコードの目的は、条件に基づいてユーザーを追加または削除することですが、どのような場合でも、フォーラム管理者に承認または拒否または削除が必要であるという通知が届きます。これは、else のケースでユーザーを特定のグループから削除したいだけなのに、管理者に新しいユーザーのレビュー通知が再び届くという状況で発生します。

もう1つのことは、ユーザーが WordPress ウェブサイトに登録すると、理由もわからずにこれらのグループ trust_level_0 と trust_level_1 に自動的に追加されることです。

助けていただけますか。ユーザー登録フックも共有できます。

これらはコアのDiscourseグループであり、権限管理などに使用されるため、自動的にtrust_level_0とtrust_level_1に追加されます。

これは、スクリーンショットで言及されているように、すべての新規ユーザーにスタッフによる承認を要求する設定になっているためです。

image

上記で述べたように、承認が必要な新規ユーザーを追加しているようです。

「いいね!」 1

@Firepup650 が書いたことに加えて、コードが次のように呼び出されるとき

DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);

Discourse の sync_sso ルートにリクエストを行うヘルパー関数を呼び出しています: https://meta.discourse.org/t/sync-discourseconnect-user-data-with-the-sync-sso-route/84398。そのリクエストは、既存のユーザーを更新するか、新しいユーザーを作成するために使用されます。`$user_id` を持つユーザーがあなたの Discourse サイトにログインしたことがない場合、新しいユーザーが作成されます。問題なくグループに追加されるはずですが、サイトで must approve users サイト設定が有効になっているため、モデレーターに通知が生成されます。

「いいね!」 1

こんにちは @simon、また問題が発生しました。

ウェブサイトにユーザーが登録し、Discourse にも追加されるときにユーザーデータを同期したいのですが、Discourse のプロファイルにカスタムフィールドの情報が同期されていません。以下にコードを記載しますので、確認していただけますでしょうか。

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // 1つの引数のみを受け入れるように調整しました

function user_registered_callback($user_id) {
    // ユーザーIDに基づいてユーザーデータを取得します
    $user_data = get_userdata($user_id);

    // ユーザーデータが存在するか確認します
    if ($user_data) {
        // ユーザーのロールを取得します
        $roles = $user_data->roles;

        // ユーザーが s2Member ロールを持っているか確認します
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);

            // カスタムフィールドを取得します
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // SSO パラメータ配列を準備します
            $sso_params_array = [];
            $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

            $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array, $user_id);
			var_dump($fields_updated);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // すべてのレベルグループを収集します
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // すべてのグループを1つの配列に結合します
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // 重複を削除します
            $s2member_level_groups = array_unique($s2member_level_groups);

            // 収集したすべてのグループからユーザーを削除します
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // 必要に応じて $result を処理できます
            }
        }
    } else {
        // ユーザーデータが利用できない場合の処理
        // 要件に基づいてメッセージをログに記録するか、別の方法で処理します
        error_log("User data not available in user_registered_callback.");
    }
}

このコードを確認してください。

  $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

var_dump($fields_updated); を実行すると true が返されますが、Discourse のユーザープロファイルにデータが追加されません。問題は何でしょうか?

何か変更がない限り、ここで説明されているアプローチを使用する必要があります: Map custom User Fields - #7 by simon.

まず、カスタムフィールドがDiscourseに既に存在することを確認してください。次に、Discourseサイトの /admin/customize/user_fields ページで、URLに .json を追加して、ユーザーフィールドのJSONを表示できるようにします。たとえば http://localhost:4200/admin/customize/user_fields.json のようになります。

JSONから取得した id 値を使用して、次のようなSSOキーを設定します: custom.user_field_<field_id>. たとえば custom.user_field_1 のようになります。

現時点ではテストできません。これが機能するかどうか教えてください。まだ行われていない場合は、独自のトピックで文書化されるべきです。

こんにちは、@simon さん。あなたが説明してくれたアプローチを使用して、コードを以下のように変更しました。

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // 1つの引数のみを受け入れるように調整

function user_registered_callback($user_id) {
    // ユーザーIDに基づいてユーザーデータを取得
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // ユーザーデータが存在するかどうかを確認
    if ($user_data) {
        // ユーザーのロールを取得
        $roles = $user_data->roles;

        // ユーザーがs2Memberロールを持っているか確認
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
			 $sso_params = array();
//             // カスタムフィールドを取得
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // SSOパラメータ配列を準備
//             $sso_params_array = [];
//             $sso_params_array = [
// 				'external_id' => $user_id,
//                 'custom.user_field_1' => $custom_fields['user_interests'],
//                 'custom.user_field_2' => $custom_fields['user_age'],
//                 'custom.user_field_3' => $custom_fields['user_gender'],
//                 'custom.user_field_4' => $custom_fields['user_sexual'],
//                 'custom.user_field_5' => $custom_fields['users_reasons']
//             ];

//             $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array);
			 $sso_params = apply_filters( 'wpdc_sso_params', $sso_params, $user_data );
			var_dump($sso_params);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // すべてのレベルグループを収集
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // すべてのグループを1つの配列に結合
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // 重複を削除
            $s2member_level_groups = array_unique($s2member_level_groups);

            // すべての収集されたグループからユーザーを削除
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // 必要に応じて $result を処理できます
            }
        }
    } else {
        // ユーザーデータが利用できない場合の処理
        // 要件に基づいてメッセージをログに記録するか、別の方法で処理します
        error_log("User data not available in user_registered_callback.");
    }
}




add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );

function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
    $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user->ID);
	
    // $custom_fields が配列であり、空でないか確認
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // カスタムフィールドをSSOパラメータの対応するキーに割り当てます
        $sso_params['custom.user_field_1'] = $custom_fields['user_interests'];
        $sso_params['custom.user_field_2'] = $custom_fields['user_age'];
        $sso_params['custom.user_field_3'] = $custom_fields['user_gender'];
        $sso_params['custom.user_field_4'] = $custom_fields['user_sexual'];
        $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];
    } else {
        // $custom_fields が予期した形式でない場合は、エラーメッセージをログに記録または表示します
        error_log('Custom fields data is not in the expected format.');
    }

    // 変更されたSSOパラメータを返します
    return $sso_params;
}

現在、問題は、$sso_params['custom.user_field_5'] = $custom_fields['users_reasons']; の行をコメントアウトすると、他のフィールドのデータがDiscourseユーザーに追加されますが、この行をコメントアウトしないと、Discourseのユーザープロファイルにデータが追加されません。users_reasons フィールドは、DiscourseサイトとWordPressサイトの両方でマルチセレクトフィールドですが、これが原因でしょうか?教えてください。

はい、問題はそれがマルチセレクトフィールドであることです。まだサポートされているかどうかわかりません: https://meta.discourse.org/t/add-support-for-multi-select-fields-in-discourseconnect-protocol/219302。

おそらく、今すぐ機能させる方法があるかもしれませんが、その方法がわかりません。呼び出されるDiscourseコードはここにあります: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

Hi @simon、提供された参照に従ってコード例を記述していただけますか?

不可能だと思います。私が知る限り、SSOペイロードからカスタムフィールドを設定するコードは、私がリンクした投稿が書かれた時点からわずかに変更されていますが、マルチセレクトフィールドをSSOペイロードから更新できるように変更されてはいません。

理想的には、Discourseは add_groups SSOフィールドを処理する方法と同様の方法でケースを処理するべきです: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub SSOコードは、特定のカスタムフィールドがマルチセレクトフィールドであるかどうかを知る必要があります。現在、コードはその情報を持っていないと思います。

繰り返しますが、現在でも方法があるかもしれませんが、それは私にはわかりません。

こんにちは、@simon さん。WordPress と Discourse 間でユーザーのアバターを同期したいと考えています。すでに WP Discourse プラグインを使用して SSO を設定していますが、Discourse ウェブサイトでユーザーがアバターを変更したときに、WordPress ウェブサイトでもアバターが変更されるようにしたいです。これはどのように可能でしょうか?また、WordPress では特定のアバタープラグインを使用したいと考えています。以下に使用しているコードを示します。

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// download_url() および wp_handle_sideload() 関数を使用できるようにします
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// 一時ディレクトリにダウンロード
	$temp_file = download_url( $avatar_url );

	if( is_wp_error( $temp_file ) ) {
		return false;
	}

	// 一時ファイルをアップロードディレクトリに移動
	$file = array(
		'name'     => basename( $image_url ),
		'type'     => mime_content_type( $temp_file ),
		'tmp_name' => $temp_file,
		'size'     => filesize( $temp_file ),
	);
	$sideload = wp_handle_sideload(
		$file,
		array(
			'test_form'   => false // 'action' パラメータをチェックする必要はありません
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// 必要であればエラーメッセージを返すことができます
		return false;
	}

	// WordPress メディアライブラリにアップロードされた画像をここに追加します
	$attachment_id = wp_insert_attachment(
		array(
			'guid'           => $sideload[ 'url' ],
			'post_mime_type' => $sideload[ 'type' ],
			'post_title'     => basename( $sideload[ 'file' ] ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sideload[ 'file' ]
	);

	if( is_wp_error( $attachment_id ) || ! $attachment_id ) {
		return false;
	}

	// メタデータを更新し、画像サイズを再生成します
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

	wp_update_attachment_metadata(
		$attachment_id,
		wp_generate_attachment_metadata( $attachment_id, $sideload[ 'file' ] )
	);

	// 添付ファイルの ID を返します
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

ご覧のとおり、添付ファイルの ID を使用してユーザーのメタキーを更新したいのですが、添付ファイルの ID が作成されていません。

ご連絡をお待ちしております。

ありがとうございます。