Как узнать, что пользователь Discourse не одобрен в WordPress?

Я хочу автоматически создавать пользователя в Discourse при новой регистрации в WordPress, но не хочу предоставлять им доступ, пока они не заполнят форму заявки.

Я могу использовать настройки «Синхронизация при входе» и «Требовать одобрения пользователей», чтобы решить большую часть этой задачи, но не знаю, как проверить, одобрен ли пользователь в Discourse.

Существует ли поле мета-данных пользователя WordPress, которое Discourse использует для хранения статуса одобрения пользователя в Discourse? Если нет, нужно ли мне использовать API для получения этой информации из Discourse?

Моя цель — показать кнопку на панели управления в WordPress с динамической ссылкой, которая меняется в зависимости от статуса одобрения.
Неодобренный пользователь — динамическая ссылка ведет на форму заявки в WordPress.
Одобренный пользователь — динамическая ссылка ведет на сообщество Discourse.

Я просмотрел несколько постов, но не нашел решения. Буду благодарен за помощь!

Я разобрался, как это реализовать, написав запрос для исследователя данных и вызвав его через API. Всё работает нормально, но теперь я выполняю вызов между двумя системами, что, очевидно, медленнее, чем если бы данные были сохранены в WordPress.

Если загрузка страницы будет медленной, я использую хук для самостоятельного сохранения данных об одобрении в пользовательском поле профиля. Прежде чем приступать к этому, было бы полезно узнать, делает ли это уже плагин WP-Discourse.

Привет @Himanshu_Singh, краткий ответ: плагин WP Discourse не хранит статус одобрения пользователя Discourse.

Рекомендую обратить внимание на действие wpdc_after_sync_sso, которое срабатывает после синхронизации записи пользователя, когда тот входит в WordPress.

Если добавить туда логирование, например:

function wpdc_after_sync_sso_callback($discourse_user, $user_id) {
    error_log(print_r($discourse_user, true));
}
add_action( 'wpdc_after_sync_sso', 'wpdc_after_sync_sso_callback', 10, 2 );

то вы увидите, что объект discourse_user содержит статус одобрения пользователя, например:

stdClass Object
(
    [id] => 43
    [username] => angus4
    [name] => angus4
    ...
    [approved] =>
)

Эту информацию вы можете сохранить самостоятельно в пользовательском поле пользователя и использовать для создания вашей динамической ссылки.

Спасибо, Ангус. Ваше решение элегантно. Я пошёл немного более длинным путём —

  1. Я использовал API Data Explorer для получения статуса одобрения.
  2. Связал его с хуком template_redirect, чтобы проверять статус одобрения при входе.
  3. Обновлял пользовательское поле в WordPress при входе.
  4. Предотвратил повторный запуск API, если пользователь уже одобрен.
add_action('template_redirect', 'update_discourse_approval_status', 1);
function update_discourse_approval_status () {
  
  global $post;
  $post_slug = $post->post_name;
  if ($post_slug == 'page-slug'){
    $current_user_id = get_current_user_id();
	$approval_status_stored_in_wp = get_user_meta($current_user_id, 'custom-field', true);
    if( $approval_status_stored_in_wp != 1) {
      $user_discourse_id = (int)get_user_meta($current_user_id,'discourse_sso_user_id')[0];
	// учётные данные API,
	$api_key = 'api-key';
	$api_username = 'name';

	$discourse_user_param_string = 'params={"user_param":';
	$discourse_user_param_string .= '"';
	$discourse_user_param_string .= $user_discourse_id;
	$discourse_user_param_string .= '"}';

	// заголовок обязателен для API Discourse.
	$headers = array("Content-Type: multipart/form-data;","Api-Key:$api_key","Api-Username:$api_username",);

	$url = 'https://community.showprowess.com/admin/plugins/explorer/queries/<query-number>/run';
	$ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $discourse_user_param_string);
    $result = curl_exec( $ch );

	if ( curl_errno( $ch ) !== 0 ) {
    // Обработка ошибки, вызов curl_close( $ch ) и возврат.
	echo 'error';
	curl_close ($ch);
	return;
	}

	curl_close( $ch );

	$decoded_result = json_decode( $result, true );

	$user_approved = $decoded_result['rows'][0][0];
	$updated = update_user_meta( $current_user_id, 'custom-field', $user_approved);
    } 
  } // закрыть условие проверки данных в пользовательском поле
} // закрыть условие проверки правильной страницы
          
?>