您好!我正在尝试为我的 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 密钥,所以取得了一些成功,但用户没有按预期添加到组或从组中移除。但我可以确认所有变量都是正确的。
Ben Sutton:
问题是我没有收到任何错误或确认信息
它应该在成功或失败时返回一个有效负载。
你检查过 $response 的内容吗?
另外,我认为 usernames 参数的格式应该是字符串“username1,username2,...”。
1 个赞
simon
2024 年4 月 14 日 00:36
5
Ben Sutton:
我有什么遗漏的吗?
除非我做错了什么,否则对 \"/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 个赞
这是英勇的帮助,谢谢你,西蒙!如果我能利用 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);
}
不确定我错过了什么?
simon
2024 年4 月 14 日 14:51
8
删除用户加入一个或多个组的函数名为 remove_user_from_discourse_group,而你调用的是 remove_user_to_discourse_group。
将用户添加和删除到一个或多个组的函数在此处:wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub
3 个赞
你说得对!愚蠢的错误。感谢您的帮助,Simon。真希望有个小费罐。如果有什么我能帮到您的,请告诉我。干杯!
1 个赞
为了进一步扩展这一点,您是否知道在哪里可以找到更多用于编辑用户配置文件的辅助函数?如果可能的话,我希望能够设置用户的个人资料图片和简介。
simon
2024 年4 月 14 日 15:34
11
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 的 true 或 false 值。
要更新头像,请在 $sso_params 数组中设置 avatar_url 字段,并将 avatar_force_update 字段设置为 'true'。
有一个 bio 字段可用于设置简介。
WP Discourse 插件已设置 bio 和 avatar_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 个赞
system
(system)
关闭
2024 年5 月 14 日 15:35
12
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.