и в моих настройках в Discourse WP я использую провайдера Discourse Connect
Привет, @simon @Firepup650, после долгого перерыва мне снова нужна помощь.
Вот мой код:
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
function mepr_capture_new_member_signup_completed($event) {
$user = $event->get_data();
$user_id = $user->ID;
// Получение данных пользователя по ID
$user_data = get_userdata($user_id);
// Логирование отладочной информации о данных пользователя
log_debug_info("debug_log.txt", "Данные пользователя: ", print_r($user_data, true));
// Проверка существования данных пользователя
if ($user_data) {
// Получение ролей пользователя
$roles = $user_data->roles;
// Проверка: есть ли у пользователя роль "browns" или нет
if (!in_array('browns', $roles) || in_array('browns', $roles)) {
// Удаление всех существующих ролей
foreach ($roles as $role) {
$user_data->remove_role($role);
}
// Добавление роли "browns"
$user_data->add_role('browns');
log_debug_info("debug_log.txt", "Назначена роль Browns: ", print_r($user_data, true));
if ( class_exists( '\WPDiscourse\Discourse\Discourse' ) ) {
// Добавление пользователя в группу Discourse для "browns"
$s2member_level_1_groups = get_option('s2member_level_1_groups', '');
log_debug_info("debug_log.txt", "Группы уровня 1 s2member: ", print_r($s2member_level_1_groups, true));
$result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
log_debug_info("debug_log.txt", "Результат добавления в группу Discourse: ", print_r($result, true));
}
// Дополнительные параметры SSO, если необходимо
$sso_params = array();
$sso_params = apply_filters('wpdc_sso_params', $sso_params, $user_data);
} 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', '');
// Объединение всех групп в один массив
$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 {
// Обработка случаев, когда $user_id или роль не предоставлены
// Это можно логировать или обрабатывать иначе в зависимости от требований
// Пока просто запишем сообщение в лог
error_log("User ID или роль не предоставлены в callback user_registered.");
}
}
add_action('mepr-event-member-signup-completed', 'mepr_capture_new_member_signup_completed');
Теперь проблема в том, что пользователь не добавляется в группу Discourse, вот вывод кода:
=== Данные пользователя: ===
WP_User Object
(
[data] => stdClass Object
(
[ID] => 457
[user_login] => sibahmed
[user_pass] => $P$BTVeX1n6d40NtHBCiQqzSphMolH/hH0
[user_nicename] => sibahmed
[user_email] => sibahmed82@gmail.com
[user_url] =>
[user_registered] => 2024-07-30 17:35:51
[user_activation_key] =>
[user_status] => 0
[display_name] => sib ahmed
)
[ID] => 457
[caps] => Array
(
[subscriber] => 1
[browns] => 1
)
[cap_key] => wp_capabilities
[roles] => Array
(
[0] => subscriber
[1] => browns
)
[allcaps] => Array
(
[read] => 1
[level_0] => 1
[upload_files] => 1
[access_s2member_level0] => 1
[subscriber] => 1
[browns] => 1
)
[filter] =>
[site_id:WP_User:private] => 1
)
=== Назначена роль Browns: ===
WP_User Object
(
[data] => stdClass Object
(
[ID] => 457
[user_login] => sibahmed
[user_pass] => $P$BTVeX1n6d40NtHBCiQqzSphMolH/hH0
[user_nicename] => sibahmed
[user_email] => sibahmed82@gmail.com
[user_url] =>
[user_registered] => 2024-07-30 17:35:51
[user_activation_key] =>
[user_status] => 0
[display_name] => sib ahmed
[user_level] => 0
)
[ID] => 457
[caps] => Array
(
[browns] => 1
)
[cap_key] => wp_capabilities
[roles] => Array
(
[0] => browns
)
[allcaps] => Array
(
[read] => 1
[browns] => 1
)
[filter] =>
[site_id:WP_User:private] => 1
)
=== Группы уровня 1 s2member: ===
Member
=== Результат добавления в группу Discourse: ===
WP_Error Object
(
[errors] => Array
(
[wpdc_response_error] => Array
(
[0] => Неверный ответ получен от Discourse
)
)
[error_data] => Array
(
[wpdc_response_error] => Array
(
[http_code] => 404
[http_body] => {"errors":["Запрошенный URL или ресурс не найден."],"error_type":"not_found"}
)
)
[additional_data:protected] => Array
(
)
)
В данный момент я не занимаюсь разработкой на WordPress, поэтому не могу протестировать ваш код. Думаю, проблема здесь:
$result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
Если я правильно читаю логи, этот вызов возвращает:
[error_data] => Array
(
[wpdc_response_error] => Array
(
[http_code] => 404
[http_body] => {"errors":["The requested URL or resource could not be found."],"error_type":"not_found"}
)
Скорее всего, проблема в том, что на вашем сайте Discourse нет группы с названием "Member".
Не уверен, что вы делаете здесь, но я не думаю, что это связано с ошибкой:
// Дополнительные параметры SSO, если необходимы
$sso_params = array();
$sso_params = apply_filters('wpdc_sso_params', $sso_params, $user_data);
Привет @Haseeb_Ahmed, я перенёс эту тему в Development, так как суть её заключается в помощи с написанием кода на PHP. Возможно, на следующей неделе у меня будет время внимательнее посмотреть твой код.
Привет @simon, даже если я изменю название группы, ответ всё равно остаётся таким же:
=== s2member level 1 groups: ===
staff
=== Discourse Group Addition Result: ===
WP_Error Object
(
[errors] => Array
(
[wpdc_response_error] => Array
(
[0] => An invalid response was returned from Discourse
)
)
[error_data] => Array
(
[wpdc_response_error] => Array
(
[http_code] => 404
[http_body] => {"errors":["The requested URL or resource could not be found."],"error_type":"not_found"}
)
)
[additional_data:protected] => Array
(
)
)