cURLリクエストの問題は何ですか?

こんにちは!Discourse と woo サブスクリプションを連携させるために、WordPress サイトで cURL リクエストを作成しようとしています。以下は私の関数ですが、うまくいかないようです。何か見落としていることはありますか?

function execute_discourse_curl_request($subscription) {

    $subscription_status = $subscription->get_status();

    $user_id = $subscription->get_user_id();
    $user = get_user_by('ID', $user_id);
    $username = $user->user_login;

    $request = "";

    if ($subscription_status == 'active') {
        $request = "PUT";
    }

    if ($subscription_status == 'cancelled' || $subscription_status == 'on-hold') {
        $request = "DELETE";
    }

    $api_key = get_option( 'discourse_custom_api_key' );

    $group_id = 41;
    $api_url = 'https://forum.example.com/groups/' . $group_id . '/members.json';
    
    $data = [
        'usernames' => [$username],
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $request,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            "Api-Key: " . $api_key,
            "Api-Username: system",
            "Content-Type: application/json"
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);

    if ($err) {
        $to = 'hello@example.com';
        $subject = 'Discourse ユーザー更新 cURL リクエストのエラー';
        $message = 'エラーが発生しました';
        wp_mail($to, $subject, $message);
    }
}
「いいね!」 1

こんにちは。

どのようなエラーが表示されますか? レスポンスはどうなっていますか?
これにより、問題を理解するのに役立ちます。

問題は、エラーも確認も受け取れないことです。cURL が機能していないようです。cURL が実行されると Discourse API キーが使用されていることがわかりますので、ある程度の成功はありますが、ユーザーは意図したとおりに追加または削除されていません。変数はすべて正しいことを確認できます。

成功または失敗時にペイロードを返すはずです。

$response の内容を確認しましたか?

また、usernames パラメータの形式は文字列「username1,username2,...」であるべきだと思います。

「いいね!」 1

私が何か間違ったことをしていない限り、"/groups/${group_id}/members.json" へのリクエストは少し直感的ではありません。また、ドキュメント化されておらず、Discourse のグループページの「ユーザーの追加」フォームを送信する際にブラウザのネットワークタブで表示することもできません。繰り返しになりますが、私が何か間違っている可能性があります。

いずれにせよ、リクエストのパスは /groups/${group_id}/members.json で、group_id はグループの数値 ID に置き換えられます。 リクエストの本文には group_id パラメータが必要ですが、そのパラメータはグループの name に設定する必要があります。したがって、引数は次のようになります。

$group_id = 45;
$group_name = 'publishers';
$args     = array(
    'method' => 'DELETE', // または 'PUT'
	'body'   => array(
		// 'group_id'  => $group_name, 編集: このパラメータは不要です。テスト中に何が起こっていたのかわかりません。
		'usernames' => 'sally,Ben',
	)
);

// パス:
/groups/${group_id}/members.json

WordPress Discourse プラグインを WordPress サイトに設定している場合は、その静的な discourse_request ヘルパー関数を使用して、curl を使用する必要をなくすことができます。 plugin-utilities ファイルにある静的関数をリンクしましたが、外部リクエストに使用する必要がある名前空間は https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php から取得します。

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

function zalg_add_users_to_group() {
	$group_id = 45;
    $group_name = 'publishers';
    $method = 'PUT'; // ユーザーを追加するには 'PUT'、ユーザーを削除するには 'DELETE'
	$args     = array(
		'method' => $method,
		'body'   => array(
			// 'group_id'  => $group_name, 編集: このパラメータは不要です
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // レスポンスを返す、ログに記録する、または処理する
}

WordPress を Discourse の SSO プロバイダーとして使用している場合、1 人のユーザーを 1 つ以上のグループに追加できるヘルパー関数があります。

function zalg_sso_add_users_to_group() {
    $user_id = 1; // ユーザーの WordPress ユーザー ID
    $group_names = 'foo,bar,baz'; // 1 つ以上のカンマ区切りのグループ名。カンマの後にスペースは不要!
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

複数のユーザーを 1 つのグループに追加するには、最初のコード例にある discourse_request メソッドを引き続き使用する必要があります。

「いいね!」 3

レスポンスは500エラーです :frowning:

これは素晴らしい助けになります、サイモンさん!WP Discourseプラグインの既存のヘルパー関数を利用できれば、ずっと簡単になるでしょう。SSOにはWordPressサイトを使用しています。

しかし、関数が呼び出されると、私の場合は依然として致命的なエラーが発生します。理由がわかりません。おっしゃっていることは私の理解を超えていますが、functions.phpで使用しているのは次のとおりです。

<?php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

add_action('woocommerce_subscription_status_cancelled', 'zalg_sso_add_users_to_group', 10, 3);

function zalg_sso_add_users_to_group($subscription) {
    $user_id = $subscription->get_user_id();
    $group_names = 'premium';
    DiscourseUtilities::remove_user_to_discourse_group($user_id, $group_names);
}

何が足りないのかわかりません。

ユーザーを1つ以上のグループから削除する関数は remove_user_from_discourse_group と呼ばれますが、remove_user_to_discourse_group と呼び間違えています。

ユーザーを1つ以上のグループに追加および削除する関数は、こちらにあります: wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub

「いいね!」 3

おっしゃる通りです!うっかりしていました。サイモンさん、ご協力ありがとうございました。チップジャーがあればいいのに。何か私にできることがあれば教えてください。乾杯!

「いいね!」 1

これをさらに詳しく説明すると、ユーザープロフィールをさらに編集できるヘルパー関数が見つかる可能性のある場所をご存知ですか? 可能であれば、ユーザーのプロフィール写真と自己紹介を設定できると素晴らしいのですが。

Utilities ファイルにそのためのヘルパー関数があります。

DiscourseUtilities::sync_sso_record( $sso_params );

昨日、その使い方を例示しました: I cannot add user to the discouse forum from a wordpress website when user added in a membership - #10 by simon 引数の配列を作成するのが難しい部分です。その配列には external_id フィールドを含める必要があります。これはユーザーの WordPress ID に設定されます。

	$sso_params = array(
		'external_id' => $user_id,
	);

このリストにある任意のフィールドをペイロードに含めることができます: discourse/lib/discourse_connect_base.rb at 8f52fd1051e20fdff41321c5cff99fda05af86c1 · discourse/discourse · GitHub ACCESSORS リストのすぐ下にある BOOLS 配列に注意してください。これは、可能なオプションのうちどれが booleans (true/false) であるかを示しています。WordPress からリクエストを行う場合、ブール値フィールドは PHP の true または false 値ではなく、文字列 'true' または 'false' で設定する必要があります。

アバターを更新するには、$sso_params 配列で avatar_url フィールドを設定し、avatar_force_update フィールドを 'true' に設定します。

自己紹介を設定するために使用できる bio フィールドがあります。

WP Discourse プラグインは、すでに bio および avatar_url フィールドを設定しています。また、その SSO 設定に「Force Avatar Update」設定があります。問題は、これらの設定がユーザーが WordPress サイト経由で Discourse にログインしたときにのみ更新されることである可能性があります。sync_sso_record 関数は、ユーザーが Discourse にログインする必要なしに、フィールドを即座に更新します。

また、ユーザーの自己紹介が Discourse で設定されていないと思われる場合は、WordPress サイトでプラグインが期待している場所に設定されていない可能性があります: wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub に自己紹介用の別のフィールドがある場合は、そのフィールドにアクセスして sync_sso_record の呼び出しで使用できます。

「いいね!」 3

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.