我的 cURL 请求有什么问题?

您好!我正在尝试为我的 Wordpress 网站编写一个 cURL 请求,以将 Discourse 与 woo 订阅集成。这是我的函数,似乎不起作用。我是否遗漏了什么?

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 = 'Error in Discourse User Update cURL Request';
        $message = 'There was an error';
        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', // or 'PUT'
	'body'   => array(
		// 'group_id'  => $group_name, edit: this param isn't needed, not sure what was going on when I was testing it.
		'usernames' => 'sally,Ben',
	)
);

// path:
/groups/${group_id}/members.json

如果您在 WordPress 网站上配置了 WP Discourse 插件,则可以使用其静态 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' to add users; 'DELETE' to remove users
	$args     = array(
		'method' => $method,
		'body'   => array(
			// 'group_id'  => $group_name, edit: this param isn't needed
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // return, log, or handle the response
}

如果您将 WordPress 用作 Discourse 的 SSO 提供商,则有一个帮助函数允许您将 一个 用户添加到一组或多组中:

function zalg_sso_add_users_to_group() {
    $user_id = 1; // the user's WordPress user ID
    $group_names = 'foo,bar,baz'; // one or more comma separated group names, with no spaces after commas!
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

要将多个用户添加到单个组,您仍然需要使用第一个代码示例中的 discourse_request 方法。

3 个赞

响应只是一个 500 错误 :frowning:

这是英勇的帮助,谢谢你,西蒙!如果我能利用 WP Discourse 插件中现有的辅助函数,那会容易得多。我正在使用我的 WordPress 站点进行 SSO。

但是,当函数被触发时,我仍然在我的案例中遇到严重错误。不确定为什么。你说的对我来说有点难理解,但这是我在 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);
}

不确定我错过了什么?

删除用户加入一个或多个组的函数名为 remove_user_from_discourse_group,而你调用的是 remove_user_to_discourse_group

将用户添加和删除到一个或多个组的函数在此处:wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub

3 个赞

你说得对!愚蠢的错误。感谢您的帮助,Simon。真希望有个小费罐。如果有什么我能帮到您的,请告诉我。干杯!

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 sso_params 参数创建数组。该数组必须包含 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 发出请求时,任何布尔字段都必须设置为字符串 'true''false',而不是 PHP 的 truefalse 值。

要更新头像,请在 $sso_params 数组中设置 avatar_url 字段,并将 avatar_force_update 字段设置为 'true'

有一个 bio 字段可用于设置简介。

WP Discourse 插件已设置 bioavatar_url 字段。其 SSO 设置中还有一个“强制头像更新”选项。问题可能是这些设置仅在用户通过 WordPress 网站登录 Discourse 时才更新。sync_sso_record 函数会立即更新字段,无需用户登录 Discourse。

另外,如果您发现用户的简介未在 Discourse 上设置,可能是因为它们未在插件期望的 WordPress 网站上设置:wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub Woocommerce 为简介使用不同的字段,您可以访问该字段并在调用 sync_sso_record 时使用它。

3 个赞

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