Not to diminish from Damon's excellent answer — I have certainly used this technique in the past when needed. However, just to provide another option, keep in mind that you don't need to create a separate section/channel for profile information (and thus a plugin to keep them in sync, etc). You can also simply link to a user profile template by creating a route, using username
or id
(or any other unique identifiable user field or field combination) to identify the user, and then pull data from the custom fields you added to 'users'.
You will first want to create a route in settings to your user profile template. Notice the use of the 'slug' token, which will be available to the template as simply {{ slug }}
:
If the URL looks like this:
about/profiles/<slug> <-- where '<slug>' is the slug token
Load this template:
about/user-profile.twig
In your 'about' page template (i.e. the user's index page):
{% set users = craft.users.group('myGroup').limit(null) %}
<ul>
{% for user in users %}
<li><a href="{{ siteUrl }}about/profiles/{{ user.username|lower }}>{{ user.firstName }} {{ user.lastName }}</a></li>
{% endfor %}
</ul>
Then, in your 'about/user-profile' template:
{% set user = craft.users.username(slug).first %}
{% if user %}
<h1>{{ user.firstName }} {{ user.LastName }}<h1>
<p>{{ user.biography }}<p>
etc...
{% else %}
{% redirect '404' %}
{% endif %}