Ability to place custom fields in post header?

I have a use case where I would like to add the content from a custom user field next to my username in the post header:

not sure the best way to go about this?

very new to discourse and all its wonders

You can do a lot with the methods found in plugin-api.js.es6. To add content before or after the poster name widget, use the decorateWidget method. Use 'poster-name:after' as the name/type parameter.

Checking the result of the console.log statement from the following code will tell you what attributes are available:

<script type="text/discourse-plugin" version="0.8.27">
    api.decorateWidget('poster-name:after', helper => {
        console.log('attrs', helper.attrs);
    });
</script>

What you’ll see is that custom user fields are not available. To get access to them, you need to add the name of the user custom field to the public user custom fields Site Setting. Finding the name of the field can be tricky. One way to find the name is to go to /admin/customize/user_fields.json and look at the JSON for the page. You’ll see something like this:

{
"user_fields": [
{
"id": 1,
"name": "Terms of Service",
"description": "<a href=\"http://localhost:3000/tos\">I have read the tos</a>",
"field_type": "confirm",
"editable": true,
"required": false,
"show_on_profile": false,
"show_on_user_card": false,
"position": 1
},
{
"id": 4,
"name": "city",
"description": "your city",
"field_type": "text",
"editable": true,
"required": true,
"show_on_profile": false,
"show_on_user_card": false,
"position": 3
}
]
}

You can get the name of the field by appending “user_field_” to the field’s ID. So the “city” field on my site has the name “user_field_4”. Add the name to the public user custom fields Site Setting so that it is available in helper.attrs.

The following code will add the city field after the poster-name widget for users who have set that custom field. The field is wrapped in <span class="poster-user-field"></span> tags, so it can be styled with CSS.

<script type="text/discourse-plugin" version="0.8.27">
    api.decorateWidget('poster-name:after', helper => {
        const attrs = helper.attrs;
        if (attrs.userCustomFields && attrs.userCustomFields.user_field_4) {
            return helper.h('span.poster-user-field', helper.attrs.userCustomFields.user_field_4);
        }
    });
</script>

9 „Gefällt mir“

Thank you for this explanation, it’s something that I was also looking for. I’d say what’s missing in this explanation is how you insert the javascript snippet and where you do it. Do you need to create a separate plugin for it?

1 „Gefällt mir“

The code I posted above with the console.log statement that returns the post attributes, is meant to go in a theme or a theme component. For a general overview of developing Discourse themes, see Developer’s guide to Discourse Themes. For details about using the Plugin API methods in a theme, instead of a plugin, see https://meta.discourse.org/t/using-the-pluginapi-in-site-customizations/41281.

3 „Gefällt mir“

Does anybody knows how to do it via themes?

This is exaclty what i look for.

I want to be able to see it just like LinkedIn does (shows Job title):

image

Just like in this conversation here:

Hallo zusammen! Ich bin neu bei Discourse und habe diesen Thread gefunden, der GENAU dem entspricht, was ich versuche zu tun. Ich habe ein benutzerdefiniertes Feld, das direkt nach dem vollständigen Namen eines Benutzers in einem Beitrag angezeigt werden soll.

Ich bin nicht völlig unerfahren darin, Plugins für andere Webanwendungen zu erstellen, die ich in der Vergangenheit verwendet habe. Ich denke, mit genügend Geduld und Ausprobieren könnte ich herausfinden, wie man eine Theme-Komponente oder etwas Ähnliches zum Laufen bringt. Ich bin gerade dabei, den Tutorial zur Theme-Entwicklung durchzugehen.

Ich GLAUBE, ich habe den Namen des Feldes herausgefunden, das zur Einstellung “Öffentliche benutzerdefinierte Felder” hinzugefügt werden soll (ich glaube, die ID ist 2, also habe ich es auf user_field_2 gesetzt).

Ich habe mich auf meiner Discourse-Seite angemeldet und eine neue Theme-Komponente erstellt. Ich habe sie für alle installierten Themes aktiviert. Ich bin zu JS gegangen und habe den obigen Code kopiert (wobei ich user_field_4 in user_field_2 geändert habe). Es schien nichts zu bewirken, daher bin ich sicher, dass ich etwas falsch gemacht habe. Musste ich das irgendwo anders einfügen? Oder bin ich völlig auf dem Holzweg?

Ich weiß, dass dieser Beitrag etwas alt ist, daher könnte der Code veraltet sein. Gibt es eine Möglichkeit, dass mir jemand helfen kann? Ich werde mein Bestes tun, um alle Fragen zu beantworten oder benötigte Details bereitzustellen. DANKE!