Настройка пользовательских полей

Привет! Есть ли способ сопоставить поля пользователя в Discourse с метаданными пользователя в WordPress?

У меня есть форма регистрации в WordPress, которая сохраняет метаданные. Я хотел бы, чтобы эти данные копировались в Discourse при создании пользователя, отображались в профиле и, в идеале, автоматически заполняли редактор для категории «Знакомство».

Спасибо.

Кажется, я нашел, как это сделать, но после каждого обновления нужно вносить изменения в плагин WP Discourse:

https://meta.discourse.org/t/sso-settings-integration-between-wordpress-and-discourse-using-wp-plugin/49343/5

Было бы здорово, если бы @simon добавил это в настройки плагина — просто возможность сопоставлять имена пользовательских полей из WP с Discourse.

Я бы не стал вносить прямые изменения в код плагина, если вы не уверены в том, что делаете. Плагин WP Discourse создан так, чтобы его можно было расширять с помощью другого плагина или темы, используя хуки действий. Это позволяет настраивать плагин без внесения изменений, которые будут перезаписаны при обновлении.

Чтобы добавить данные в полезную нагрузку SSO, отправляемую в Discourse, используйте фильтр wpdc_sso_params. Функции, подключенные к этому фильтру, получают два параметра: $params (массив параметров SSO, передаваемых в Discourse) и $user (объект пользователя WordPress).

Пример использования фильтра приведен в этом сообщении:

Дайте знать, если у вас возникнут трудности с использованием фильтра для добавления ваших пользовательских данных профиля.

Спасибо! Есть ли какая-либо документация со всеми хуками, которые вы вызываете в плагине?
Спасибо

Нет, но она должна быть. Я скоро займусь этим.

Мне нужно написать плагин для Discourse, чтобы читать параметры SSO и сохранять их в полях пользователя, или эта функция уже реализована?

Вы можете обновлять пользовательские поля, созданные вами в Discourse, через SSO. Для этого не требуется плагин. Чтобы это сделать, вам нужно знать имя, которое Discourse использует в базе данных для пользовательского поля. Самый простой способ, который я знаю, — перейти на страницу «Администрирование / Настройка / Пользовательские поля» и загрузить JSON-версию этой страницы. Например: https://forum.example.com/admin/customize/user_fields.json

Данные в формате JSON на этой странице будут выглядеть примерно так:

{
user_fields: [
{
id: 12,
name: "News Letter",
description: "Send me a newsletter",
field_type: "confirm",
editable: false,
required: true,
show_on_profile: false,
show_on_user_card: false,
position: 3
},
{
id: 13,
name: "Company",
description: "Where do you work?",
field_type: "text",
editable: true,
required: false,
show_on_profile: true,
show_on_user_card: true,
position: 4
}
]
}

Пользовательские поля в Discourse именуются как user_field_<id_поля>. Это означает, что имя поля «News Letter» из приведённого выше примера — user_field_12, а имя поля «Company» — user_field_13. Используйте эту информацию для обновления полезной нагрузки SSO.

В качестве примера, с использованием фильтра wpdc_sso_params, о котором я упоминал в предыдущем посте, следующий код, добавленный в файл functions.php вашей темы, установит значение поля «Company» для всех пользователей в «acme» при входе через SSO. Замените my_namespace в имени функции на уникальный идентификатор для вашего сайта:

add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );
function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
	$sso_params['custom.user_field_13'] = 'acme';

	return $sso_params;
}

Чтобы добавить поля, основанные на данных пользователей WordPress с вашего сайта, используйте параметр $user функции для получения информации о ваших пользователях.

Работает отлично, ещё раз спасибо!